簡介
難度調整的英文名為Difficulty Retargeting。挖掘是找到新的比特幣區塊的隨機過程,從而確認用戶的交易。這必然是具有競爭性和能源密集型的過程。為了確保網路順利可靠,每隔兩周,挖礦難度會根據期間開採的區塊數量而進行調整。區塊之間的平均目標間隔為10分鐘。
每兩個星期的周期被分為2016個10分鐘的時段。
•如果在兩個星期的周期內有超過2016個區塊被挖掘,挖礦則變得更困難,因此如果哈希值保持不變,預計在接下來的兩周內將每10分鐘發現一次區塊。
•如果在兩個星期的時間內少於2016個區塊被挖掘,挖礦就變得不那么困難了,因此如果哈希值保持不變,預計在接下來的兩周內將每10分鐘會發現一次區塊。
•任何一個周期的最大調整是4的基數(即舊有難度的25%至400%的範圍)。
從區塊頭中了解難度值
由下圖可以看到區塊頭主要包含以下幾部分:
•版本號(Version)
標記著當前區塊是在什麼版本的bitcoincore系統版本下產生的;比特幣主鏈(main)上有兩種版本號的區塊,分別為1和2(此處以比特幣舉例說明)
•時間戳(Time)
記錄這個區塊生成的時間,精確到秒。每誕生一個新的區塊,就會被蓋上相應的時間戳,這樣就保證整條鏈上的區塊都按照時間順序進行排列。
•難度值(Target_bits)
大小4位元組,該欄位標記著當前區塊被“挖”出來的難度,即挖出該區塊的難度係數。對比特幣而言,每產生2016個區塊,數據區塊運算難度會調整一次。(比特幣區塊鏈網路能夠自動調整挖礦的難度,讓礦工每10分鐘才挖出一個區塊)
•隨機數(Nonce)
大小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%。