“難度”的單位是什麼?
在不同的地方,例如這里和這裡,隨著時間的推移,有關於比特幣挖礦“難度”的圖表。這些數字的確切解釋是什麼——它們是用什麼單位來衡量的?
我的第一個想法是“難度”是SHA256(塊+隨機數)中應該為零的位數。但是,在這種情況下,難度應該是 0 到 255 之間的數字,而這些站點顯示的數字要高得多。
我的第二個想法是 SHA256(block+nonce) 最多應該是 2^256-difficulty。但是,在這種情況下,它應該是一個整數,而這個連結顯示目前的難度級別不是一個整數。
那麼,“難度”這個數字究竟代表什麼?
難度是任何有效區塊可以包含的最小工作量證明 (PoW) 的倍數。在比特幣中,最小難度(稱為難度 1)在程式碼中由這個字節遮罩定義:
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
也就是說,雜湊必須以 8 個十六進制零開頭[*]。那是 4 個零字節,或 32 個零位。
如果你把這個難度加倍,那就是難度 2。再加倍,難度是 4,然後是 8,然後是 16。在難度 16 中,雜湊必須至少有 8 + 1 = 9 個零。再次將其翻倍,然後是 32,然後是 64,然後是 128,然後是 256。在難度 256 中,雜湊必須至少有 8 + 2 個零。等等…
在我寫這篇文章的時候,目前的難度是 4306949573981.513。我們可以通過取其二進制日誌,除以半字節(一個十六進製字元)中的 4 位並添加最小難度的八個零來查看對應的最小零:
log2(4306949573981.513) / 4 + 8 = 18.49245089279219
為了進行比較,這裡是最新的塊頭雜湊(為了便於閱讀,重新格式化為字節對)。正如預期的那樣,它有 18 個零。(注意:如果你在家裡做這個實驗,請注意雜湊總是允許有更多的零;他們不能少。)
0000 0000 0000 0000 0023 bfeb 3a02 1b25 7577 9256 7762 275e b72a d88b 7d50 d7f7
[*] 比特幣很奇怪。我們從大多數其他軟體向後顯示散列,因此如果您使用任何非比特幣軟體進行散列,則開始塊頭散列的零實際上位於末尾。