比特幣pow難度調節機制

買賣虛擬貨幣

關於比特幣POW的難度調節機制白皮書中有闡述,本文重點介紹其中幾個值得關注得地方

比特幣白皮書在工作量證明章節中解釋了工作量證明(PoW)的方式:
我們在區塊中補增一個隨機數(Nonce),這個隨機數要使得該給定區塊的隨機雜湊值出現了所需的那麼多個0。我們透過反覆嘗試來找到這個隨機數,直到找到為止,這樣我們就構建了一個工作量證明機制。只要該CPU耗費的工作量能夠滿足該工作量證明機制,那麼除非重新完成相當的工作量,該區塊的資訊就不可更改。由於之後的區塊是連結在該區塊之後的,所以想要更改該區塊中的資訊,就還需要重新完成之後所有區塊的全部工作量。
那這個隨機數難度值是怎麼產生的呢?
區塊雜湊值的計算結果是一個隨機數,沒有人能直接控制計算的結果。打個比方,重複N次(N趨近於無窮大)擲一個六面的骰子,每擲一次就可以擲出一個6(包含6)以下的數字,但是如果要想擲出3以下的數字,取得每個結果時平均雪要擲2次才行;也就是說,擲出“3以下(含3)”比擲出“6以下(含6)”要難一倍,需要多做一倍的“工作量”。
如果定義“6以下”這個規則的難度係數(困難度)為“1”,那麼“3以下”這個規則的難度係數為“2”,意味者要想符合規則要求,需要2倍的工作量;“1以下“的難度係數則為6,意味著該規則需要6倍的工作量。
比特幣協議中,規定一個256位的整數0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF為難度“1”,在當時的全網算力下大約需要10分鐘左右的雜湊計算工作量才可以滿足小於等於這個數這一規則。
如果想確保10分鐘這個工作時間恆定,那麼當算力提高n倍時,需要把難度值也調高n倍。2015年10月Bitcoin網路的難度值為608億,可以推算出現在的全網算力比2009年初增大了608億倍。
難度值的計算實際上就是簡單的除法。只不過涉及到的整數太大(遠遠超過內建的整數位數),沒法直接用普通數學庫的除法來運算,需要藉助高精度的演算法庫(比如GMP)來完成,這就比較麻煩。所以bitcoin wiki中給出了一種藉助泰勒級數變體實現的快速對數演算法計算難度值的示例。
區塊儲存時,block_header中有一個欄位是與難度值相對應的,即bits。用一個32位的整數來壓縮儲存當期256位的目標值。壓縮規則很簡單,bits欄位的最高位位元組為指數(little endian中的第4個位元組),儲存目標值有效的位元組數,如果目標值的最高位為1(大於0x80),需要在前面補上一個0x00。(比如難度值1的目標值有效位為0x00FFFF......,補0後共0x1D個位元組)。另外3個位元組為尾數(mentissa),擷取目標值最高3個位元組來儲存。
這樣,難度值1對應的目標值寫成bits格式,就是0x1D00FFFF。以此類推,目標值為0x00000000000404CB000000000000000000000000000000000000000000000000時,bits的格式為0x1B0404CB。
計算難度值時其實可以採用簡易演算法:尾數部分相除,再乘以指數部分帶來的差異即可。(2 ^ [指數部分相減的結果 * 8]),計算速度比“快速對數法”要快很多(但是如果超出double型所容許的位數會有溢位)。
現有的演算法中,難度值每2016個區塊調整一次,但新的難度值不需要與難度“1”進行比較運算,而是根據前2015個塊的出塊時間來計算。
問:為什麼是2015?答:因為最初程式設計師的程式碼寫錯了,糾正這個錯誤會導致分叉,所以只能將就一下了
difficulty = [prev_target] * 【前2015個區塊生成所用的時間】 / 1209600 (按標準每10分鐘出一個塊,2016個塊所需要的秒數)
因為演算法確定,所以分佈計算時也能保證所有節點計算出的難度值都一致,不會出現分歧。區塊鏈同步時,節點或客戶端會優先選取累積難度最大的鏈作為主鏈,僅有高度(height)的“偽造慢鏈”很難被認可,除法偽造出的難度值也很高。但是隻要偽造了一個塊的難度,後續所有的區塊必須用相應的難度重新計算一遍,這往往需要攻擊者擁有的算力與當前全網的真實算力相當才有可能完成。
比特幣發展的早期,“偽造慢鏈”攻擊應該是很難防的,但是一旦算力達到一定規模,在PoW下這種攻擊需要極大的成本和海量的計算時間(不光是金錢,還需要時間),因而一般只需透過最佳化演算法根據累積難度來標識出主鏈即可。這是PoW下用高額成本的代價換來的成果—算力保護。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;