Version 2
定義一個工作量證明的結構ProofOfWork
block
目标值
提供一個創造PoW的方法
NewProofOfWork(參數)
提供一個計算哈希值的方法
Run()
提供一個校驗函數
IsValid()
結構目錄
block.gopackage 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{})
}