區塊鏈時代的拜占庭容錯:Tendermint(一)

本文節選自:《Tendermint: Byzantine Fault Tolerance in the Age of Blockchains》算法

原文做者:Ethan Buchman數據庫

譯者:饒雲坤編程

校對:傅曉波安全

譯者注:網絡

Tendermint是一個分佈式系統狀態複製引擎,用於在多臺機器安全一致地複製一個應用。所謂安全性,指的是即便有多達1/3的機器出現任意故障的狀況下, Tendermint仍然可以正常工做。所謂一致性,指的是每個正常工做的機器都會有着一樣的交易日誌,計算相同的狀態。安全一致的複製是分佈式系統中一個基本原則問題,它在各類應用程序(從貨幣到選舉,到基礎設施規劃等)中的普遍應用的容錯能力方面承擔了極其重要的做用。架構

Tendermint被設計成易於使用、易於理解,且性能優異,適用於普遍的分佈式應用。併發

 

分佈式共識系統成爲現代互聯網基礎設施中的一個關鍵組件,正助力於每個主要的互聯網應用。本章節內容介紹了必要的背景材料來理解和探討這些系統。app

 

複製狀態機(Replicated State Machine)框架

最多見的用來研究和實施分佈式共識(distributed consensus)的範例的是複製狀態機的範例,其中,一個肯定的狀態機在數個進程(processes)之間被複制,這樣無論部分進程是否失敗,這些進程看上去像單個狀態機。狀態機有一些列輸入驅動,這些輸入被稱做交易(transactions),每個交易根據其是否有效,可能引發一個狀態遷移並返回一個結果。更正式的,交易爲數據庫上的原子操做(atomic operation),意味着其要麼完成要麼根本就沒有發生,不能返回一箇中間狀態( intermediate state)。狀態交易邏輯(state transition logic)由狀態機的狀態轉移函數決定,這個函數映射了一個交易和目前的狀態到一個新的狀態和一個返回值。狀態轉移函數有時也被稱爲應用邏輯(application logic)。異步

訂購交易(order the transactions)而且將相應的交易日誌( transaction log )複製到每個進程是共識協議的責任。使用一個肯定的(deterministic)狀態轉移函數意味着在給定一樣的交易日誌的狀況下,每個進程將計算出相同的結果。

複製狀態機架構如圖2.1所示。

圖2.1

圖2.1 一個複製狀態機在多個機器之間複製了一個交易日誌和結果狀態。交易從客戶端接受,運行了共識協議,在交易日誌中訂購(ordered),最後執行獲得最新狀態。在圖中,每個菱形表明了單個機器,其中,虛線表明機器間的通信用來承載進行訂購交易( ordering transactions)的共識協議。

Tendermint的目標是建立一個通用目的,高性能,安全和健壯的複製狀態機。

 

不一樣時性(Asynchrony)

容錯複製狀態機(fault-tolerant replicated state machine)的目的是在對上層提供服務的時候,協調網絡中的計算機的同步,無論是否存在故障節點。

保持同步意味着成功複製交易日誌;提供一個有用的服務意味着在處理新交易的時候保持狀態機的可用性。傳統上系統的這些方面被各自成爲安全性(safety)和可用性(liveness)。通俗地,安全性意味着沒有任何壞的事情發生;可用性意味着好的事情最終發生。安全違規( violation of safety)意味着存在兩個或者更多的有效的,競爭的交易日誌。可用性違規(violating liveness )意味着一個沒法響應的網絡。

經過接受全部的交易能夠很容易來知足可用性。經過不接受任何交易能夠很容易來知足安全性。所以,狀態機複製算法能夠被看做在二者之間的一個平衡。通常地,進程在提交一個新的交易在以前,須要對來自於其餘進程的信息設立一個閾值。在同步的環境中,咱們對網絡消息的最大延遲或者處理器時鐘的最大速度做出假設,經過輪流坐莊來提議新的交易,進行大多數投票表決,若是提議者在同步假設的區間內並無產生任何提議,則跳過(skip)提議者的這一回合。

在一個異步的環境中,沒有關於網絡延遲或者處理器速度的保證的假設,權衡將變得更爲困難。事實上,所謂的FLP不可能性結果(FLP impossibility result)證實了在肯定的異步進程(單個進程可能會崩潰)之間的分佈式共識的不可能性。該證實意味着,由於進程可能失敗,存在協議的有效執行,但進程剛好在某一時間崩潰這樣就阻止了共識。所以,咱們對共識沒有任何保證。

