解釋另外一個知識:不少老師在講解難度控制時會說到前導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)的數據處理到能夠比較直觀理解的範圍,但是這個過程會導致精度的丟失。
古人云差之毫釐,謬以千里,計算機是一門精確的科學,需要精確的描述,絕不可做差不多先生。