持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
区块链POW共识算法
区块链分布式系统,共识算法系统是它的灵魂,pow也就是工作量证明,证明你做过一定量的工作。(按劳分配,拼算力)
区块定义与数据串行化
在我们实现pow之前,需要对区块链的基本架子先搭起来(相当于有一个工作目标),我们可以简化一下比特币的基本结构,写一个最简单的区块数据结构,再使用切片来存储产生的区块,使用hash将它们联系起来。 代码实现:
1、定义block结构
创建 block.go文件 go type Block struct { Timestamp int64 //时间戳 Data []byte //数据域 PrevBlockHash []byte //前一区块hash值 Hash []byte //当前区块hash }
2、区块计算hash值
实现hash计算功能 go //区块设置内部hash方法 func (b *Block)SetHash(){ //将时间戳转换为[]byte timestamp:=[]byte(strconv.FormatInt(b.Timestamp,10)) //将前一区块的hash、交易信息、时间戳联合到一起 headers:=bytes.Join([][]byte{b.PrevBlockHash,b.Data,timestamp},[]byte{}) //计算本块hash值 hash:=sha256.Sum256(headers) b.Hash=hash[:] }
3、创世块创建
```go //创建Block,返回Block指针 func NewBlock(data string,PrevBlockHash []byte)*Block{ //构造block block:=&Block{time.Now().Unix(),[]byte(data),PrevBlockHash,[]byte{}} //设置hash block.SetHash() return block }
//创世块创建,返回创世块Block指针 func NewGenesisBlock()*Block{ return NewBlock("创世块",[]byte{})
} ```
4、区块链功能实现
区块链使用一个Block指针类型的切片来实现
创建blockchain.go文件 go //区块链:一个区块的指针切片 type Blockcahin struct { Blocks []*Block } //为BlockChain增加AddBlock方法(向切片增加一个指针) //增加区块 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函数,通过创世块创建并初始化区块链。 func NewBlockchain()*Blockcahin { return &Blockcahin{[]*Block{NewGenesisBlock()}} }
5、测试与使用
```go package main import ( "fmt" )
func main() { //初始化 bc:=NewBlockchain() //创建块记录 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目录下,需要设置go mod
最后看目录结构:文章来源:https://www.uudwc.com/A/6zjqN/
文章来源地址https://www.uudwc.com/A/6zjqN/