基本原型
区块的结构:
1、在区块链中,存储有效信息的是区块
2、Timestamp是当前时间戳,也就是创建区块的时间
3、PrevBlockHash存储前一个区块的哈希值
4、Data是区块存储的实际有效的信息
5、Hash是当前区块的哈希值
block.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | 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{}) } 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() } } |
区块组成链式结构:
1、区块链是有着特定结构的数据库,一个有序向后连接的列表
2、区块按照插入顺序进行存储,每个块都被链接到前一个块
3、快速的获取链上的最新块,并且高效的通过哈希来校验一个块
blockchain.go
main.go
打印结果:
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
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步