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

買賣虛擬貨幣
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)狀態轉移函式意味著在給定同樣的交易日誌的情況下,每一個程序將計算出相同的結果。

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

如圖:一個複製狀態機在多個機器之間複製了一個交易日誌和結果狀態。交易從客戶端接受,執行了共識協議,在交易日誌中訂購(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,那麼他們都將認為他們獲得了大多數,提交,這樣就違反了安全條件。因此,拜占庭系統能夠容忍的故障上限小於非拜占庭系統。


如上圖 一個拜占庭程序C,告訴A一件事,告訴B另外一件,致使他們得出關於網路的不同的結論。這裡。簡單的大多數投票導致了安全違規,源於單個拜占庭程序。

事實上,可以證明拜占庭故障的上限為f

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



本文節選自:《Tendermint: Byzantine Fault Tolerance in the Age of Blockchains》
原文作者:Ethan Buchman譯者:饒雲坤校對:傅曉波


更多區塊鏈資訊:www.qukuaiwang.com.cn/news

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;