通常地,協議中的同步是經過管理某些交易時用到的超時(timeouts)來進行的。在異步環境中,消息可以被任意延遲,依賴同步來確保安全性的話可能致使交易日誌的分叉。依賴同步來保證系統的可用性可以引發共識的宕機,而且服務沒法響應。前者一般被看做更爲嚴重,由於調解衝突日誌多是一個使人生畏或者不可能的任務。

實際上,僅當消息延遲可以被良好的定義和控制的時候,同步解決方案纔會被使用,例如在一架飛機上的控制器之間,或者利用同步的原子時鐘的數據中心之間。所以,儘管存在不少高效的同步解決方案,計算機網絡的通常化的不可靠性(general unreliability)太大以致於不能實際投入使用而不顯著增長額外的成本。

根本上有兩種途徑來克服FLP不可能性結果。第一個是採用更強的同步假設-甚至至關弱的假設也是足夠的,例如,那個惟一的最終崩潰的進程被懷疑崩潰了,正確的進程不受影響。通常地,這個方法利用leaders,其扮演了一個特別的協做的角色,而且在超時並被認爲發生故障了之後能夠被跳過。實際上,這樣的領導選取機制成功運轉起來很難。

第二種克服FLP的方法是使用非肯定性的-包含隨機化元素,這樣達成共識的可能性接近爲1。儘管第二種方法更智能而且某些高級加密技術近些年來取得了速度上的提升,依賴隨機化的方法一般更慢。

 

廣播和共識

爲了讓一個進程複製狀態到其它進程上,它必須有基本通信原語的權限來容許其傳播或者傳遞信息。一個最有用的原語是可靠廣播(reliable broadcast)。可靠廣播(RBC)是一個廣播原語知足以下特性,對消息m,有:

有效性(validity) - 若是一個正確的進程廣播m,它最終成功傳達了m

一致性(agreement) - 若是一個正確的進程成功傳達了m,全部最終全部的進程成功傳達m

完整性(integrity) - m只傳遞一次,而且是以廣播的形式被髮送者發送出去

本質上,可靠廣播使得消息最終到達全部的進程一次。

另外,更有用的原語是原子廣播( atomic broadcast(ABC)),其知足可靠廣播(RBC)和另外的一個屬性:

總的順序(total order) - 若是正確的進程p和q分別傳遞出m和m',p傳達m在m'以前,那麼q傳達m在m'以前

原子廣播是一個可靠的廣播,其中值(values)以相同的順序被髮送到每一個機器上。注意到這實際上覆制交易日誌的問題。通俗地講,該問題能夠被稱做共識,共識原語的標準定義知足如下條件:

終止性 - 每一個正確的進程最終能作出決定

完整性 - 每一個正確的進程最多隻作出決定一次

一致性 - 若是一個進程作出了v1的決定, 而且另一個進程作出了v2的決定,那麼v1=v2

有效性 - 若是一個正確的進程作出了v的決定,至少一個進程提議了v

直觀地,共識和原子廣播看上去十分相似,主要的差別在於,原子廣播自己做爲一個協議是連續的,然而共識指望終止。這就是說,每個能夠精簡爲另外一個。共識能夠被精簡爲原子廣播經過決定第一個原子廣播的值。原子廣播能夠精簡爲共識,經過依次運行許多共識協議的實例,然而存在一些微妙的考量,特別是在處理拜占庭故障方面。一個完整的參數空間的關於原子廣播精簡爲共識的描述仍然是一個開放的研究話題。

歷史上,儘管大多數用例實際上須要原子廣播,採用的最爲普遍的算法是稱做Paxos的共識算法,在90年代介紹而且證實該算法正確性的是Leslie Lamport。Paxos同時賦予和困惑了共識科學,一方面提供了第一個真實世界的,實用的,容錯的共識算法,另外一方面又難於理解和解釋。算法的具體實現使用了其專門的技術來從Paxos創建原子廣播,使得這個生態難於操縱,理解和利用。不幸的是,幾乎沒有任何工做使得提升該框架更容易理解,儘管有嘗試來描繪解決方案中的各類困難。

在2013年,Ongaro和 Ousterhout發表了Raft,一個狀態機複製算法,其主要的設計動機是可理解性。與其從一個共識算法開始,而且嘗試創建原子廣播,Raft的設計首先考慮的是交易日誌,尋求正交組件,其組合在一塊兒來提供最終的原子廣播,儘管其不是被這樣描述的。

