複製鏈接
請複製以下鏈接發送給好友

難度調整

鎖定
比特幣網絡每產生 2016 個區塊(兩週)後,會根據之前 2016 個區塊的計算時間以及算力進行數學難題的難度調整,通過將數學解的閾值提高或降低來減少或增加難度,使每個區塊的計算時間維持在大約10分鐘的範圍。
中文名
難度調整
外文名
Difficulty Retargeting
領    域
區塊鏈金融

難度調整簡介

難度調整的英文名為Difficulty Retargeting。挖掘是找到新的比特幣區塊的隨機過程,從而確認用户的交易。這必然是具有競爭性和能源密集型的過程。為了確保網絡順利可靠,每隔兩週,挖礦難度會根據期間開採的區塊數量而進行調整。區塊之間的平均目標間隔為10分鐘。
每兩個星期的週期被分為2016個10分鐘的時段。
  • 如果在兩個星期的週期內有超過2016個區塊被挖掘,挖礦則變得更困難,因此如果哈希值保持不變,預計在接下來的兩週內將每10分鐘發現一次區塊。
  • 如果在兩個星期的時間內少於2016個區塊被挖掘,挖礦就變得不那麼困難了,因此如果哈希值保持不變,預計在接下來的兩週內將每10分鐘會發現一次區塊。
  • 任何一個週期的最大調整是4的基數(即舊有難度的25%至400%的範圍)。

難度調整從區塊頭中瞭解難度值

由圖1可以看到區塊頭主要包含以下幾部分:
圖1 區塊頭 圖1 區塊頭
  • 版本號(Version)
標記着當前區塊是在什麼版本的bitcoincore系統版本下產生的;比特幣主鏈(main)上有兩種版本號的區塊,分別為1和2(此處以比特幣舉例説明)
記錄這個區塊生成的時間,精確到秒。每誕生一個新的區塊,就會被蓋上相應的時間戳,這樣就保證整條鏈上的區塊都按照時間順序進行排列。
大小4字節,該字段標記着當前區塊被“挖”出來的難度,即挖出該區塊的難度係數。對比特幣而言,每產生2016個區塊,數據區塊運算難度會調整一次。(比特幣區塊鏈網絡能夠自動調整挖礦的難度,讓礦工每10分鐘才挖出一個區塊)
大小4字節,當前區塊工作量證明的參數。當“礦機”節點經過Hash計算(哈希碰撞)出的值為該隨機數時,即為“挖礦”初步成果(經過後續六個區塊的認證之後,才是真正的成果,終態)
  • 前一區塊哈希值
也稱“父區塊哈希值”,大小32字節,為當前區塊前一個區塊的區塊頭的Hash值,這個哈希值通過對前一個區塊的區塊頭數據進行哈希計算(SHA256算法)得出。
  • 默克爾根(Merkle Root)
所有交易信息先進行兩個一組的哈希計算。Hash 1 和 Hash 2 合併成一個新字符串,然後算出這個字符串的哈希值,我們記做Hash(1&2);Hash 3 和 Hash 4 同上辦法處理,得到 Hash( 3&4),再往上算,Hash(1&2)、Hash(3&4)這兩個字符串又合併,接着進行哈希運算,這個最後的哈希值就是區塊頭的Merkle樹根。

難度調整算力

在通過“挖礦”得到比特幣的過程中,我們需要找到其相應的解,而要找到其解,並沒有固定算法,只能靠計算機隨機的哈希碰撞。一台礦機每秒鐘能做多少次哈希碰撞,就是其“算力”的代表,單位寫成hash/s。算力可以簡單的理解為計算能力。主流的礦機為14T左右的計算量級,即一台礦機就能每秒做至少1.4*10的13次方次哈希碰撞,我們可以説,這一台14T規格的礦機就有14T的算力。礦工所掌握的所有礦機佔比特幣全網總算力的百分比是多少,就代表TA在這10分鐘競爭中能夠獲勝的概率就是多少。舉個例子,如果比特幣全網的算力是100,而某個礦工擁有10的算力,那麼TA每次競爭記賬成功的概率就是1/10。

難度調整難度調整的過程

比特幣的區塊平均每10分鐘生成一個。這就是比特幣的心跳,是貨幣發行速率和交易達成速度的基礎。不僅是在短期 內,而是在幾十年內它都必須要保持恆定。在此期間,計算機性能將飛速提升。此外,參與挖礦的人和計算機也會不斷 變化。為了能讓新區塊的保持10分鐘一個的產生速率,挖礦的難度必須根據這些變化進行調整。事實上,難度是一個動 態的參數,會定期調整以達到每10分鐘一個新區塊的目標。簡單地説,難度被設定在,無論挖礦能力如何,新區塊產生 速率都保持在10分鐘一個。
那麼,在一個完全去中心化的網絡中,難度的調整是在每個完整節點中獨立自動發生的。 每2,016個區塊中的所有節點都會調整難度。難度的調整公式是由最新2,016個區塊的花費時長與20,160分鐘(即 這些區塊以10分鐘一個速率所期望花費的時長)比較得出的。難度是根據實際時長與期望時長的比值進行相應調整的 (或變難或變易)。簡單來説,如果網絡發現區塊產生速率比10分鐘要快時會增加難度。如果發現比10分鐘慢時則降低難度。
總結一下,公式如下:
New Difficulty = Old Difficulty \* \(Actual Time of Last 2016 Blocks / 20160 minutes\)
雖然目標校準每2,016個塊發生,但是由於Bitcoin Core客户端的一個錯誤,它是基於之前的2,015個塊的總時間(不應該是2,016個),導致重定向偏差向較高難度提高0.05%。 [1] 
參考資料
  • 1.    Andreas M Antonopoulos.精通比特幣: O Reilly Media,2017:100-150