您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么用go語言區塊鏈實戰實現簡單的區塊與區塊鏈”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
字節 | 字段 | 說明 |
---|---|---|
4 | 版本 | 區塊版本號,表示本區塊遵守的驗證規則 |
32 | 父區塊頭哈希值 | 前一區塊的Merkle樹根的哈希值,同樣采取SHA256計算 |
32 | Merkle根 | 該區塊中交易的Merkle樹根的哈希值,同樣采用SHA256計算 |
4 | 時間戳 | 該區塊產生的近似時間,精確到秒的UNIX時間戳,必須嚴格大于前11各區塊的時間的中值,同時全節點也會拒接那些超過自己兩個小時的時間戳的區塊 |
4 | 難度目標 | 該區塊工作量證明算法的難度目標,已經使用特定算法編碼 |
4 | Nonce | 未來找到滿足難度目標所設定的隨機數,為了解決32為隨機數在算力飛升的情況下不夠用的問題,規定時間戳和coinbase交易信息均改變,以此擴展nonce的位數 |
注意:區塊不存儲hash值,節點接受區塊后獨立計算并存儲在本地。
1.定義一個區塊的結構Block
a.區塊頭:6個字段
b.區塊體:字符串表示data
2.提供一個創建區塊的方法
NewBlock(參數)
定義一個區塊鏈結構BlockChain
Block數組
提供一個創建BlockChain()的方法
NewBlockChain()
提供一個添加區塊的方法
AddBlock(參數)
block.go文件
package main import ( "bytes" "crypto/sha256" "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: 1, PerBlockHash: prevBlockHash, //Hash: []byte{}, //區塊不存儲hash值,節點接受區塊后獨立計算并存儲在本地。 MerKelRoot: []byte{}, TimeStamp: time.Now().Unix(), Bits: 1, Nonce: 1, Data: []byte(data), } block.SetHash() //填充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{}) }
blockChain.go文件
package main /* 1. 定義一個區塊鏈結構BlockChain Block數組 */ type BlockChain struct { blocks []*Block } /* 2. 提供一個創建BlockChain()的方法 NewBlockChain() */ func NewBlockChain() *BlockChain { block := NewGensisBlock() return &BlockChain{blocks:[]*Block{block}} //創建只有一個元素的區塊鏈,初始化 } /* 3. 提供一個添加區塊的方法 AddBlock(參數) */ func (bc *BlockChain)AddBlock(data string) { PerBlockHash := bc.blocks[len(bc.blocks)-1].Hash //這一個區塊的哈希是前一塊的哈希值 block := NewBlock(data,PerBlockHash) bc.blocks = append(bc.blocks,block) }
utils.go文件
package main import ( "bytes" "encoding/binary" "fmt" "os" ) func IntToByte(num int64) []byte { //func Write(w io.Writer, order ByteOrder, data interface{}) error { var buffer bytes.Buffer err := binary.Write(&buffer, binary.BigEndian, num) CheckErr("IntToByte",err) return buffer.Bytes() } func CheckErr(position string,err error) { if err != nil { fmt.Println("error ,pos:",position,err) os.Exit(1) } }
main.go文件
package main import "fmt" func main() { bc := NewBlockChain() bc.AddBlock("A send B 1BTC") bc.AddBlock("B send C 1BTC") for _,block := range bc.blocks { fmt.Printf("Version : %d\n",block.Version) fmt.Printf("PerBlockHash : %x\n",block.PerBlockHash) fmt.Printf("Hash : %x\n",block.Hash) fmt.Printf("MerKelRoot : %x\n",block.MerKelRoot) fmt.Printf("TimeStamp : %d\n",block.TimeStamp) fmt.Printf("Bits : %d\n",block.Bits) fmt.Printf("Nonce : %d\n",block.Nonce) fmt.Printf("Data : %s\n",block.Data) } }
執行結果
“怎么用go語言區塊鏈實戰實現簡單的區塊與區塊鏈”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。