区块链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会根据时间改变了。

posted @ 2020-12-01 19:42  北漂的尘埃  阅读(133)  评论(0编辑  收藏  举报