golang区块链开发002-初始化区块链与pow挖矿实现

author author     2022-12-17     209

关键词:

目录:

一.初始化区块链

1.代码结构

2. 定义区块结构与方法

3. 定义区块链结构与方法

4. 帮助库代码

5. 测试生成区块与初始化区块链

6. 测试代码

二. POW挖矿实现

1.代码结构

2. 定义pow算法实现

3. 修改区块的生成方式(从自定义到挖矿)

4. 测试代码,测试挖矿

5.验证区块有效性


一.初始化区块链

1. 代码结构

技术分享图片


Block.go :定义区块结构与方法

BlockChain.go :定义区块链结构与方法

help.go :将常用代码块进行封装,形成帮助库

main.go:测试代码


2.定义区块结构与方法


package BLC

import (
   "time"
   "strconv"
   "bytes"
   "crypto/sha256"
)

//定义区块
type Block struct 
   //1.区块高度,也就是区块的编号,第几个区块
   Height int64
   //2.上一个区块的Hash值
   PreBlockHash []byte
   //3.交易数据(最终都属于transaction 事务)
   Data []byte
   //4.创建时间的时间戳
   TimeStamp int64
   //5.当前区块的Hash值
   Hash []byte
   //6.Nonce 随机数,用于验证工作量证明
   Nonce int64


//定义区块生成Hash的方法
func (block *Block) SetHash() 
   //1.将Height 转换为字节数组 []byte
   heightBytes := IntToHex(block.Height)

   //2.将TimeStamp 转换为字节数组 []byte
   //2.1 将Int64的TimeStamp 转换成二进制
   timeString := strconv.FormatInt(block.TimeStamp, 2)
   //2.2 将二进制字符串转成字节数组
   timeBytes := []byte(timeString)

   //3.拼接所有属性,形成一个二维的byte数组
   blockBytes := bytes.Join([][]byteheightBytes, block.PreBlockHash, block.Data, timeBytes, block.Hash, []byte)
   //4.生成Hash
   hash := sha256.Sum256(blockBytes)
   block.Hash = hash[:]


//1. 创建新的区块
func NewBlock(data string, height int64, PreBlockHash []byte) *Block 
   //创建区块
   block := &Block
      height,
      PreBlockHash,
      []byte(data),
      time.Now().Unix(),
      nil,
      0,
   
   //设置Hash
   block.SetHash()
   return block



//2.生成创世区块
func CreateGenesisBlock(data string) *Block 

   return NewBlock(data, 1, []byte0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)



3.定义区块链与方法

package BLC

type BlockChain struct 
   Blocks []*Block //存储有序的区块



func (blc *BlockChain)AddBlockChain(data string,height int64,preHash []byte)
   //创建新区块
   newBlock := NewBlock(data,height,preHash)
   //往链中添加区块
   blc.Blocks=append(blc.Blocks,newBlock)




//1.创建带有创世区块的区块链
func CreateBlockChainWithGenesisBlock() *BlockChain 

   //创建创世区块
   genesisBlock := CreateGenesisBlock("Genesis Data..")
   //返回区块链对象
   return &BlockChain[]*BlockgenesisBlock


4.帮助代码库

package BLC

import (
   "bytes"
   "encoding/binary"
   "log"
)

//将int64转换为字节数组
func IntToHex(num int64) []byte 
   buff := new(bytes.Buffer)
   err := binary.Write(buff, binary.BigEndian, num)
   if err != nil 
      log.Panic(err)
   
   return buff.Bytes()


5.测试代码

package main

import (
   "publicChain/BLC"
   "fmt"
)

