區塊鏈V1版本實現之六
阿新 • • 發佈:2020-12-01
部分程式碼(補充區塊欄位):
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 &block25 }
部分程式碼(更新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會根據時間改變了。