区块链V1版本实现之六
部分代码(补充区块字段):
1 //定义区块结构 2 type Block struct { 3 //区块版本号 4 Version uint64 5 //前区块哈希 6 PrevBlockHash [] byte 7 //先填写为空,后续v4的时候使用 8 MerKleRoot [] byte 9 //从1970.1.1至今的秒数 10 TimeStamp uint64 11 //挖矿难度值,v2时使用 12 Difficulity uint64 13 //随机数,挖矿找的就是这个随机数 14 Nonce uint64 15 //数据,目前使用字节流,v4开始使用交易代替 16 Data [] byte 17 //当前区块哈希,区块中本来不存在,为了方便所以添加进来 18 Hash [] byte 19 }
部分代码(更新NewBlock函数):
1 //创建区块,对Block的每一个字段填充数据 2 func NewBlock(data string, prevBlockHash []byte) *Block{ 3 block := Block{ 4 Version:00, 5 6 PrevBlockHash: prevBlockHash, 7 8 MerKleRoot:[]byte{}, 9 10 TimeStamp:uint64(time.Now().Unix()), 11 //随便写,v2再调整 12 Difficulity:10, 13 //随便写,v2再调整 14 Nonce:10, 15 16 Data: []byte(data), 17 18 Hash: []byte{}, //先填充为空 19 } 20 21 //V1之二版本添加实现hash输出 22 block.SetHash() 23 24 return &block 25 }
部分代码(更新SetHash函数):
1 //为了生成区块哈希,实现一个简单的函数,来计算哈希值,没有随机值,没有难度值 2 func (block *Block) SetHash() { 3 var data []byte 4 //类型是byte,而数据结构是uint64,所以构建一个工具类,将uint64转换为byte 5 data = append(data, uintToByte(block.Version)...) 6 data = append(data, block.PrevBlockHash...) 7 data = append(data, block.MerKleRoot...) 8 data = append(data, uintToByte(block.TimeStamp)...) 9 data = append(data, uintToByte(block.Difficulity)...) 10 data = append(data, uintToByte(block.Nonce)...) 11 data = append(data, block.Data...) 12 13 hash /* [32]byte */:= sha256.Sum256(data) 14 block.Hash = hash[:] 15 }
部分代码(更新SetHash函数):
创建新文件utils.go,添加内容如下:
1 package main 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "log" 7 ) 8 9 //这是一个工具函数文件,将uint转换成byte 10 func uintToByte(num uint64) []byte { 11 //使用binary.Write来进行编码 12 var buffer bytes.Buffer 13 14 //编码要进行错误检查 15 err := binary.Write(&buffer,binary.BigEndian,num) 16 17 if err != nil { 18 log.Panic(err) 19 } 20 return buffer.Bytes() 21 } 22 /** 23 -binary序列化 24 ·binary.Write 25 err:=binary.Write(&buffer,binary.BigEndian,num) 26 这个函数的目的是将任意的数据转换成byte字节流,这个过程叫做序列化 27 ·binary.Read同样,可以通过binary.Read方式进行反序列化,从字节流转回原始结构。 28 binary.Read(buf,binary.LittleEndian,&num) 29 ·特点 30 特点:高效。 31 缺点:如果在编码的结构中有不确定长度的类型,那么会报错。这时候可以使用gob来编码。 32 binary.BigEndian 33 意思是大端对齐 34 */
显示效果:
Hash会根据时间改变了。