func main() 

   //创建创世区块
   blockChain := BLC.CreateBlockChainWithGenesisBlock()

   //创建新的区块
   blockChain.AddBlockChain("Send $100 to Bruce", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)
   blockChain.AddBlockChain("Send $200 to Apple", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)
   blockChain.AddBlockChain("Send $300 to Alice", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)
   blockChain.AddBlockChain("Send $400 to Bob", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)

   fmt.Printf("创建的区块链为:	%v
", blockChain)
   fmt.Printf("区块链存储的区块为:	%v
", blockChain.Blocks)
   fmt.Printf("第二个区块的数据信息(交易信息)为:	%v
", string(blockChain.Blocks[1].Data))


结果显示


二. POW挖矿实现

1.代码结构


技术分享图片

多出的ProofOfWork.go用于实现挖矿


2. 定义pow算法实现

ProofOfWork.go


package BLC

import (
   "math/big"
   "bytes"
   "crypto/sha256"
   "fmt"
   "time"
)

type ProofOfWork struct 
   Block  *Block   //当前要验证的区块
   target *big.Int //大数存储,区块难度


//数据拼接,返回字节数组
func (pow *ProofOfWork) prePareData(nonce int) []byte 

   data := bytes.Join(
      [][]byte
         pow.Block.PreBlockHash,
         pow.Block.Data,
         IntToHex(pow.Block.TimeStamp),
         IntToHex(int64(targetBit)),
         IntToHex(int64(nonce)),
         IntToHex(int64(pow.Block.Height)),
      ,
      []byte,
   )
   return data


//256位Hash里面至少要有16个零0000 0000 0000 0000
const targetBit = 16

func (proofOfWork *ProofOfWork) Run(num int64) ([]byte, int64) 

   //3.判断Hash的有效性,如果满足条件循环体

   nonce := 0
   var hashInt big.Int //存储新生成的hash值
   var hash [32]byte

   for 
      //1. 将Block的属性拼接成字节数组
      databytes := proofOfWork.prePareData(nonce)

      //2.生成Hash
      hash = sha256.Sum256(databytes)
      fmt.Printf("挖矿中..%x
", hash)
      //3. 将hash存储至hashInt
      hashInt.SetBytes(hash[:])


      //4.判断hashInt是否小于Block里面的target
      // Cmp compares x and y and returns:
      //
      //   -1 if x <  y
      //    0 if x == y
      //   +1 if x >  y
      //需要hashInt(y)小于设置的target(x)
      if proofOfWork.target.Cmp(&hashInt) == 1 
         //fmt.Println("挖矿成功", hashInt)
         fmt.Printf("第%d个区块,挖矿成功:%x
",num,hash)
         fmt.Println(time.Now())
         time.Sleep(time.Second * 2)
         break

      

      nonce ++

   

   return hash[:], int64(nonce)



//创建新的工作量证明对象
func NewProofOfWork(block *Block) *ProofOfWork 
   /*1.创建初始值为1的target
   0000 0001
   8 - 2
   */

   target := big.NewInt(1)

   //2.左移256-targetBit
   target = target.Lsh(target, 256-targetBit)

   return &ProofOfWorkblock, target




3. 修改区块的生成方式(从自定义到挖矿)

Block.go

package BLC

import (
   "time"
)

//定义区块
type Block struct 
   //1.区块高度,也就是区块的编号,第几个区块
   Height int64
   //2.上一个区块的Hash值
   PreBlockHash []byte
   //3.交易数据(最终都属于transaction 事务)
   Data []byte
   //4.创建时间的时间戳
   TimeStamp int64
   //5.当前区块的Hash值
   Hash []byte
   //6.Nonce 随机数,用于验证工作量证明
   Nonce int64


//1. 创建新的区块
func NewBlock(data string, height int64, PreBlockHash []byte) *Block 
   //创建区块
   block := &Block
      height,
      PreBlockHash,
      []byte(data),
      time.Now().Unix(),
      nil,
      0,
   
   //调用工作量证明的方法,并且返回有效的Hash和Nonce值
   //创建pow对象
   pow := NewProofOfWork(block)
   //挖矿验证
   hash, nonce := pow.Run(height)

   block.Hash = hash[:]
   block.Nonce = nonce
   return block



//2.生成创世区块
func CreateGenesisBlock(data string) *Block 

   return NewBlock(data, 1, []byte0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)


4. 测试代码,测试挖矿

main.go


package main

import (
   "publicChain/part2-工作量证明/BLC"
   "fmt"
)

func main() 

   fmt.Println("开始挖矿")
   //创建创世区块
   blockChain := BLC.CreateBlockChainWithGenesisBlock()

   //创建新的区块
   blockChain.AddBlockChain("Send $100 to Bruce", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)

   blockChain.AddBlockChain("Send $200 to Apple", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)

   blockChain.AddBlockChain("Send $300 to Alice", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)

   blockChain.AddBlockChain("Send $400 to Bob", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)

   fmt.Printf("创建的区块链为:	%v
", blockChain)
   fmt.Printf("区块链存储的区块为:	%v
", blockChain.Blocks)
   fmt.Printf("第二个区块的数据信息(交易信息)为:	%v
", string(blockChain.Blocks[1].Data))
   fmt.Printf("第二个区块的随机数为:	%v
", blockChain.Blocks[1].Nonce)

测试结果

技术分享图片


共计对五个区块进行挖矿,结果如上

5.验证区块有效性 

ProofOfWork.go


//判断挖矿得到的区块是否有效
func (proofOfWork *ProofOfWork) IsValid() bool 
   //1.proofOfWork.Block.Hash
   //2.proofOfWork.Target
   var hashInt big.Int

   hashInt.SetBytes(proofOfWork.Block.Hash)

   if proofOfWork.target.Cmp(&hashInt) == 1 
      return true
   
   return false

测试代码:

main.go

//通过POW挖出新的区块block
block := BLC.NewBlock("Send $500 to Tom", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)
//手动将该区块添加至区块链中
blockChain.Blocks = append(blockChain.Blocks, block)
//创建一个工作量证明对象
proofOfWork := BLC.NewProofOfWork(block)
//判断该区块是否合法有效
fmt.Println(proofOfWork.IsValid())

测试结果:


技术分享图片

第六个区块是我们新创建的区块,返回值为true,验证有效


参考资料:

区块链共识算法-POW: https://www.jianshu.com/p/b23cbafbbad2 


从零开发区块链应用--golang网络请求(代码片段)

文章目录一、http请求简介二、初始化客户端三、golang发起GET请求3.1GET请求方法3.2基本的GET请求3.3带参数的GET请求四、golang发起POST请求4.1POST请求方法4.2不带参数的POST请求4.3不带参数的POST请求五、小结5.1HTTP协议请求方法5.2POST和GE... 查看详情

golang区块链开发的视频教程推荐

目前网上关于golang区块链开发的资源很少,以太坊智能合约相关的课程倒是很多,可能是由于前者的难度比后者难度大,课程开发需要投入更多精力。搜了一圈之后没结果,我就直接去之前没覆盖的视频网站找资源,包括慕课网... 查看详情

区块链与比特币

  (1)区块链入门  http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html(2)比特币视频 https://www.bilibili.com/video/av12465079/ 查看详情

区块链与比特币

一开始只是想了解SSH的安全机制,结果把区块链技术和比特币这两个新技术了解一边。既然学习了,就谈谈自己的理解。在文末我推荐几篇浅显易懂的博文,有兴趣可以继续阅读。我对比特币的理解分为两个方面,既是一种交易... 查看详情

区块链与加密货币

文章目录区块链的目的理解加密货币的本质去中心化工作量证明问题附录参考链接对区块链和加密货币做了下简单研究,这里记录下。区块链的目的区块链的实质是公共账本,目的是降低交易中的信任成本公共账本中ÿ... 查看详情

区块链与边缘计算功能介绍

1.区块链+工业边缘计算场景设备接入、协议解析、边缘数据处理标准化需求;边缘层依托区块链分布式计算协调,多方安全计算和联邦学习能力能提供给机理模型联合训练机制,并通过贡献度量提供模型激励体系&#... 查看详情

区块链与密码学第4-1讲:区块链应用价值从何处体现?

本课堂用通俗易懂的系列内容为大家呈现区块链与密码学领域相关知识。这里有知识也有故事,从感兴趣到有乐趣,点宽课堂等你来学。课程首先从比特币着手进行入门介绍,再延伸至区块链的相关技术原理与发展趋... 查看详情

终于把区块链与物流的关联搞清楚了区块链的分类物流业中区块链技术应用的案例

原文 区块链的分类区块链可以分为三类:公有链、私有链、联盟链。 1、公有链无官方组织及管理机构,无中心服务器,参与的节点按照系统规则自由接入网络、不受控制,节点间基于共识机制开展工作。 2、私有链... 查看详情

区块链与密码学第5-6讲:哈希哈数在区块链中的应用

...大学国家网络安全学院教授、博士生导师何德彪教授的《区块链与密码学》授课讲义、教材及互联网,版权归属其原作者所有,如有侵权请立即与我们联系,我们将及时处理。】5.6 哈希函数在区块链中的应用前几节... 查看详情

区块链与密码学第2-7讲:区块链基础技术大剖析之智能合约

...大学国家网络安全学院教授、博士生导师何德彪教授的《区块链与密码学》授课讲义、教材及互联网,版权归属其原作者所有,如有侵权请立即与我们联系,我们将及时处理。】2.4.6智能合约一提到智能合约,大... 查看详情

bigchaindb,区块链与数据存储(代码片段)

自从我写这篇文章以来,BigchainDB和区块链领域已经发生了很大的变化,所以现在似乎是重新审视和更新区块链对传统计算领域更基本部分之一的影响的时候了:数据存储。BigchainDB最初是作为替代Ascribe数字艺术品跟踪... 查看详情

一文读懂区块链与大数据的关系

导读随着数字经济的发展,区块链的价值逐渐凸显,区块链和大数据确保了数据的安全性,还可以防止数据泄露,一旦信息存储在链上,就需要有多个权限来访问数据。通过可伸缩性,区块链允许以更平静... 查看详情

区块链与比特币基础知识——北京大学肖臻老师《区块链技术与应用》公开课笔记

区块链技术与应用北京大学肖臻老师《区块链技术与应用》公开课的一些笔记1比特币中的密码学原理crypto-currency加密货币1密码学中用到的哈希函数的几个特性:​1collisionresistance抗碰撞性​哈希碰撞的就是不同的输入有相同... 查看详情

区块链与多种技术融合将是未来发展趋势(代码片段)

区块链简单来说是一种互联网技术,是一种去中心化的分户式数据存储技术,但事实如果就单一来看待区块链的话,你可能没觉得什么,但是区块链与其他一些数据相结合时,就将发挥出更大的价值出来。1、... 查看详情

基于区块链与ipfs的数据共享系统设计与搭建(附区块链部分源码)

注意:源码仅包含了区块链+链码+区块链浏览器+tape部分。不含前后端源码,如有需要请联系文末微信(付费,订阅专栏用户优惠)购买专栏前请认真阅读:《Fabric项目学习笔记》专栏介绍区块链以及智能合约源码请看专栏介绍... 查看详情

区块链与数字货币的进步究竟有哪些作用?

自打区块链的定义在二零零八年被中本聪指出来之后,长期被强烈地推荐,社会上也不断涌现愈来愈多的区块链布道者,那区块链究竟是什么呢?数字货币又是啥?在平时的衣食住行工作上又有哪些应用呢ÿ... 查看详情

区块链与数字化转型携手并进

暴走时评:区块链技术的诞生解决了数字经济所面临的很多紧迫问题,这项技术的安全性、数据保存以及联网功能可以规避传统的网络安全障碍,实现当代企业的信息共享要求。对于云技术、机器学习应用来说,... 查看详情

工业区块链与关键关联技术融合创新

11月30日,万向区块链“区块链+”技术部高级总监屠文慧受邀在由湖南省工业和信息化厅主办,长沙经济技术开发区管理委员会、工业互联网产业联盟承办的“2021国际工业区块链大会-新基建技术融合应用分论坛”上发... 查看详情