比特币中的工作量证明

对于比特币网络中的任何一个节点,如果想生成一个新的区块并写入区块链,则必须解出比特币网络出的工作量证明的迷题。这道题的3个关键要素是工作量证明函数、区块及难度
值。工作量证明函数是这道题的计算方法,区块决定了这道题的输入数据,难度值决定了解这道题所需要的计算量。

比特币网络中使用的工作量证明函数正是前文提及的SHA-256。已经讲过区块的数据结构,但并未具体描述区块的产生过程。区块其实就是在工作量证明环节产生的。矿工通过不停
地构造区块数据,检验每次计算出的结果是不是满足工作量,从而判断该区块是不是符合网络难度。区块头即为比特币的工作量证明的输入数据。

难度值是矿工们挖矿的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,如果要在不同的全网算力条件下
,新区块的产生都基本保持这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论挖矿能力如何,新区块产生速率都保持在10分钟一个。

难度值的调整是在每个完整节点中独立自动发生的。每隔2016个区块,所有节点都会按统一的公式自动调整难度值,这个公式是由产生最新2016个区块的花费时长与期望时长(期望
时长为20160分钟,即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果
区块产生的速率比10分钟快,则增加难度,比10分钟慢,则降低难度。

这个公式可以总结为如下形式:

新难度值=旧难度值*(过去2016个区块花费时长/20160分钟)

工作量证明需要有一个目标值。比特币工作量证明的目标值(Target)的计算公式如下:

目标值=最大目标值/难度值

其中,最大目标值为一个恒定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。

我们也可以将比特币工作量证明的过程简单理解成,通过不停地变换区块头(即尝试不同的nonce值)并将其作为输入,进行SHA-256哈希运算,找出一个有特定格式的哈希值的过程
(即要求有一定数量的前导0)。而要求的前导0的个数越多,难度越大。

可以把比特币矿工解这道工作量证明迷题的步骤大致归纳如下:

1)生成coinbase交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash。

2)把Merkle Root Hash及其他相关字段组装成区块头,将区块头的80字节数据作为工作量证明的输入。

3)不停地变更区块头中的随机数(即nonce的数值),并对每次变更后的区块头做双重SHA-256运算(即SHA256(SHA 256(Block_Header))),将结果值哈希反转并与当前网络的
目标值对应的十进制字符串做对比,如果小于目标值,则解题成功,工作量证明完成

posted @ 2018-06-11 21:23  大雨天空  阅读(1099)  评论(1编辑  收藏  举报