當前位置:
首頁 > 最新 > PBFT——實用拜占庭容錯演算法

PBFT——實用拜占庭容錯演算法

你一覺醒來,發現自己沒躺床上,而是站到皇帝身邊,變成貼身侍衛。皇帝合上奏摺,扭頭問你:甘肅有沒有旱災?

你剛來,不熟悉業務,但欺君是罪,只好抱著問題溜出門,幸虧遇到三位大臣圍在門口點煙,於是你湊前一步說:皇上讓我問問你們,甘肅有旱災?

兩個大臣連忙點頭,但另一個卻吐出兩個煙圈,笑而不語。

你的挑戰才剛剛開始——到底有沒有旱災?

按照PBFT共識演算法,你應該馬上挽起兩位點頭大臣的手臂,找皇上彙報:甘肅確有旱災一事。因為已達成2/3多數的共識,但且慢一步,先搞清楚一件事:

一、什麼是PBFT?

將軍喻指網路節點,解決拜占庭將軍問題就要祭出一個概念:拜占庭容錯。

網路節點總有錯誤,它們可能是叛徒(惡意節點),也可能是傻子(故障節點),各節點並不能確保收到的信息沒被做過手腳。「拜占庭容錯」指在分散式系統里容下這些「錯」的同時,又能達成正確的共識。

我們已經熟悉經典的拜占庭容錯解決方案:POW演算法——使用工作量證明找隨機數。

如果你讀過專欄第一季的文章,就能體驗到那場面的轟轟烈烈:腱鞘炎都快翻出來了,但隨機數還是很難找到。可一旦找到隨機數,硬邦邦的事實就戳在地上,誰都無法撼動。

很安全,但是沒效率。

PBFT只是嫌棄傳統方案不實用而已,所以增加一個假設,千萬別小看這個假設,它把原本鋪漫到天邊的工作量變成幾乎不需要工作量,這個假設就是:不良節點不超過節點總數的1/3

最終,從效率角度望過去,拜占庭將軍問題的傳統解法POW在PBFT這種火箭推進器面前頓時灰頭土臉,像台燒劈柴的鍋爐。

那PBFT具體是如何運作的?

二、PBFT的運作過程

PBFT共識演算法的全過程分五步:第一步是「請求」,相當於客戶端發出讀寫需求,第五步是「答覆」,相當於系統給客戶端的最終答覆。

真正達成共識的是中間三步:

