区块的结构:
1、在区块链中,存储有效信息的是区块
2、Timestamp是当前时间戳,也就是创建区块的时间
3、PrevBlockHash存储前一个区块的哈希值
4、Data是区块存储的实际有效的信息
5、Hash是当前区块的哈希值
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、快速的获取链上的最新块,并且高效的通过哈希来校验一个块
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()}} }
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