区块链共识机制之POW算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Technology Analysis
技术分析
DCW
81
数字通信世界
2019.03
1 工作量证明的原理
POW 是区块链主流共识算法:工作量证明POW 、权益POS 、
股份授权证明DPOS 中一种,是由算力决定区块的记账权归属那个节点所有,那个节点先算出哈希函数的下一个随机数数值,得到收益,即俗称的“挖矿”。
例如以下的区块链中一个区块的基本结构:Summary
Number Of Transactions 2Output Total 10BTC Estimated Transaction V olume 0BTC Transaction Fees 0BTC
Height 780890(Main Chain )
Timestamp 2018-12-28 09:10:20Received By 2018-12-28 09:
10:20Relayed By AntPool Difficulty 9,890,231,384,872.65……
Nonce 3670855786Block Reward 10BTC
以上区块信息中“Nonce ”就是这个随机数,各个节点通过算力计算出下一个区块的Nonce ,即拥有该区块记账打包的权利,并获得Block Reward 。
2 工作量证明函数
POW 采用SHA256对区块头做双重运算,而SHA256是单向函数,所以结果很难计算出来。节点在挖矿过程中,当随机生成的Hash 值小于难度值则挖矿成功,例如以下节点挖矿的函数:
func (pow *ProofOfWork )Run ()([]byte ,int64){ nonce :=0
var hashInt big.Int var hash[32]byte for {
dataBytes :=pow.prepareData (nonce ) hash=sha256.Sum256(dataBytes )
fmt.Printf (“\r%x :
”,hash ) hashInt.SetBytes (hash[:
]) if pow.diff.Cmp (&hashInt )==1 { break }
nonce=nonce+1 }
return hash[:],int64(nonce )
在以上函数中,当hashInt 小于Block 里面的target ,则跳出
循环,输出计算得出的nonce 数值,
即挖矿成功,得到挖矿的收益。3 工作量证明过程
3.1 创始区块
区块作为区块链存储结构中的数据元素,收尾相接促成单向
链式存储结构,第一个元素为创始区块,包块共识机制的设置,出块时间,矿工收益等初始参数设置。例如以下为一个区块的创始区块:
{
“config ”
:{ “chainId ”:
666, “homesteadBlock ”:1, “eip150Block ”:
2, “eip150Hash ”:”0x0000000000000000000000000000000000000000000000000000000000000000”,
“eip155Block ”:3, “eip158Block ”:
3, “byzantiumBlock ”:
4, “ethash ”
:{} },
“nonce ”
:”0x0”, “timestamp ”:”0x5b4ee860”
, “extraData ”:”0x0000000000000000000000000000000000000000000000000000000000000000”,
“gasLimit ”:”0x989680”, “difficulty ”:”0x80000”
, “mixHash ”
:”0x0000000000000000000000000000000000000000000000000000000000000000”,
“coinbase ”:”0x0000000000000000000000000000000000000000”,
“alloc ”:
{ “e8f0b72b5fd9fe7a926a346fe209acd1268b3533”:
{ “balance ”:”2500000000000000000000000000” }},
“number ”:”0x0”,“gasUsed ”:”0x0”
,“parentHash ”:”0x0000000000000000000000000000000000000000000000000000000000000000”
}
3.2 生成铸币交易
……
CMutableTransaction coinbaseTx ;
coinbaseTx.vin.resize (1)
; coinbaseTx.vin[0].prevout.SetNull ()
; coinbaseTx.vout.resize (1)
;……注释:coinbaseTx 新建一铸币交易对象。3.3 调整Nonce 数值
采用SHA256对区块头做双重运算,当节点计算出的随机数小于小于设置的难度值时,则挖矿成功。
区块链共识机制之POW 算法
程 瑶1,高丽芬1,胡全贵2
(1.中国矿业大学(北京),北京 100000;2.北京国网信通埃森哲信息技术有限公司,北京 100000)
doi :10.3969/J.ISSN.1672-7274.2019.03.061
中图分类号:
TP311.13 文献标示码:A 文章编码:1672-7274(2019)03-0081-01