Paxos是工業領域的主要共識算法,在工業領域像亞馬遜,谷歌和其餘擴建了高可用性全球互聯網服務的公司。Paxos 共識位於應用程序棧的底部,提供了資源管理和分配的一致接口,操做在一個更慢的時標相比於其餘面對用戶的高可用性應用程序。

Raft登場以來獲得了普遍的採用,特別是在開源社區,其具備多個主流語言的實現,而且在多數項目中做爲其主幹。

Raft與Paxos在設計方面主要的不一樣是先聚焦於交易日誌,而不是單個值,特別是容許一個leader持續提交交易直到其卸任,這時領導選舉開始生效。在某種程度上,這相似於在區塊鏈中採用的方法,儘管其主要優點是可以容忍不一樣種類故障。

 

 拜占庭容錯(Byzantine Fault Tolerance)

區塊鏈經過在共享數據庫上責任的去中心化,減小了對手方風險,所以被稱爲「信任機器」。比特幣由其具備的抵抗任何攻擊和惡意行爲的能力而著稱。傳統地,容忍惡意行爲的共識協議被稱爲拜占庭容錯共識協議(Byzantine Fault Tolerant )。術語「拜占庭」被使用,源於拜占庭將軍們面對的相似問題,這些將軍們嘗試相互協調來攻擊羅馬,使用惟一的信使,其中一個將軍多是叛徒。

在一個崩潰故障中,一個進程可能宕機。在一個拜占庭故障中,故障節點能作任何事情。崩潰的故障更容易處理,由於沒有進程會對其餘進程說謊。只存在崩潰故障的系統能夠經過簡單的多數決定規則( majority rule)來操做,所以一般可以同時容忍近一半的系統故障。若是系統可以容忍失敗的數量是f,這樣系統必須至少有2f+1個進程。

拜占庭故障複雜一些。在一個具備2f+1進程的系統中,若是f是拜占庭,這些拜占庭節點能夠協做來講任何事情對另外f+1的進程。例如,咱們嘗試取得單比特共識,而且f=1,因此咱們有N=3個進程,A,B,C,其中C是拜占庭,如圖2.2所示。C能夠告訴A這個值是0,告訴B這個值是1。若是A贊成它是0,B贊成它是1,那麼他們都將認爲他們得到了大多數,提交,這樣就違反了安全條件。所以,拜占庭系統可以容忍的故障上限小於非拜占庭系統。

圖2.2

圖2.2 一個拜占庭進程C,告訴A一件事,告訴B另一件,導致他們得出關於網絡的不一樣的結論。這裏。簡單的大多數投票致使了安全違規,源於單個拜占庭進程。

事實上,能夠證實拜占庭故障的上限爲f<N/3。所以,爲了單個拜占庭進程,咱們至少須要N=4個節點。那麼故障進程就不能像當N=3時那樣分裂投票。

在1999年,Castro 和 Liskov 發表了實用拜占庭容錯(Practical Byzantine Fault Tolerance),提供了第一個優化的適用於實際的拜占庭容錯算法。其爲工業系統中拜占庭容錯的實用性設定了一個新的先例,每秒能夠處理成千上萬比交易。除此以外,拜占庭容錯仍然是被人認爲是昂貴的,大部分時間是沒必要要的,而且最流行的實現很難創建在其上面。所以,儘管學術對其興趣日增,包括大量提升了的變種,但在實施和配置方面並無太多進展。進一步,若是網絡中超過1/3的節點是拜占庭,PBFT將不能提供任何保證。

 

密碼學,信任和經濟學

根本上說,容錯這個問題起源於缺少信任 - 不知道一些進程將如何表現(behave)。正式地,信任須要從理論上被定義成一種信息,其做爲一種減小世界模型熵的手段-信任某我的就是樂觀地減小這我的對於這個世界的不肯定性,使得能夠把注意力放在更高階的組織層面上。

密碼學原語從根本上與信任問題相關,主要被定義爲容許熵大量減小的機制-成功認證一個密碼學函數把一個可能結果的分佈坍縮成一個點,或者在一些例子中一些少許的結果。

它是作所周知的有着更好制度信任的文明,例如法治具備更高的生產率和更充滿生氣的經濟。結果產生了一個直觀的感受,可以更多的信任相互做用,減小可能結果的空間,其須要被主動建模,使其更容易協調。不幸的是,評價現代機構的信譽愈來愈困難,由於他們的複雜度在近些年增長了不少,增長了可能性,其聲稱的肯定性是幻覺。

