1. 程式人生 > 實用技巧 >區塊鏈V1版本實現之六

區塊鏈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會根據時間改變了。