[GO]使用go语言实现比特币的工作量证明
之前的博文已经实现了区块连的基本的工作原理,但在比特币系统中有一个很重要的概念:工作量证明POW,在比特币系统中它的作用就是在十分钟左右的时间内只有一个有能够记帐并得到奖励
在之前的博文中,区块的哈希值是我自己创建的,那么在这里需要将原区块函数更改为以下的样子
func NewBlock(data string, prevBlockHash []byte) *Block {
//initial block data
block := &Block{
Version:,
PreBlockHash:prevBlockHash,
//Hash:[]
TimeStamp:time.Now().Unix(),
TargetBits:targetBits,
Nonce:,
MerkelRoot:[]byte{},
Data:[]byte(data),
}
//block.SetHash() //get block hash
pow := NewProofOfWork(block)
nonce, hash := pow.Run()
block.Nonce = nonce
block.Hash = hash
return block
}
新建一个工作证明proofofwork.go的文件
package main import (
"math/big"
"bytes"
"math"
"crypto/sha256"
"fmt"
) const targetBits = type ProofOfWork struct {
block *Block
targetBit *big.Int
} func NewProofOfWork(block *Block) *ProofOfWork {
var IntTarget = big.NewInt()
IntTarget.Lsh(IntTarget, uint( - targetBits))
return &ProofOfWork{block, IntTarget}
} func (pow *ProofOfWork)PrepareRowData(nonce int64) []byte {
block := pow.block
tmp := [][]byte{
IntToByte(block.Version),
block.PreBlockHash,
IntToByte(block.TimeStamp),
block.MerkelRoot,
IntToByte(nonce),
IntToByte(targetBits),
block.Data,
}
data := bytes.Join(tmp, []byte{})//join接收两个参数,第一个二维数组,第二个这里设置为空的连接符
return data
} func (pow *ProofOfWork)Run() (int64, []byte) {
var nonce int64
var hash []byte
var HashInt big.Int
fmt.Printf("Begin mining....")
fmt.Printf("Target Hash : %x\n", pow.targetBit.Bytes())
for nonce < math.MaxInt64 {
data := pow.PrepareRowData(nonce)
hash = sha256.Sum256(data)
HashInt.SetBytes(hash[:])
if HashInt.Cmp(pow.targetBit) == - {
fmt.Printf("found hash: %x\n", hash)
break
} else {
nonce++
}
}
return nonce, hash[:]
} func (pow *ProofOfWork)IsValid() bool {
data := pow.PrepareRowData(pow.block.Nonce)
hash := sha256.Sum256(data)
var IntHash big.Int
IntHash.SetBytes(hash[:])
return IntHash.Cmp(pow.targetBit) == -
}
系统就会自动进行运算,go build *.go之后 ,执行结果为
baylor@baylor-virtual-machine:~/go/src/v2$ ./blockchain
Begin mining....Target Hash :
found hash: 0000009d511471179142f674a5efc491ce2e6c53aa941866037eaceb2864c364
Begin mining....Target Hash :
found hash: 000000dc2edb49477aef1e99eb9dfd50c54ce5978a105071006a9ce0095de6fa
Begin mining....Target Hash :
found hash: 000000c983192057f57ecfa3da5dab35701f67daa9a3556674e5d93bb75be142
============= block num :
Version
PreBlockHash:
Hash: 0000009d511471179142f674a5efc491ce2e6c53aa941866037eaceb2864c364
TimeStamp: 5bc053cb
Nonce: 25d497c
MerkelRoot:
Data: Gensis Block!
IsValid : true
============= block num :
Version
PreBlockHash: 0000009d511471179142f674a5efc491ce2e6c53aa941866037eaceb2864c364
Hash: 000000dc2edb49477aef1e99eb9dfd50c54ce5978a105071006a9ce0095de6fa
TimeStamp: 5bc053f2
Nonce: 19a5b8
MerkelRoot:
Data: 班长转给老师一枚BTC
IsValid : true
============= block num :
Version
PreBlockHash: 000000dc2edb49477aef1e99eb9dfd50c54ce5978a105071006a9ce0095de6fa
Hash: 000000c983192057f57ecfa3da5dab35701f67daa9a3556674e5d93bb75be142
TimeStamp: 5bc053f4
Nonce:
MerkelRoot:
Data: 班长又转给老师一枚BTC
IsValid : true
[GO]使用go语言实现比特币的工作量证明的更多相关文章
- 【区块链Go语言实现】Part 2:工作量证明机制POW
0x00 介绍 在上一篇文章中,我们建立了一个非常简单的数据结构,它是区块链数据库的本质.并且,我们实现了以类似链条关系的方式向其中添加区块的功能:每个区块都会链接到前一区块.然而,我们实现的区块链有 ...
- cpp 区块链模拟示例(四) 区块链工作量证明
本文主要在之前的区块链原形上添加了工作量证明,并且为后继的交易功能做好准备. 上一个章节我们已经创建了区块链的基本原形,但是区块的哈希计算和加入太过于简单,如果按照这种速度添加区块那么区块链估计一个小 ...
- Go实现Pow工作量证明
之前使用python编写了一段代码实现了工作量证明机制,近期由于参与以太坊智能合约开发钱包的工作接触到golang语言,所以借此以go来实现Pow(Proof of work). 实现代码如下: // ...
- 用python阐释工作量证明(proof of work)
了解比特币的都知道挖矿非常耗电,这是由于比特币用到了工作量证明. 工作量证明是指系统为达到某目标而设置的工作度量方法.一開始是用在网络攻防上,大大提高攻击者的计算量,攻击成本也就上去了. 工作量证明须 ...
- 区块链共识机制之工作量证明(POW)
像比特币.以太坊.NXT.Bitshares等这些区块链系统,其本质上是一种加密经济组织,它建立在点对点网络上,是去中心化.无管辖的,由密码学.经济学和社会共识来共同维护.这些加密网络因各种原因有着多 ...
- [转帖]Proof Of Work 工作量证明
Proof Of Work 工作量证明 https://www.cnblogs.com/zhang-qc/p/10451817.html 借鉴了 哈希现金(Hashcash)-1997年 英国密码学专 ...
- 详解POW工作量证明原理
原文地址 来自 微信公众号 区块链大师 POW工作量证明(英文全称为Proof of Work)早在比特币出现之前就已经有人探索,常见的是利用HASH运算的复杂度进行CPU运算实现工作量确定,当然你 ...
- [GO]go语言实现区块链工作证明(pow)原理
package main import ( "math/big" "bytes" "math" "crypto/sha256&qu ...
- [转]工作量证明(PoW)权益证明(PoS)和委任权益证明(DPoS)区别
原文链接 Both in the glossary and in some of our previous posts we've touched on mining and the two main ...
随机推荐
- Sentinel限流示例:编码和注解限流
一.Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性. Sentine ...
- Tool:Visual Studio Code
ylbtech-Tool:Visual Studio Code Microsoft在2015年4月30日Build 开发者大会上正式宣布了 Visual Studio Code 项目:一个运行于 Ma ...
- Confluence 5.4.2安装
默认安装路径 /opt/atlassian/confluence/bin Confluence是Atlassian公司出品的团队协同与知识管理工具. Confluence是一个专业的企业知识管理与协同 ...
- 为什么 ReactJS 不适合复杂的前端项目?
问题一:ReactJS组件难以在复杂交互页面中复用 ReactJS中的最小复用单位是组件.ReactJS的组件比AngularJS的Controller和View 要轻量些. 每个组件只需要前端开发者 ...
- 读《分布式一致性原理》CURATOR客户端3
分布式锁 在分布式环境中,为了保证数据的一致性,经常在程序运行的某个运行点.需要进行同步控制. package master; import java.text.SimpleDateFormat; i ...
- python操作docx文档(转)
python操作docx文档 关于python操作docx格式文档,我用到了两个python包,一个便是python-docx包,另一个便是python-docx-template;,同时我也用到了很 ...
- flutter android keystore
keytool -genkey -v -keystore E:/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key k ...
- 使用copy函数输出容器中的内容
container<type> c; 输出语句为:copy(c.begin(), c.end(), ostream_iterator<type>(cout, " &q ...
- bootstrap下,对数组循环处理的方法
nameArray和nameArrayCurrent是字符数组 $.each(nameArray, function(i, v) { if($.inArray(v, nameArrayCurrent) ...
- Windows下DOS命令大全(经典收藏)
copy \\ip\admin$\svv.exe c:\ 或:copy\\ip\admin$\*.* 复制对方admini$共享下的srv.exe文件(所有文件)至本地C: xcopy 要复制的文件或 ...