1. 程式人生 > >共識演算法-PoW(工作量證明)演算法

共識演算法-PoW(工作量證明)演算法


title: 共識演算法-PoW(工作量證明)演算法
tags: 區塊鏈,共識演算法


PoW

        區塊鏈其實就是一個基於網際網路去中心化的賬本,每個區塊相當於一頁賬本,它記錄了交易內容。因為比特幣是一個去中心賬本,會引發記賬一致性問題。一致性問題就是所有的區塊,記賬內容可能不一樣。

        在比特幣系統中,每一個節點都要儲存一份完整交易資訊。但是應為每個節點的環境不同,會接受到不一樣的資訊,如果同時記賬,會導致賬本不一致。因此我們需要找出一個代表幫我們記賬,然後內容分享給其他節點,比特幣中通過競爭記賬的方法解決記賬系統的一致性問題。

        在比特幣系統中,大約每10分鐘進行一輪算力競賽,競賽的勝利者,就獲得一次記賬的權力,並向其他節點同步新增賬本資訊。因此在比特幣中,中本聰設定了只要完成記賬的節點給予一定的比特幣作為獎勵,因此大家把記賬形象的稱為“挖礦”。

        那麼怎麼判斷競爭勝利(記賬成功)呢? 中本聰採用了一個PoW(工作量證明)演算法來進行判斷。工作量證明,顧名思義就是提供一個工作多少的證明。那麼這個證明是怎麼來的呢?

        說工作量證明怎麼來之前我們先說下Hash演算法,Hash演算法有一個特性:通過hash加密的文字或檔案,哪怕只有一個位元組改變,Hash的值就完全不相同。在區塊鏈中,需要找出一個Nonce,Nonce的值和區塊上的資訊拼接後進行hash計算,當hash值滿足給定條件,第一個找出nonce的節點獲得記賬權。這個找Nonce值計算Hash值的過程就是工作,找到滿足條件的Nonce值就是證明。

        舉個例子 ,假設我們區塊上的資訊是 blockchain ,我們要找出一個Nonce隨機數和blockchain拼接,最後計算的Hash值結果以6個0開頭,率先找到隨機數的節點就獲得此次記賬的唯一記賬權。
Hash值示例:

00000017504a984ab0339f7d1517691e63099fb83d6ae9d6ebd722c25755f2cc

計算量分析

        難度值度值是比特幣系統中的節點在生成區塊時的重要參考指標,它決定了節點大約需要經過多少次雜湊運算才能產生一個合法的區塊。比特幣的區塊大約每10分鐘生成一個,如果要在不同的全網算力條件下,新區塊的產生都基本保持這個速率,難度值必須根據全網算力的變化進行調整。簡單地說,難度值被設定在無論節點計算能力如何,新區塊產生速率都保持在每10分鐘一個。也就是說,如果區塊產生的速率比10分鐘快則增加難度,比10分鐘慢則降低難度。

        以我寫這篇檔案的時間來看,位元因為越來越少,所有難度越來越高,挖一個比特幣的成本需要3W多人民幣。為什麼成本這麼高呢?我們通過比特幣來簡單分析下挖礦難度有多大。Hash值是由數字和大小寫字母構成的字串,每一位有62種可能性,假設任何一個字元出現的概率是均等的,那麼第一位為0的概率是1/62(其他位出現什麼字元先不管),理論上需要嘗試62次Hash運算才會出現一次第一位為0的情況,如果前兩2位為0,就得嘗試62的平方次Hash運算,以n個0開頭就需要嘗試62的n次方次運算。

        我們以Block #544228為例,它當前hash為:000 000 000 000 000 000 14d90bb35d84eaf8b5ed2ae85f42b9d37c715ab3a02b06。 可以看到它前面有24個0,那麼理論上就需要嘗試 64^24 ,大概需要2.230074519853062e43 次這是一個非常大的數字,需要消耗很大的資源(電能、算力)。

