[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 ...
随机推荐
- 一张图看懂高通QC1.0-QC4.0快充进化之路!QC2.0跟QC3.0充电区别
快充技术日新月异,快充市场百家争鸣的今天,高通QC快充依然主导着市场.如今QC快充已发展到第四代,每一代都有着革命性的进步.从QC1.0到QC4.0更新换代时间之短,不免让广大人民群众抱怨. “啥?老 ...
- PorterDuff.Mode
参考:http://weishu.me/2015/09/23/Xfermode-in-android/ Sa = Source alphaDa = Dest alphaSc = Source colo ...
- line 1: syntax error: unexpected word (expecting ")")
编译出来的程序在arm平台上运行时,出现下面的错误. / # wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0 /bin/wpa_supplicant: ...
- 浅谈PHP面向对象编程(一、简介)
传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为“一个一个对象”的任务(功能),每个对象独自完成自 ...
- ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql (转)
ps -A | grep -i mysql kill 列出来的进程 service mysql start 我的问题就解决了 ------------------------------------- ...
- linux网络监视器
vnstat iftop nethogs dig ipcalc
- 什么是事件代理?DOM2.0标准事件模型的三个阶段
体验更优排版请移步原文:http://blog.kwin.wang/programming/js-event-delegation.html 事件代理,又称事件委托(Delegation),就是将处理 ...
- 跟着太白老师学python day11 闭包 及在爬虫中的基本使用
闭包的基本概念: 闭包 内层函数对外层函数的变量(不包括全局变量)的引用,并返回,这样就形成了闭包 闭包的作用:当程序执行时,遇到了函数执行,它会在内存中开辟一个空间,如果这个函数内部形成了闭包, 那 ...
- README.md的编写
1.编辑README文件 大标题(一级标题):在文本下面加等于号,那么上方的文字就变成了大标题,等于号的个数无限制,但一定要大于0 大标题 ==== 中标题(二级标题):在文本下面加下划线,那么上方的 ...
- Dreamweaver安装与破解
1.下载Dreamweaver cs6破解版解压包 打开下载网址http://pan.baidu.com/s/1jGr8pbK,点击下载,保存到自己想要保存的位置. 2.下载Dreamweaver c ...