Version 2
定义一个工作量证明的结构ProofOfWork
block
目标值
提供一个创造PoW的方法
NewProofOfWork(参数)
提供一个计算哈希值的方法
Run()
提供一个校验函数
IsValid()
结构目录
block.go
package main import ( "time" ) /* 1.定义一个区块的结构Block a.区块头:6个字段 b.区块体:字符串表示data */ //区块 type Block struct { Version int64 //版本 PerBlockHash []byte //前一个区块的hash值 Hash []byte //当前区块的hash值,是为了简化代码 MerKelRoot []byte //梅克尔根 TimeStamp int64 //时间抽 Bits int64 //难度值 Nonce int64 //随机值 //区块体 Data []byte //交易信息 } /* 提供一个创建区块的方法 NewBlock(参数) */ func NewBlock(data string ,prevBlockHash []byte) *Block { var block Block block = Block{ Version: 2, PerBlockHash: prevBlockHash, //Hash: []byte{}, //区块不存储hash值,节点接受区块后独立计算并存储在本地。 MerKelRoot: []byte{}, TimeStamp: time.Now().Unix(), Bits: targetBits, Nonce: 0, Data: []byte(data), } // block.SetHash() //填充Hash PoW:= NewProofOfWork(&block) nonce , hash :=PoW.Run() block.Nonce=nonce block.Hash=hash return &block } /* func (block *Block) SetHash() { // 源码里面是要传二维切片 func Join(s [][]byte, sep []byte) []byte tmp :=[][]byte{ IntToByte(block.Version), block.PerBlockHash, block.MerKelRoot, IntToByte(block.TimeStamp), IntToByte(block.Bits), IntToByte(block.Nonce), } data:=bytes.Join(tmp,[]byte{}) //之后再计算hash hash := sha256.Sum256(data) block.Hash = hash[:] //变切片 } */ //创始块 func NewGensisBlock() *Block{ return NewBlock("Genesis Block!",[]byte{}) }