談到哈希算法,每一個程序員都不陌生,可是談到比特幣共識算法PoW,若是沒有接觸過的技術人員可能以爲應該會很複雜,畢竟全球的比特幣節點數量如此龐大,達成共識的算法應該不會很簡單。但其實若是你已掌握哈希算法,幾分鐘內你就能理解PoW。爲了更好的說明PoW的原理,咱們再把哈希算法及相關概念描述一下:程序員
哈希算法就是以哈希函數爲基礎構造的,經常使用於實現數據完整性和實體認證。一個優秀的 hash 算法,將能實現:算法
哈希函數的抗碰撞性是指尋找兩個可以產生碰撞的消息在計算上是不可行的。但找到兩個碰撞的消息在計算上不可行,並不意味着不存在兩個碰撞的消息。哈希函數是把大空間上的消息壓縮到小空間上,碰撞確定存在。只是計算上是不可行的。例如,若是哈希值的長度固定爲256位,顯然若是順序取這
個輸入值,計算它們的哈希值,確定可以找到兩個輸入值,使得它們的哈希值相同。安全
原像不可逆,指的是知道輸入值,很容易經過哈希函數計算出哈希值;但知道哈希值,沒有辦法計算出原來的輸入值。微信
難題友好性指的是沒有便捷的方法去產生一知足特殊要求的哈希值。網絡
一個哈希函數稱爲難題友好的,若是對於每一個
位的輸出
,若
是從一個具備較高不可預測性(高小熵)分佈中選取的,不可能以小於
的時間找到一個
,使
。分佈式
爲了引伸出工做量證實PoW的原理,考慮一個由哈希函數構成的解謎問題:已知哈希函數,一個高小熵分佈的值
以及目標範圍
,尋找
,使得
。函數
這個問題等價於須要找到一個輸入值,使得輸出值落在目標範圍內,而
每每是全部的輸出值的一個子集。實際上,若是一個哈希函數
的輸出位
位,那麼輸出值能夠是任何一個
~
範圍內的值。預約義的目標範圍
的大小決定了這個問題的求解難度。若是
包含全部
比特的串,那麼問題就簡單了,但若是
只包含一個元素,那麼這個求解是最難的,至關於給定一個哈希值,找出其中一個原像,原像不可逆的性質說明了這個難度。事實上,因爲
具備高小熵分佈,這確保了除了隨機嘗試
值以完成搜尋那個很大的空間外,沒有其餘有效的途徑了。區塊鏈
哈希函數的難題友好性構成了基於工做量證實的共識算法的基礎。經過哈希運算得出的符合特定要求的哈希值,能夠做爲共識算法中的工做量證實。這裏比特幣的安全保證依賴於哈希函數的安全性,若是哈希函數被攻破,能夠想象Pow共識算法就失效了,不用算力達到就能夠攻擊了。.net
小熵(min-entropy)是信息理論中衡量某個結果的可預測性的一個指標。高小熵值的是變量呈均勻分佈(隨機分佈)。若是咱們從對分佈的值進行隨機抽樣,不會常常抽到一個固定的值。例如,若是在一個128位的數中隨機選一個固定的數
,那麼選到該數的概率是
。3d
理解了難題友好性,就基本理解了PoW的原理。結合比特幣去理解PoW。比特幣PoW的過程,就是將不一樣的nonce值做爲輸入,嘗試進行SHA256哈希運算,找出知足給定數量前導0的哈希值的過程。要求的前導0的個數越多,表明難度越大。比特幣節點求解工做量證實問題的步驟概括以下:
1)生成鑄幣交易,並與其餘全部準備打包進區塊的交易組成交易列表,經過Merkle樹算法生成Merkle根哈希;
2)把Merkle根哈希及其餘相關字段組裝成區塊頭,將區塊頭的80字節數據做爲工做量證實的輸入;
3)不停地變動區塊頭中的隨機數nonce,並對每次變動後的區塊頭作雙重SHA256運算,將結果值與當前網絡的目標難度作比對,若是知足難度條件,則解題成功,工做量證實完成。該礦工得到記帳權,生成新區塊並廣播到全網。
歡迎關注微信公衆號,推送區塊鏈、分佈式、Rust、Linux等技術分享!
![]()