PoW***識機制的原理
比特幣的***識機制就是PoW***識,借鑒了HashCash的處理方法, 下面就來說說比特幣如何進行PoW***識的。
從區塊頭的結構中可以看到壹個4 bytes的Nonce值,Nonce值的變動會影響整個區塊頭的哈希值,挖礦節點即是通過嘗試不同的Nonce值(通常從0開始每次加1),尋找壹個哈希值小於Difficulty Target指定的難度值。
PoW證明過程,這也就是俗稱的挖礦過程, 找到合適的哈希值。
這裏不詳細說明區塊打包過程, 區塊通過壹定的算法被生成, 當然生成是需要壹定的代價的。
區塊頭裏的各個值並不是隨機的, 而是由固定的算法得出, Merkle根哈希值就是把交易打包變成壹顆Merkle樹, 最後得出根的哈希值, 難度值是根據算法不斷調整, 要維持出塊速率是10分鐘出壹個塊。
首先我們把所有交易打包生成Merkle樹, 計算Merkle根的哈希值, 然後組裝區塊頭, 把區塊頭不斷進行SHA256(SHA256(區塊頭))雙重哈希操作, 然後判斷是否小於網絡目標值, 這裏其實就是把它變成2進制, 二進制前面有多少位是沒有0的, 因為有1的話, 這個十進制的值肯定是很大的, 就不會符合條件。 如果大於這個目標值, 說明前面的位數沒有滿足前多少位為0的條件 哈希不成功, 那麽就改變隨機數值,組成新的區塊頭,繼續哈希。
這是就是是挖到礦了,其他節點驗證的話也簡單,只要做壹次SHA256(SHA256(驗證區塊頭))來判斷。
比特幣挖礦難度調整方式非常簡單,難度目標調整即不斷將256位的難度值減小,如277315號區塊的難度值十六進制表示為:0x0000000000000003A30C00000000000000000000000000000000000000000000
這個數字在二進制表示下前60位均是0,如果要增加難度只需要減小這個值,隨著難度值的減小,起始0的個數增多,可尋找的哈希值範圍減小,挖礦難度就越大。
難度的調整是在每個完整節點中獨立自動發生的。每2016個區塊,所有節點都會按統壹的公式自動調整難度。如果區塊產生的速率比10分鐘快則增加難度,比10分鐘慢則降低難度。
公式可以總結為:新難度值=舊難度值×(過去2016個區塊花費時長/20160分鐘)
優點
缺點
1:挖礦過程為什麽要計算兩次哈希值?
中本聰在設計比特幣的挖礦算法的時候,考慮到SHA2-256算法存在被破解的可能,雖然在理論上並未出現對SHA2-256算法的攻擊。為了減弱攻擊的威脅,區塊頭數據要對SHA2-256算法運算兩次。
2:如果所有節點都從0開始嘗試Nonce值,那不就永遠都是算力高的節點先計算出有效的結果,算力低的節點永遠沒希望挖礦成功?
區塊頭大部分信息都是壹樣的,但是Merkle Root對於每個節點必然是不同的,因為每個節點都會有自己的Coinbase交易,該交易中存在節點礦工的地址,此地址對於每個獨立挖礦節點都是不同的,根據哈希函數的雪崩效應可知每個獨立節點的Merkle Root必定有顯著的區別。
3:如何解決拜占庭問題?
通過工作量證明就增加了發送信息的成本,降低節點發送消息速率,這樣就以保證在壹個時間只有壹個節點在進行廣播,同時在廣播時會附上自己的簽名。工作量證明其實相當於提高了做叛徒(發布虛假區塊)的成本,只有第壹個完成證明的節點才能廣播區塊,競爭難度非常大,需要很高的算力,如果不成功其算力就白白的耗費了,整個系統也因此而更穩定。