持續(xù)創(chuàng)作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰(zhàn)」的第9天,點擊查看活動詳情
區(qū)塊鏈POW共識算法
區(qū)塊鏈分布式系統(tǒng),共識算法系統(tǒng)是它的靈魂,pow也就是工作量證明,證明你做過一定量的工作。(按勞分配,拼算力)
區(qū)塊定義與數(shù)據(jù)串行化
在我們實現(xiàn)pow之前,需要對區(qū)塊鏈的基本架子先搭起來(相當于有一個工作目標),我們可以簡化一下比特幣的基本結(jié)構(gòu),寫一個最簡單的區(qū)塊數(shù)據(jù)結(jié)構(gòu),再使用切片來存儲產(chǎn)生的區(qū)塊,使用hash將它們聯(lián)系起來。 代碼實現(xiàn):
1、定義block結(jié)構(gòu)
創(chuàng)建 block.go文件 go type Block struct { Timestamp int64 //時間戳 Data []byte //數(shù)據(jù)域 PrevBlockHash []byte //前一區(qū)塊hash值 Hash []byte //當前區(qū)塊hash }
2、區(qū)塊計算hash值
實現(xiàn)hash計算功能 go //區(qū)塊設(shè)置內(nèi)部hash方法 func (b *Block)SetHash(){ //將時間戳轉(zhuǎn)換為[]byte timestamp:=[]byte(strconv.FormatInt(b.Timestamp,10)) //將前一區(qū)塊的hash、交易信息、時間戳聯(lián)合到一起 headers:=bytes.Join([][]byte{b.PrevBlockHash,b.Data,timestamp},[]byte{}) //計算本塊hash值 hash:=sha256.Sum256(headers) b.Hash=hash[:] }
3、創(chuàng)世塊創(chuàng)建
```go //創(chuàng)建Block,返回Block指針 func NewBlock(data string,PrevBlockHash []byte)*Block{ //構(gòu)造block block:=&Block{time.Now().Unix(),[]byte(data),PrevBlockHash,[]byte{}} //設(shè)置hash block.SetHash() return block }
//創(chuàng)世塊創(chuàng)建,返回創(chuàng)世塊Block指針 func NewGenesisBlock()*Block{ return NewBlock("創(chuàng)世塊",[]byte{})
} ```
4、區(qū)塊鏈功能實現(xiàn)
區(qū)塊鏈使用一個Block指針類型的切片來實現(xiàn)
創(chuàng)建blockchain.go文件 go //區(qū)塊鏈:一個區(qū)塊的指針切片 type Blockcahin struct { Blocks []*Block } //為BlockChain增加AddBlock方法(向切片增加一個指針) //增加區(qū)塊 func (bc Blockcahin)AddBlock(data string) { //獲取前一塊信息 PrevBlock:=bc.Blocks[len(bc.Blocks)-1] newBlock:=NewBlock(data,PrevBlock.Hash) bc.Blocks=append(bc.Blocks,newBlock) } //準備NewBlockchain函數(shù),通過創(chuàng)世塊創(chuàng)建并初始化區(qū)塊鏈。 func NewBlockchain()*Blockcahin { return &Blockcahin{[]*Block{NewGenesisBlock()}} }
5、測試與使用
```go package main import ( "fmt" )
func main() { //初始化 bc:=NewBlockchain() //創(chuàng)建塊記錄 bc.AddBlock("小明給我1ETH") bc.AddBlock("小芳給了我2ETH") //遍歷 for _, block := range bc.Blocks { fmt.Printf("prev,hash:%x\n",block.PrevBlockHash) fmt.Printf("Data:%s\n",block.Data) fmt.Printf("Hash:%x\n",block.Hash) fmt.Println()
} } ```
注意:如果不在GOPATH目錄下,需要設(shè)置go mod
最后看目錄結(jié)構(gòu):文章來源:http://www.zghlxwxcb.cn/news/detail-718927.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-718927.html
到了這里,關(guān)于GO語言實現(xiàn)區(qū)塊鏈POW共識算法- -區(qū)塊定義與數(shù)據(jù)串行化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!