基本原型
区块的结构:
1、在区块链中,存储有效信息的是区块
2、Timestamp是当前时间戳,也就是创建区块的时间
3、PrevBlockHash存储前一个区块的哈希值
4、Data是区块存储的实际有效的信息
5、Hash是当前区块的哈希值
block.go
package core
import (
"time"
"strconv"
"bytes"
"crypto/sha256"
)
//Block keeps block header
type Block struct {
Timestamp int64 //区块创建的时间
Data []byte //区块包含的数据
PrevBlockHash []byte //前一个区块的哈希值
Hash []byte //区块自身的哈希值,用于校验区块数据有效
}
//NewBlock create and returns Block
func NewBlock(data string, prevBlockHash []byte) *Block {
block := &Block{
Timestamp:time.Now().Unix(),
Data: []byte(data),
PrevBlockHash: prevBlockHash,
Hash: []byte{},
}
block.SetHash()
return block
}
func (b *Block) SetHash() {
timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp},[]byte{})
hash := sha256.Sum256(headers)
b.Hash = hash[:]
}
//NewGenesisBlock create and returns genesis Block
func NewGenesisBlock() *Block {
return NewBlock("Genesis Block", []byte{})
}
区块组成链式结构:
1、区块链是有着特定结构的数据库,一个有序向后连接的列表
2、区块按照插入顺序进行存储,每个块都被链接到前一个块
3、快速的获取链上的最新块,并且高效的通过哈希来校验一个块
blockchain.go
package core
//BlockChain keeps a sequence of Blocks
type BlockChain struct {
Blocks []*Block
}
//AddBlock save provided data as a block in the blockchain
func (bc *BlockChain)AddBlock(data string) {
prevBlock := bc.Blocks[len(bc.Blocks)-1]
newBlock := NewBlock(data, prevBlock.Hash)
bc.Blocks = append(bc.Blocks, newBlock)
}
//NewBlockChain create a new BlockChain with genesis block
func NewBlockChain() *BlockChain {
return &BlockChain{[]*Block{NewGenesisBlock()}}
}
main.go
package main
import (
"core"
"fmt"
)
func main() {
bc := core.NewBlockChain()
bc.AddBlock("Send 1 BC to Ivan")
bc.AddBlock("Send more BC to Ivan")
for _,block := range bc.Blocks {
fmt.Printf("Prev hash: %x\n", block.PrevBlockHash)
fmt.Printf("Data: %s\n", block.Data)
fmt.Printf("Hash: %x\n", block.Hash)
fmt.Println()
}
}
打印结果:
Prev hash:
Data: Genesis Block
Hash: 4577853922f097265b130464cb5392785b2fd045b724d9525dad859a629e4b0d
Prev hash: 4577853922f097265b130464cb5392785b2fd045b724d9525dad859a629e4b0d
Data: Send 1 BC to Ivan
Hash: e8bc5d03b38799140e32d662376731705f716c0443e1a17c1a45782fa1531c81
Prev hash: e8bc5d03b38799140e32d662376731705f716c0443e1a17c1a45782fa1531c81
Data: Send more BC to Ivan
Hash: 790c1a271f5a138aa2093cd236ffeadb5d6d905f841ceccb04606e3aec5b2735

浙公网安备 33010602011771号