PoW過程

        比特幣PoW的過程,可以簡單理解成就是將不同的nonce值作為輸入,嘗試進行SHA256雜湊運算,找出滿足給定數量前導0的雜湊值的過程。而要求的前導0的個數越多,代表難度越大。比特幣節點求解工作量證明問題的步驟大致歸納如下:

1.生成鑄幣交易,並與其他所有準備打包進區塊的交易組成交易列表,通過Merkle樹演算法生成Merkle根雜湊;
2.把Merkle根雜湊及其他相關欄位組裝成區塊頭,將區塊頭的80位元組資料作為工作量證明的輸入
3.不停地變更區塊頭中的隨機數,即nonce的數值,並對每次變更後的區塊頭做雙重SHA256運算(即SHA256,將結果值與當前網路的目標值做對比,如果小於目標值,則解題成功,工作量證明完成。

        比特幣的工作量證明,就是俗稱“挖礦”所做的主要工作。

        Merkle 可信樹是一棵完全二叉樹,應用 Merkle 可信樹需要計算並輸出Merkle 可信樹的每個葉子節點的認證路徑上的節點的雜湊函式值。

        上圖展示了一個具有4個交易記錄的 Merkle樹的根雜湊值的計算過程。首先以這4個交易作為葉子結點構造一棵完全二叉樹,然後通過雜湊值的計算,將這棵二叉樹轉化為Merkle樹。
首先對4個交易記錄:TxaTxc,分別計算各自的雜湊值HAHC,然後計算兩個中間節點的雜湊值HAB=Hash(HA+HB)和HCD=Hash(HC+HD),最後計算出根節點的雜湊值 ABCD=Hash(HAB+HCD)。

PoW共識記賬

在進行工作量證明之前,記賬的節點會做一些工作:
1.客戶端產生新的交易,向全網進行廣播要求對交易進行記賬
2.每一個記賬節點一旦收到這個請求,將收到的交易資訊納入一個區塊中
3.每個節點都通過PoW過程,嘗試在自己的區塊中找到一個具有足夠難度的工作量證明;
4.當某個節點找到了一個工作量證明,它就向全網進行廣播
5.當且僅當包含在該區塊中的所有交易都是有效的且之前未存在過的,其他節點才認同該區塊的有效性;
6.其他節點表示它們接受該區塊,而表示接受的方法則是在跟隨該區塊的末尾,製造新的區塊以延長該鏈條,而將被接受區塊的隨機雜湊值視為先於新區塊的隨機雜湊值。

PoW能否解決拜占庭將軍問題

        關於比特幣PoW共識機制能否解決拜占庭將軍問題一直在業界有爭議。2015年,Juan Garay對比特幣的PoW共識演算法進行了正式的分析,得出的結論是比特幣的PoW共識演算法是一種概率性的拜占庭協議(Probabilistic BA)。Garay對比特幣共識協議的兩個重要屬性分析如下。

  • 一致性(Agreement)

        在不誠實節點總算力小於50%的情況下,同時每輪同步區塊生成的機率很少的情況下,誠實的節點具有相同的區塊的概率很高。

  • 正確性(Validity)

        當不誠實算力具一定規模,超過51%,甚至不用接近50%的時候,比特幣的共識演算法並不能保證正確性,也就是,不能保證大多數的區塊由誠實節點來提供。這就是著名的51%算力攻擊。

        因此,我們可以看到,比特幣的共識演算法不適合於私有鏈和聯盟鏈。其原因首先是它是一個最終一致性共識演算法,不是一個強一致性共識演算法。第二個原因是其共識效率低,提供共識效率又會犧牲共識協議的安全性。

        PoW機制存在明顯的弊端。一是浪費大量的算力,只用來競爭挖礦權,並沒有更多實際或科學價值。二是它並不完全公平,當計算機硬體升級到一定程度,比如量子計算機可能幾秒就計算出了Hash值。