比特幣中的工做量證實

對於比特幣網絡中的任何一個節點,若是想生成一個新的區塊並寫入區塊鏈,則必須解出比特幣網絡出的工做量證實的迷題。這道題的3個關鍵要素是工做量證實函數、區塊及難度
值。工做量證實函數是這道題的計算方法,區塊決定了這道題的輸入數據,難度值決定了解這道題所須要的計算量。算法

比特幣網絡中使用的工做量證實函數正是前文說起的SHA-256。已經講過區塊的數據結構,但並未具體描述區塊的產生過程。區塊其實就是在工做量證實環節產生的。礦工經過不停
地構造區塊數據,檢驗每次計算出的結果是否是知足工做量,從而判斷該區塊是否是符合網絡難度。區塊頭即爲比特幣的工做量證實的輸入數據。網絡

難度值是礦工們挖礦的重要參考指標,它決定了礦工大約須要通過多少次哈希運算才能產生一個合法的區塊。比特幣的區塊大約每10分鐘生成一個,若是要在不一樣的全網算力條件下
,新區塊的產生都基本保持這個速率,難度值必須根據全網算力的變化進行調整。簡單地說,難度值被設定在不管挖礦能力如何,新區塊產生速率都保持在10分鐘一個。數據結構

難度值的調整是在每一個完整節點中獨立自動發生的。每隔2016個區塊,全部節點都會按統一的公式自動調整難度值,這個公式是由產生最新2016個區塊的花費時長與指望時長(指望
時長爲20160分鐘,即兩週,是按每10分鐘一個區塊的產生速率計算出的總時長)比較得出的,根據實際時長與指望時長的比值,進行相應調整(或變難或變易)。也就是說,若是
區塊產生的速率比10分鐘快,則增長難度,比10分鐘慢,則下降難度。函數

這個公式能夠總結爲以下形式:區塊鏈

新難度值=舊難度值*(過去2016個區塊花費時長/20160分鐘)字符串

工做量證實須要有一個目標值。比特幣工做量證實的目標值(Target)的計算公式以下:get

目標值=最大目標值/難度值比特幣

其中,最大目標值爲一個恆定值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF隨機數

目標值的大小與難度值成反比。比特幣工做量證實的達成就是礦工計算出來的區塊哈希值必須小於目標值。打包

咱們也能夠將比特幣工做量證實的過程簡單理解成,經過不停地變換區塊頭(即嘗試不一樣的nonce值)並將其做爲輸入,進行SHA-256哈希運算,找出一個有特定格式的哈希值的過程
(即要求有必定數量的前導0)。而要求的前導0的個數越多,難度越大。

能夠把比特幣礦工解這道工做量證實迷題的步驟大體概括以下:

1)生成coinbase交易,並與其餘全部準備打包進區塊的交易組成交易列表,經過Merkle Tree算法生成Merkle Root Hash。

2)把Merkle Root Hash及其餘相關字段組裝成區塊頭,將區塊頭的80字節數據做爲工做量證實的輸入。

3)不停地變動區塊頭中的隨機數(即nonce的數值),並對每次變動後的區塊頭作雙重SHA-256運算(即SHA256(SHA 256(Block_Header))),將結果值哈希反轉並與當前網絡的 目標值對應的十進制字符串作對比,若是小於目標值,則解題成功,工做量證實完成

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息