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

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

原文作者:Ethan Buchman

譯者:饒雲坤

校對:傅曉波

譯者注:

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

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

 

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

 

複製狀態機(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,於此同時提供了更強的恢復性,安全保證,對應用開發者的靈活性。

 

對共識科學和相關算法的更全面的討論參見本系列後續發表在此號的博文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章