第二步:你問大臣(預準備

第三步:大臣回答(準備

第四步:官僚系統間再次確認(確認

PBFT把你和所有大臣(全網節點)稱為「副本」,而你是最重要的副本,即「主節點」,負責從大臣們處搜集信息,統籌分發確認,最終牽頭答覆。

主節點向全網廣播,這個過程就是預準備。預準備的關鍵是分發,主節點為每個請求編上號,然後群發向所有副本。

圖1 PBFT演算法的前兩步:請求和預準備

預準備消息(圖1右側三個箭頭)含有請求的數字簽名(戳此複習),這使得其他副本很容易驗證真偽。

通過驗證後進入準備階段:此時,副本向全網廣播它自己的答覆。為防惡意攻擊,副本把預準備消息和準備消息都記在自己的小本子上。如果看預準備消息不順眼,就什麼都不做。

圖2PBFT演算法的前三步:請求、預準備和準備

準備階段最重要的事:確保所有正常節點達成一致

但總有不一致的節點,比如那位只吐煙圈不吐字的大臣(副本3),PBFT將這種沒有響應的節點視作失效。處理失效節點是下一步「確認階段」要做的事。

進入確認階段,副本首先驗證消息的數字簽名,廣播確認後,主節點負責統計共識,說白了,你只做一件事:統計出達到系統節點總數2/3的共識,這個共識就是最終答覆。

你發現:兩票點贊,一票失效,於是主節點在圖3右側雙虛線處敲定共識:甘肅有旱災。

圖3 PBFT的完整過程

最後,進入答覆環節,主節點和其他正常副本一起答覆客戶端,整個過程都在全網監督下一氣呵成,「一氣呵成」的意思是一秒鐘完成。

但你可能會提個問題:如果主節點不按規矩辦事系統會怎麼辦?即,圖3左下角的「×」畫在主節點上,那系統又該如何應對?

我們稱這種情況為「主節點失效」,一旦遇到主節點失效時,系統的應對方案很簡單:變更視圖

什麼是視圖?視圖即節點排位,變更視圖就是其他副本確認主節點出問題後,立即認副本1為主節點,原主節點到後面去排隊,變成副本3。

圖4 變更視圖示例

當主節點無法執行請求時,副本必須變更視圖,這樣才能保持系統活性,關於變更視圖條件有三點說明:

第一,至少確保2/3多數的正常節點在同一視圖中,換句話說,如果共識未超越2/3多數,主節點就跑去答覆客戶端,副本就會認定主節點失效。

第二,請求編號必須在系統規定的範圍內。還記得在預準備環節里,主節點要給請求分配編號才能廣播么?設計這一編號,本來是為便於相互確認,否則請求一多就會對不上賬,但這也給主節點擾亂系統的留下一個後門:故意分配超大編號,塞爆內存。

應對方案也很樸素,設一個編號上限就ok,這個上限稱為「水線」。一旦副本發現請求編號超出水線範圍,就會認定主節點失效。

第三,必須定義出超時的時長,不能讓副本無底線地等待;

為滿足這點要求,每當副本收到一個請求,就開始計時,直到副本做出最終答覆計時才停止。如果超過系統設定的響應時間,而沒有看到主節點答覆客戶端,副本就會認定主節點失效。

於是,系統始終能夠應對主節點失效:好好乾活你就是中心,一旦作假或怠工,找人換你只是下一秒的事,這就是PBFT演算法的核心邏輯

作者把PBFT說成了花,那它有沒有軟肋呢?

你一定看出來了,如果湧進足夠多的不良節點(超過總節點的1/3),則網路勢必奔潰,因為根本假設已不成立,所以基於PBFT構建的網路不能像比特幣網路一樣完全開放。

於是,我們必須引入一個新概念:

三、許可鏈

指經許可才能接入的鏈。

小規模的許可鏈就像私家莊園,稱為私有鏈;較大規模的許可鏈就像經濟開發區內的企業集群,我們稱之為聯盟鏈。不管是私有鏈還是聯盟鏈,入網都必須經過有權人核准。

與許可鏈對應的概念就是公有鏈(公鏈),公有鏈的代表是比特幣,任何節點都能隨時出入、隨時讀取,賬本全公開,沒有私密性。

而許可鏈則在地上圍了一圈籬笆,你想進來嗎?先拿到批准再說,所以私密性好。

當然,和公有鏈相比,許可鏈的安全性就短了一截。比如就在4天前,基於PBFT開發的應用Ripple就被曝永久丟失32570個區塊,這意味著沒有人能夠審核Ripple的完整區塊鏈。

雖然當事方稱未對普通用戶造成影響,但和比特幣平穩運行9年多相比,安全性瞬間矮下一頭。甚至有人稱Ripple的PBFT共識機製為「沒有必要又毫無意義的煙霧鏡像」。

沒有錯,PBFT演算法並不是去中心化的共識,而是中心化的控制,這就是為什麼很多人並沒有把Ripple的代幣XRP劃為去中心化貨幣的原因。

但PBFT的效率終究秒殺POW,所以幾乎所有的大型金融項目都傾向使用PBFT構建聯盟鏈,那這麼做對我們有什麼好處呢?

舉個小例子:傳統跨境支付需要3-5天,而基於PBFT的Ripple搞定同樣的事只需3-5秒,同時費用下降50%以上。

你看,不管是去中心化還是中心化,足夠先進的科技,都和魔法無異。

結語

1779年,和珅上表乾隆,西征軍在甘肅遇澇,行軍延期。皇帝合上奏摺,心中蹊蹺不已,甘肅已報旱災多年,不僅減稅,而且開捐(賣官),所得全部賑濟災民。

1781年,甘肅布政司王亶望被處斬,陪他一起被誅的還有56名官員,乾隆親手終結清史上最轟動的欺上瞞下運動——甘肅冒賑案。

原來,鏈並不會因為私有而安全,如果缺乏足夠的信息迴路,PBFT演算法就會失效,古代官場就是一個例子。

雖然皇帝端坐權力系統中央,但他並不居於信息系統中心,皇帝只是一個與信息系統若即若離的客戶端,在本文的例子中,你才是信息系統的君王

官僚體系本質上是權力系統,但它同時也是信息系統。皇帝要了解民情,得通過官僚,民情想上傳天聽,也得過官僚,而官僚內部的貪腐網路阻斷著上下政情。

而我們現代社會就不同,因為有更多的信息流,這讓信息系統從權力系統中獨立出來,最終使得傳統權貴的招數在現代社會根本玩不下去。

有人說根治腐敗得靠講道德,有人說嚴刑峻法更有效,還有人說只要貼上民主的膏藥就能藥到病除。但歷史證明,這些符合常人直覺的土辦法,都煉不出好鋼。

腐敗看起來是權力問題,但說到底是信息問題,只要我們鑿通更多的信息迴路,把更多事實擺在人們面前,把內部信息攤到陽光下一曬,自然能根治腐敗。

所以,想想這兩年清透很多的官場,難道是因為公務員們多上了兩節黨課、多抄了三遍黨章?還是因為全國人手一部智能手機?

一段視頻了斷一堆官員前途的故事,不應該被忘記。

本文從PBFT共識演算法分叉聊到治理腐敗,結論也就一句話,這句話同時也是區塊鏈的意義所在:

陽光是最好的殺毒劑

回到我們專欄的主題,考慮到難度已經爬坡,為讓你的思路更柔順,正文沒有鋪設一個英文單詞。

如果你想深扒一層,請自行對照文末辭彙表,這可以讓你更潤滑地閱讀PBFT演算法發明者的說明書:

http://pmg.csail.mit.edu/papers/osdi99.pdf

如果你不習慣看原文,可參考趣鏈科技聯合創始人、浙大博士李啟磊的文章:

http://blog.liqilei.com/bai-zhan-ting-gong-shi-suan-fa-zhi-pbftjie-xi/

其中不僅有對預準備、準備和確認三步的技術描述,而且一些小概念的精緻說明,如消息日誌、穩定檢查點和水線。

辭彙表

實用拜占庭容錯演算法(PBFT)

Practical Byzantine Fault Tolerance

拜占庭容錯(BFT)

Byzantine Fault Tolerance

工作量證明(POW)

Proof Of Work

客戶端 client 文中的皇帝

副本 replica 系統中的記賬節點,文中的官僚系統

主節點 primary 文中的你

備份 backup 即除主節點外的其他節點,當主節點失效時按序備份

視圖 view 「你-大臣1-大臣2-大臣3」的順位架構就是一種視圖

變更視圖 change view 主節點失效時的系統策略

活性 liveness 主節點沒失效,就說明系統有活性

消息日誌 message log

水線 watermark

穩定檢查點 stable checkpoint

請求 request

預準備 pre-prepare

準備 prepare

確認 commit

答覆 reply

為便於你理解,和上篇講述DPOS的文章一樣,作者把共識確認條件從2/3+1多數簡化為2/3,因為當節點數足夠多時,2/3+1多數≈2/3多數。

另外,實際場景中不可能只有4個節點,更可能是40個、400個或者更多,你可以把本文的例子推廣到9個大臣,然後在A4紙上推演一遍五步過程和視圖變更。

因為這樣你就能輕而易舉地發現:正文變更視圖的案例好不嚴謹——4個副本一旦變更視圖,只剩2個正常副本,另外2個是失效節點:吐煙圈的大臣和你。所以,這局視圖根本玩不下去。

如果用9個節點推演就不存在這樣的問題,相信我,在A4紙上推演一遍,你一定能徹底理解PBFT。

祝你每周都有進步。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 操作大腦 的精彩文章:

TAG:操作大腦 |