作者:Zarten
本文首發於區塊鏈技術詳解知乎專欄,題目:比特幣工作量證明難度值及難度調整詳解
【作者按】在比特幣系統中工作量證明是有一定難度的,難度保持在整個系統中平均10分鐘才能增加一個區塊,那是如何維持這樣的一個水平的呢?是通過區塊頭中的一個難度目標值(target)來決定的。
下面講解比特幣系統中的這個難度值和如何調整難度值。
難度值
在每個區塊頭中都有一個“Bits”字段,被稱為“目標位”,也就是所謂的難度值。如下所示:
我們知道,在比特幣系統中滿足下面公式即為挖礦成功:
H(block header) <= target
那麼這個target是通過Bits得來的。
難度目標值(target)計算公式
target以指數形式存在,以十六進製表示,總共有8位,前2位為指數,後6位為係數。
所以上圖中,指數為0x17,係數為0x1320bc
計算公式為:
難度值(target) = 係數* 2^(8 * (指數- 3))
因此上圖中的難度值為:
難度值(target) = 0x1320bc * 2^(8 * (0x17 - 3))
這個算出來是個很大的數,結果為:
十進制為:1832085838499075985755083973639154607251969422303166464
十六進制為:0x1320bc0000000000000000000000000000000000000000
在比特幣系統中,難度值越小,挖礦難度就越大,因為哈希值可落的範圍會越小;反之難度值越大,挖礦難度就越小。
難度值調整
比特幣系統中,難度值是系統動態調整的,目的是使整個系統平均10分鐘出一個塊。
為什麼調整難度值
隨著挖礦設備的進化升級,系統的總算力會越來越強,如果難度值保持不變的話,出塊時間會越來越短,一方面是提高了對系統的響應時間和效率的考驗,另一個方面是出塊時間縮短後在同一時間將會產生多個區塊,必然會導致區塊鏈形成多分叉,這樣就導致系統的總算力分散到各個分叉鏈中了,這時系統的安全性大幅度降低,黑客可以集中算力進行分叉攻擊等攻擊行為。
因此,比特幣系統需要調整難度值。
難度值調整規則
目標是:系統平均每10分鐘產生一個區塊。
調整的周期是:每2016個區塊產生後會調整一次(大約2週14天)
調整的計算公式是:
新難度值= 舊難度值* (最近2016個區塊的真正時間/ 最近2016個區塊的預期時間)
最近2016個區塊的預期時間,當然是:2016 * 10min。
從上面公式可以得出,最近2016個區塊的真正時間越小,說明系統中出塊時間更短了(算力更強了),新難度值也就越小,所以挖礦難度就動態的提升了。
但是為了防止難度變化的過快,調整的時候有個4倍的幅度限制,也就是若調整的幅度大於4倍了,就按4倍調整。