BitCoin全攻略二
我们看下刚刚写的代码
package main
import "fmt"
type Block struct {
//1.前区块哈希值
PrevBlockHash []byte
//2.当前区块的哈希
Hash []byte
//3.数据
Data []byte
}
func NewBlock(data []byte, prevBlockHash []byte) *Block {
block := Block{
PrevBlockHash: prevBlockHash,
Hash: nil,
Data: data,
}
return &block
}
func main() {
block := NewBlock([]byte("hello world"), []byte{})
fmt.Println(block)
}
我们看下NewBlock方法
这个方法是创建区块
然后我们现在只设置了前区块哈希和数据data
当前区块的hash值给的是nil
所以现在我们来计算下当前区块的hash值
我们现在的区块只有3个属性
1.PrevBlockHash
2.Data
3.Hash
而当前的hash值是根据另外2个属性计算出来的
所以我们根据PrevBlockHash和Data来计算出
当前区块的hash值
所以我们来写一个方法
计算hash值
func getHash(block *Block) []byte {
var info []byte
info = append(info, block.Data...)
info = append(info, block.PrevBlockHash...)
hash := sha256.Sum256(info)
return hash[:]
}
那么获取到hash值之后
要赋给当前区块
hash := getHash(&block)
block.Hash = hash
然后我们来看下完整代码
type Block struct {
//1.前区块哈希值
PrevBlockHash []byte
//2.当前区块的哈希
Hash []byte
//3.数据
Data []byte
}
func NewBlock(data []byte, prevBlockHash []byte) *Block {
block := Block{
PrevBlockHash: prevBlockHash,
Data: data,
Hash: nil,
}
hash := getHash(&block)
block.Hash = hash
return &block
}
func main() {
block := NewBlock([]byte("hello world"), []byte{})
fmt.Println(block)
fmt.Printf("前一区块的hash值为: %x\n", block.PrevBlockHash)
fmt.Printf("当前区块的hash值为: %x\n", block.Hash)
fmt.Printf("当前区块的data为: %s\n", block.Data)
}
func getHash(block *Block) []byte {
var info []byte
info = append(info, block.Data...)
info = append(info, block.PrevBlockHash...)
hash := sha256.Sum256(info)
return hash[:]
}