解释另外一个知识:不少老师在讲解难度控制时会说到前导0的个数,前导0的个数越多,那么挖矿的难度越大。
显然如果只是以leadingZero作为难度的控制会导致难度剧烈的波动,难度要么加倍,要么减半。1%这样的变化率则无法表示。
前导0对应数学中的一个重要的知识,对数尺。
System.out.println(difficulty.bitLength()); // 224 log2(difficulty)
区块1对应的难度值为 0x1d00ffff
二进制为
11111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 bitLength为224,前导0的个数为32个0
加上前导0的个数凑满256个bit位
0000000000000000000000000000000011111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
区块768934对应的难度值为 0x1707f590
二进制为11111110101100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, bitLength为179, 前导0的个数为77.
加上前导0的个数凑满256个bit位
0000000000000000000000000000000000000000000000000000000000000000000000000000011111110101100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
通过比较上述的两个数能得到一个结论:前导0的个数越多,数值越小,挖矿难度越大,但这并不是一个精确的描述。00010000, 00011111 前导0的个数相同,但是这两个数相差还是挺大。
0, 32, 179,224,256 在数轴上的排序:
这里之所以引入32,因为32个bit位就是4个字节。难度值降为4个字节以内的是不可能。
对数的魅力在于能将相差很大很大(10^12,10^13)的数据处理到能够比较直观理解的范围,但是这个过程会导致精度的丢失。
古人云差之毫厘,谬以千里,计算机是一门精确的科学,需要精确的描述,绝不可做差不多先生。