比特幣共識算法PoW

談到哈希算法,每一個程序員都不陌生,可是談到比特幣共識算法PoW,若是沒有接觸過的技術人員可能以爲應該會很複雜,畢竟全球的比特幣節點數量如此龐大,達成共識的算法應該不會很簡單。但其實若是你已掌握哈希算法,幾分鐘內你就能理解PoW。爲了更好的說明PoW的原理,咱們再把哈希算法及相關概念描述一下:程序員

哈希函數相關概念

  • 哈希函數——是一類數學函數,能夠在有限合理的時間內,將任意長度的消息壓縮爲固定長度的二進制串,其輸出值稱爲哈希值。
  • 碰撞定義——是指兩個不一樣的消息在同一哈希函數做用下,具備相同的哈希值。
  • 哈希函數的安全性——是指在現有的計算資源(包括時間、空間、資金等)下,找到一個碰撞是不可行的。
  • 抗弱碰撞性——對於給定的消息M_1,要發現另外一個消息M_2,知足H(M_1)=H(M_2)在計算上是不可行的。
  • 抗強碰撞性——找任意一對不一樣的消息M_1M_2,使H(M_1)=H(M_2)在計算上是不可行的。
  • 雪崩效應——當一個輸入位發生變化時,輸出中的每一位均有50%的機率發生變化。

哈希算法就是以哈希函數爲基礎構造的,經常使用於實現數據完整性和實體認證。一個優秀的 hash 算法,將能實現:算法

  • 正向快速:給定明文和 hash 算法,在有限時間和有限資源內能計算出 hash 值。
  • 逆向困難:給定(若干) hash 值,在有限時間內很難(基本不可能)逆推出明文。
  • 輸入敏感:原始輸入信息修改一點信息,產生的 hash 值看起來應該都有很大不一樣。
  • 衝突避免:很難找到兩段內容不一樣的明文,使得它們的 hash 值一致(發生衝突)。

哈希函數的性質

抗碰撞性

哈希函數的抗碰撞性是指尋找兩個可以產生碰撞的消息在計算上是不可行的。但找到兩個碰撞的消息在計算上不可行,並不意味着不存在兩個碰撞的消息。哈希函數是把大空間上的消息壓縮到小空間上,碰撞確定存在。只是計算上是不可行的。例如,若是哈希值的長度固定爲256位,顯然若是順序取1,2,\cdots,2^{256}+12^{256}+1個輸入值,計算它們的哈希值,確定可以找到兩個輸入值,使得它們的哈希值相同。安全

原像不可逆

原像不可逆,指的是知道輸入值,很容易經過哈希函數計算出哈希值;但知道哈希值,沒有辦法計算出原來的輸入值。微信

難題友好性

難題友好性指的是沒有便捷的方法去產生一知足特殊要求的哈希值。網絡

一個哈希函數H稱爲難題友好的,若是對於每一個n位的輸出y,若k是從一個具備較高不可預測性(高小熵)分佈中選取的,不可能以小於2^n的時間找到一個x,使H(k||x)=y分佈式

爲了引伸出工做量證實PoW的原理,考慮一個由哈希函數構成的解謎問題:已知哈希函數H,一個高小熵分佈的值value以及目標範圍Y,尋找x,使得H(value||x) \in Y函數

這個問題等價於須要找到一個輸入值,使得輸出值落在目標範圍Y內,而Y每每是全部的輸出值的一個子集。實際上,若是一個哈希函數H的輸出位n位,那麼輸出值能夠是任何一個0~2^n範圍內的值。預約義的目標範圍Y的大小決定了這個問題的求解難度。若是Y包含全部n比特的串,那麼問題就簡單了,但若是Y只包含一個元素,那麼這個求解是最難的,至關於給定一個哈希值,找出其中一個原像,原像不可逆的性質說明了這個難度。事實上,因爲value具備高小熵分佈,這確保了除了隨機嘗試x值以完成搜尋那個很大的空間外,沒有其餘有效的途徑了。區塊鏈

哈希函數的難題友好性構成了基於工做量證實的共識算法的基礎。經過哈希運算得出的符合特定要求的哈希值,能夠做爲共識算法中的工做量證實。這裏比特幣的安全保證依賴於哈希函數的安全性,若是哈希函數被攻破,能夠想象Pow共識算法就失效了,不用算力達到51\%就能夠攻擊了。.net

小熵(min-entropy)是信息理論中衡量某個結果的可預測性的一個指標。高小熵值的是變量呈均勻分佈(隨機分佈)。若是咱們從對分佈的值進行隨機抽樣,不會常常抽到一個固定的值。例如,若是在一個128位的數中隨機選一個固定的數n,那麼選到該數的概率是1/2^{128}3d

PoW共識算法

理解了難題友好性,就基本理解了PoW的原理。結合比特幣去理解PoW。比特幣PoW的過程,就是將不一樣的nonce值做爲輸入,嘗試進行SHA256哈希運算,找出知足給定數量前導0的哈希值的過程。要求的前導0的個數越多,表明難度越大。比特幣節點求解工做量證實問題的步驟概括以下:

1)生成鑄幣交易,並與其餘全部準備打包進區塊的交易組成交易列表,經過Merkle樹算法生成Merkle根哈希;
2)把Merkle根哈希及其餘相關字段組裝成區塊頭,將區塊頭的80字節數據做爲工做量證實的輸入;
3)不停地變動區塊頭中的隨機數nonce,並對每次變動後的區塊頭作雙重SHA256運算,將結果值與當前網絡的目標難度作比對,若是知足難度條件,則解題成功,工做量證實完成。該礦工得到記帳權,生成新區塊並廣播到全網。

歡迎關注微信公衆號,推送區塊鏈、分佈式、Rust、Linux等技術分享!

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