GO语言实现区块链POW共识算法- -区块定义与数据串行化

412 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

区块链POW共识算法

区块链分布式系统,共识算法系统是它的灵魂,pow也就是工作量证明,证明你做过一定量的工作。(按劳分配,拼算力)

区块定义与数据串行化

在我们实现pow之前,需要对区块链的基本架子先搭起来(相当于有一个工作目标),我们可以简化一下比特币的基本结构,写一个最简单的区块数据结构,再使用切片来存储产生的区块,使用hash将它们联系起来。 代码实现:

1、定义block结构

创建 block.go文件

type Block struct {
   Timestamp int64  //时间戳
   Data      []byte //数据域
   PrevBlockHash []byte //前一区块hash值
   Hash     []byte   //当前区块hash
}

2、区块计算hash值

实现hash计算功能

//区块设置内部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、创世块创建

//创建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文件

//区块链:一个区块的指针切片
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、测试与使用

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

最后看目录结构:

image.png