區塊鏈做爲一個去中心化的分佈式帳本系統,然而在實際運行中,怎麼解決由於去中心化後,保證整個系統能有效運行,各個節點誠實記帳,在沒有所謂的中心的狀況下,互相不信任的個體之間就交易的合法性達成共識的共識機制。算法
在分佈式系統中,各個不一樣的主機經過異步通訊方式組成網絡集羣。爲了保證每一個主機達成一致的狀態共識,就須要在主機之間進行狀態複製。異步系統中,可能會出現各樣的問題,例如主機出現故障沒法通訊,或者新能降低,而網絡也可能發生擁堵延遲,相似的種種故障有可能會發生錯誤信息在系統內傳播。所以須要在默認不可靠的異步網絡中定義容錯協議,以確保各主機達成安全可靠的狀態共識。因此,利用區塊鏈構造基於互聯網的去中心化帳本,須要解決的首要問題是如何實現不一樣帳本節點上的帳本數據的一致性和正確性。安全
常見的共識就機制包括:POW(工做量證實機制)、POS(權益證實機制)、DPOS(股份受權證實)POW+POS(混合共識機制)等等,另外還有Pool驗證池、Ripple瑞波共識協議等等網絡
比特幣的去中心網絡採用的是工做量證實共識機制。異步
去中心網絡之因此須要共識機制,是由於這是一個非基於信任(non-trust-based)的網絡,任何人無須許可均可以接入這個網絡。而且,這些節點分散在網絡條件差別很是大的全球互聯網之中。在徹底無中心的狀況下,這些節點要同步一致,共識機制即爲這些節點達成一致的機制。
關於分佈式網絡的共識機制,有著名的「Fisher-Lynch-Paterson 不可能結果」,即在必定條件下達成共識是不可能的。而比特幣的工做量證實共識機制在實踐中被驗證是有效的。這是由於它採用了一個實用主義的解決方案。分佈式
PoW(工做量證實機制) 共識機制
PoW(Proof of Work),即工做量證實,聞名於比特幣,俗稱「挖礦」。PoW是指系統爲達到某一目標而設置的度量方法。簡單理解就是一份證實,用來確認你作過必定量的工做。監測工做的整個過程一般是極爲低效的,而經過對工做的結果進行認證來證實完成了相應的工做量,則是一種很是高效的方式。PoW是按勞分配,算力決定一塊兒,誰的算力多誰記帳的機率就越大,可理解爲力量型比較。如下內容基於比特幣的PoW機制。
工做量證實( PoW )經過計算一個數值( nonce ),使得拼揍上交易數據後內容的 Hash 值知足規定的上限。在節點成功找到知足的Hash值以後,會立刻對全網進行廣播打包區塊,網絡的節點收到廣播打包區塊,會馬上對其進行驗證。
如何才能建立一個新區塊呢?經過解決一個問題:即找到一個nonce值,使得新區塊頭的哈希值小於某個指定的值,即區塊頭結構中的「難度目標」。
若是驗證經過,則代表已經有節點成功解迷,本身就再也不競爭當前區塊打包,而是選擇接受這個區塊,記錄到本身的帳本中,而後進行下一個區塊的競爭猜謎。網絡中只有最快解謎的區塊,纔會添加的帳本中,其餘的節點進行復制,這樣就保證了整個帳本的惟一性。函數
假如節點有任何的做弊行爲,都會致使網絡的節點驗證不經過,直接丟棄其打包的區塊,這個區塊就沒法記錄到總帳本中,做弊的節點耗費的成本就白費了,所以在巨大的挖礦成本下,也使得礦工自覺自願的遵照比特幣系統的共識協議,也就確保了整個系統的安全。性能
這道題關鍵的三個要素是工做量證實函數、區塊及難度值。工做量證實函數是這道題的計算方法,區塊決定了這道題的輸入數據,難度值決定了這道題的所須要的計算量。區塊鏈
首先看一下這道題究竟是什麼?這道題的目的在於算出一個值,且這個值小於目標值便可,這個值就是上圖中的上一個區塊的哈希值。加密
目標值 = 最大目標值 / 難度值(最大目標值恆定:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
新難度值 = 舊難度值 * ( 過去2016個區塊花費時長 / 20160 分鐘 )
tips:難度值是隨網絡變更的,目的是爲了在不一樣的網絡環境下,確保每10分鐘能生成一個塊。spa
那如何計算呢?SHA256(SHA256(Block_Header)),即只須要對區塊頭進行兩次SHA256運算便可,獲得的值和目標值進行比較,小於目標值便可。區塊頭結構以下:
區塊頭中有一個重要的東西叫MerkleRoot的hash值。這個東西的意義在於:爲了使區塊頭能體現區塊所包含的全部交易,在區塊的構造過程當中,須要將該區塊要包含的交易列表,經過Merkle Tree算法生成Merkle Root Hash,並以此做爲交易列表的摘要存到區塊頭中。
至此,咱們發現區塊頭中除過nonce之外,其他的數據都是明確的,解題的核心就在於不停的調整nonce的值,對區塊頭進行雙重SHA256運算。整個工做量證實過程以下:
PoW依賴機器進行數學運算來獲取記帳權,資源消耗大、共識機制高、可監管性弱,同時每次達成共識須要全網共同參與運算,性能效率比較低,容錯性方面容許全網50%節點出錯。
PoW的優勢:徹底去中心化,節點自由進出。
PoW的缺點:目前比特幣已經吸引全球大部分的算力,其餘再使用PoW共識機制的區塊鏈應用很難得到相同的算力來保障自身的安全;挖礦形成大量的資源浪費;共識達成的週期較長。
使用PoW的項目有:比特幣、以太坊前三個階段——Frontier(前沿)、Homestead(家園)、Metropolis(大都會)。以太坊的第4個階段,即Serenity(寧靜),將採用權益證實機制。
比特幣的工做量證實的關鍵特色是,它巧妙地融合技術和經濟因素,不僅是純粹經過技術自己來達到這一點,而是歸入了與自身做爲一個數字現金系統相關的挖礦獎勵。按《比特幣:技術驅動金融》一書的分析,比特幣的共識機制有兩個與過去不一樣的特色,咱們略作引伸討論。
在這樣一個加密數字貨幣應用中引入了經濟激勵,維護網絡的節點就能夠獲得有價值的比特幣做爲獎勵。
爲何比特幣網絡中的節點們願意打包交易、維護帳本?它們並不是出於「善意」,而是由於,它們能因這些挖礦行爲得到比特幣形式的經濟激勵。這是一個自行發行的電子現金系統的獨特優點,若是所開發的是其餘沒有自行發行代幣的 IT 系統,咱們就沒法設計礦工挖礦獎勵這樣的經濟激勵機制。
激勵挖礦節點參與挖礦的,除了與新區塊相關的獎勵以外,挖礦節點還能夠獲得區塊中包含的全部交易付出的交易費。但到目前爲止這個數值還較小,大概爲新區塊獎勵的 1%。
比特幣系統造成的共識不是徹底可靠的,可是在等待了 6 個區塊約 1 個小時以後,出問題的機率呈指數級降低。在 6 個區塊以後,一個交易發生雙花狀況的機率可被認爲是零。從純理論上看,完美的共識不可能達成,但從實用的角度看,這個共識是可信的。