通俗地讲,“挖矿”即生成新区块的本质是:做一系列的哈希运算,当运算得到的哈希值符合目标规则,即为挖矿成功(其实,就是寻找符合条件的Nonce参数的过程,下文会详细解释,此处记住这个概念即可)。

也就是比较俩数值的大小,target目标值(固定)与哈希计算值(矿工每次计算算出来的值),这两个值的计算公式是什么呢?

如下图,为区块头(header)结构,结合着图示,介绍下挖矿的原理。

这里直介绍两个关键信息:

1)难度系数:difficulty参数,顾名思义用来调节生成区块的难度的。该值决定了target的大小,

公式为:target=2**(256-Difficulty)

中本聪希望生成每个区块需要耗时10分钟,但是实际情况往往多变,生成区块(算出target)的时间有可能远小于十分钟(difficulty偏下)或者远大于十分钟(difficulty偏大);

那么在每2016【2016=14(day)24(hour)60(min)/10(min)】个区块生成完毕之后,系统要自动调节difficulty参数大小;

调整公式为:New Difficulty= Old Difficulty*(最新的2016区块实际耗时/ 20160 minutes).即:最新2016个区块花费时长与20160分钟(20160分钟是2016个区块期望的产出时间)比较所得。

2)随机数:Nonce参数,也可以理解为POW工作量证明的计数器;

该字段是最重要的一个字段,因为其实“挖矿”的过程就是寻找符合条件的Nonce值的过程;我们知道“挖矿”是做一些列的哈希计算的过程,该过程为:对区块头和nonce进行哈希运算【sha256(str(header)+str(nonce))】;如果本次所得的哈希值<=target,则“挖矿”成功;反之,Nonce+1,重复上述过程;

PS:

1)Nonce叫“随机数”的原因是因为原则上每次计算当前Nonce值可以随机产生。但是,实际情况下:什么方式最容易计算出目标值呢?穷举法;所以每次计算Nonce从0开始;计算Hash值是否<=targetHash; 如果本次所得的哈希值<=target,则“挖矿”成功;反之,Nonce+1,重复计算过程

2)为什么说“挖矿”这么难呢?(上文中说的target值符合特定的规则:十六进制的以连续0开头,且连续的0越多越能符合命中规则)

打个比方:当前target值为连续20个0开头的十六进制数字;

一个不透明的口袋里有俩形状一模一样的乒乓球,一个红色(1),一个蓝色(0);每次抓阄抓到蓝色则标记位0,红色标记位1,那么如果矿工想要“挖矿”成功,意味着:至少连续20次抓阄均抓到篮球。是不是瞬间觉得很难呢?

如果连续2016个区块的生成时间小于期望的20160分钟,系统会自动调节Difficulty系数,比如调节Difficulty系数之后,target变成了连续21个0开头的十六进制数字,此时,矿工想要挖矿成功,则需要连续21次抓到篮球,生成时间就会相对变长。是不是更难了呢?

如果连续2016个区块的生成时间大于期望的20160分钟,则调低难度系数。

参考