幸運的是,密碼學造成了社會中心的信任體系的基礎,奇蹟大地提升了人類在全球範圍內協做的能力,因爲減小了欺騙和無責任行動的風險。比較有趣的是密碼學原語在BFT算法中的重要性,爲了認證和散播不肯定性。

最有趣的是,經濟機制也能看成減小熵的一種方式,迄今爲止經濟代理能夠被激勵-更有可能被用來執行一個特定的行爲。比特幣深刻的洞察是密碼原語能夠與經濟激勵結合起來有效減小公共共識網絡的熵來取得狀態安全複製。

更正式的信任的信息理論根基,密碼學,共識和經濟學和他們之間的關係的調查將會在之後的工做中展開。

 

區塊鏈

區塊鏈的核心是一個關於拜占庭容錯原子廣播的聚焦完整性的方法。例如,比特幣區塊鏈結合了經濟學和密碼學隨機化來提供一個強的機率保證,保證安全違規不會發生,給定了一個弱同步假設,即區塊間的通信比產生哈希碰撞更迅速。實際上,然而,衆所周知,比特幣的安全保證容易受到各類狡猾(subtle)的攻擊。

區塊鏈從兩個關鍵的優化中獲得它的名字,其利用這兩個優化解決了原子化廣播的問題。第一個是交易以塊爲單位進行分組來分攤高提交延遲(在10min量級)。第二個優化是經過加密哈希把區塊連接起來成爲一個不可篡改的鏈,這樣就很容易驗證歷史記錄。兩個優化都相對於原始的BFT-ABC的有所提升,前者提升了性能,後者提升了容錯。

通過這幾年的發展,使用哈希連接交易塊並以原子廣播發送出去已經成爲公共的區塊鏈共識算法。據做者所知,Tendermint是第一個這樣的提議,升級了知名的80年代的BFT算法,成爲了自成體系的共識算法。Tendermint被IBM跟進,IBM升級PBFT到區塊鏈,JP摩根升級了一個Raft的BFT版本。

 

過程演算

各個部分同時執行的分佈式系統,因難以設計、構建和調試而飽受詬病。它們更難以正式驗證,由於大多數技術的形式驗證,以及實際上很是基礎的計算機科學,都是經過推算獲得的,所以很難正式驗證。

過程演算是一種爲併發計算提供了有條理的基礎原理的模型系列。最一般的演算方法,Communicating Sequential Processes(CSP)構成了許多現代編程語言的理論基礎。好比Go語言,在設計中包含了併發原語。

咱們可使用一個正式的邏輯來表達一個過程可能知足的屬性。舉例來講,模態Hennessy–Milner邏輯能夠表示,在某些或全部形式的動做發生後,一個進程將知足其餘一些邏輯表達式。經過將更復雜的運算方法添加到邏輯中,能夠創建正式的系統,能夠很容易地描述分佈式系統的重要屬性,好比安全性、可用性和本地化等。經過π-calculus編寫的系統能夠被正式驗證,以知足使用模型檢查軟件的相關屬性。

當咱們使用π-calculus來詳細說明Tendermint算法時,咱們會使用相關的正式邏輯,以及相應的屬性驗證,以備未來的工做。

 

 Tendermint的需求

比特幣及其衍生物的成功,特別是以太坊和他們的關於安全,自治,分佈式,對任意代碼的容錯執行的前景引發了事實上每個主要的金融機構的興趣。特別地,出現了對兩種種區塊鏈技術:一方面是公鏈,被親切地稱爲Big Dad公鏈(Big Bad Public Blockchains),其協議被內建經濟激勵經過原生貨幣(native currency)的方式所支配。另外一方面是所謂的私有鏈,更準確的被稱爲「聯盟鏈」( consortia blockchains),經過哈希樹的使用,數字簽名,p2p網絡和增強的問責制,其對傳統共識和拜占庭算法有必定的提升。

就像現代社會的基礎設施持續的去中心化或者正如商業的跨組織本質,對透明,問責和高性能的拜占庭系統的需求愈來愈多,這個系統支持的應用程序從財政到域名註冊到電子投票和與治理的高級機制協做和將來的演進。Tendermint這個解決方案對聯盟或者跨組織邏輯進行了優化,可是足夠靈活來容納任何人,從私有企業到全球貨幣,而且性能足夠高來與主要的,非拜占庭容錯的,共識解決方案競爭例如 etcd, consul, and zookeeper,於此同時提供了更強的恢復性,安全保證,對應用開發者的靈活性。

相關文章
相關標籤/搜索