file

在之前的博客中,我們已經從一個更爲宏觀的視角瞭解了 Cosmos/Tendermint 技術棧。在本文中,我們將深入介紹 Tendermint 共識引擎的共識層和網絡層。Cosmos-SDK 將實現區塊鏈的應用邏輯,它與 Tendermint 共識引擎一起實現區塊鏈的三層架構:應用層、共識層、網絡層。Tendermint 共識引擎將共識的產生與 p2p 廣播以一種創新方式結合在一起。在軟件工程中,模塊化的設計相比於整體化的設計在代碼複用、代碼庫的維護上有明顯的優勢。

file

自上而下:應用層 (Cosmos-SDK),ABCI,Tendermint 共識引擎 (共識+p2p 網絡)

Tendermint 共識引擎也被稱爲 Tendermint。Tendermint 也是開發 Tendermint 共識引擎和 Cosmos 網絡的公司的名稱。Tendermint 共識引擎是一種底層協議,它由兩個協議組成:共識算法和 p2p 網絡通信。Jae Kwon 和 Ethan Buchman 受到了 Raft 和 PBFT 的啓發,把 Tendermint 設計成一種容易理解、對開發人員友好的算法。Tendermint 也可以用在複雜的系統中。

新一代的 PoS BFT 共識算法都參考了 Tendermint 如何在公有鏈領域運用基於 BFT 的 PoS 共識的方案。我們把這一類成功的借鑑稱爲 Tendermint BFT。它們都屬於基於 BFT 的 PoS(與基於鏈的 PoS 相對)。若想要進一步瞭解基於鏈的 PoS 與 BFT PoS 的區別,可以參考這篇文章:Casper vs. Tendermint。

現在大家應該對 Tendermint 有了大致的瞭解,先就讓我們進入正題:到底什麼是 Tendermint?它是如何工作的?

endermint BFT 協議棧

file

比特幣創造了當今所有我們耳熟能詳的區塊鏈加密幣系統的技術基礎。Tendrmint 協議與比特幣系統有很多相似之處,因爲他們都是通過區塊來紀錄信息,但在解決“拜占庭將軍”的問題 (共識機制) 上又各採取了不同的解決方案。Tendermint 的體系可以追溯到學術界關於分佈式計算以及拜占庭容錯的研究(參見 Ethan Buhman 的論文:
https://atrium.lib.uoguelph.ca/xmlui/bitstream/handle/10214/9769/Buchman_Ethan_201606_MAsc.pdf)。然而比特幣的傳奇故事是在多種電子現金支付系統失敗之後(paypal 除外)開始的,作爲一種去中心化的無需進行審覈的貨幣系統冉冉升起。

比特幣的協議優化了去中心化的審覈機制,這對於作爲一種支付系統而誕生的比特幣至關重要。而 Tendermint,則是在多節點的廣域網(如擁有百萬節點的高節點數)中優化了分佈式應用及數據處理方面的拜占庭容錯。這種微妙的區別值得細究。

在全球的學術界裏,關於廣域網的拜占庭容錯研究鳳毛麟角,通常是基於擁有 4–7 個節點的單一管理權限的局域網研究。針對擁有大量節點及多個管理域下的廣域網應用拜占庭容錯的研究,基本找不到能應用於實踐的重大突破。

2009 年之前,當比特幣向世界展示了其範式轉變技術,也就是區塊鏈概念時,如何解決節點數衆多的廣域網中的共識問題則一直找不到答案。儘管解決了「兩將軍問題」,但在理論以及分佈式系統的研究方面,比特幣並不是一個真正解決共識機制的算法。進一步完善拜占庭容錯的研究還有很長路要走。

2014 年,擁有計算機科學及系統工程背景的 Jae Kwon 設想了一種完全基於拜占庭容錯的協議,通過 POS(權益證明) 作爲底層的安全機制,可以應用於擁有數以百計節點的無許可環境。Tendermint 從此誕生了。最終,這種基於 POS(權益證明) 作爲主要的安全機制,並能在廣域網中進行大量節點驗證的的系統模型成爲了一項異常複雜的工程實踐,耗費四年時間才實現了項目公有鏈的落地。這個項目就是 Cosmos, 定於 2018 年夏上線。

模型

Tendermint 是一種在部分同步的環境下的固定性協議。它能在網絡和各個進程本身的延遲範圍內實現吞吐量。在 Vlad Zamfir 給出的三角形中,Tendermint 落在這條紫色的邊中的某一個點上。

file

Vlad Zamfir 的三角形說明了在共識協議中的幾類權衡

FLP 不可能原理

Theorem 「…我們呈現了一個令人驚訝的結論:在一個完全異步的共識協議下,即使一個線程的意外終止也可能導致共識過程的終止。」也就是說,對於一個確定性的共識算法,在一個完全異步的環境中,如果出現了一個單線程的故障會導致共識的終止。

Dwork, Lynch 和 Stockmeyer 在他們的文章 Consensus in the Presence of Partial Synchrony,中寫道:「部分同步系統是介於同步系統和異步系統之間的一種形態。在同步系統中,系統的延遲有一個上限……這個上限是關於信息從一個進程傳遞到另一個進程,關於不同進程的處理速度……在部分同步的系統中沒有延遲的上限。我們需要設計一個可以在部分同步的系統中使用的共識協議,它不受系統延遲的影響。」Tendermint 的誕生就是爲了解決這個問題。Tendermint 是一個改進版本的 的 DLS 協議。

共識算法

部分同步,同步和異步通信

讓我們通過一個衆所周知的協議作爲參考,來探索同步的案例,這個協議就是比特幣協議。比特幣裏有一個概念稱爲「已知固定上限」,指的是比特幣系統在挖礦的過程中每 10 分鐘生成一個區塊的規律。爲了保證比特幣系統能穩定地發展並不斷產生區塊,比特幣的協議中人爲地設置了這個 10 分鐘規律,這使得系統中的所有節點可以利用這 10 分鐘的時間,來完成接收,打包,見證的工作,同時將產生的交易在整個網絡裏進行廣播。

以太坊是另一個這類協議的典型,其同步假設的出塊時間僅爲 15 秒。以太坊的出塊速度較比特幣的 10 分鐘大幅縮短,這使得以太坊系統在產出速度上有更高的效率,交易在全網廣播所費的時間更短,但也正因爲如此,結果形成了許多孤立區塊,使礦工蒙受了損失。

Tendermint 屬於一種在部分同步通訊下解決一致性問題的協議,部分同步系統介於同步與異步概念之間,我們有時也稱之爲「弱同步」系統。這意味着,Tendermint 基於時序假設進行了改良,與同步系統不同,部分同比系統的速度提升並不是基於系統參數的改進,而是基於網絡的速度。

響應性與終止性

定義:終止性指的是任何進程在運行完成後應該給出一個最終決定。

傳統算法的同步模型大多依賴於同步假設,不僅是要保證運算進程的完成,更是要保證安全性,諸如中本聰共識,Peercoin, NXT, Snow White, Ouroboros 等,這些算法都是爲了同步系統而設計並且都設定了先驗邊界。一旦同步系統中的先驗邊界失效,共識機制就會被打破,鏈就會產生分叉。因此,例如比特幣設定的 10 分鐘出塊的規則,是出於一種對於主鏈安全性的適當保護。

Tendermint 則與之不同,只要出現問題的進程不超過 1/3,那系統就不會出現分叉這樣的異步性問題。這種特性使 Tendermint 成爲了一種基於拜占庭容錯的權益證明協議,而協議中安全性的保障又高於響應性能(CAP 定理:分佈式系統中,Consistency(一致性), Availability(可用性),Partition tolerance(分區容忍性) 不可兼容)。最終,Tendermint 區塊鏈將在絕對大多數節點(比如超過 2/3)完成共識見證後終止進程。

現在也有些同步協議存在於異步網絡中,但是依據 FLP 不可能性(FLP impossibility 是一個定理,它證明了在分佈式情景下,無論任何算法,即使是隻有一個進程掛掉,對於其他非失敗進程,都存在着無法達成一致的可能。),這些協議不可能同時達成一致性決議。

確定性與非確定性協議

在完全異步的情況下解決共識問題的非確定性協議潛在地依賴於隨機預言和普遍地導致信息複雜度的開銷,因爲它們所有的通信都依賴於可靠的廣播。在異步環境下,單個可靠的廣播的開銷大約和 Tendermint 中的一輪共識的花費是相當的。像 HoneyBadger 拜占庭容錯這樣的很多協議屬於在異步環境下的非確定性協議一類。通常,它們要求在單輪的通信中要有三個可靠的廣播實例。

相反 Tendermint 是一個完全確定性的協議;無論什麼情況下在這個協議中都沒有隨機性。通過實現中的一個確定的數學函數,領導是很明確的被選舉出來的。這樣,我們能夠在數學上證明這個系統是活的,並且這個協議能夠保證做出決策。

輪流擔任 Leader

Tendermint 以加權的輪詢方式在驗證者集合,即如新區塊的提出者們中循環產生。一個驗證者和其委託人抵押的權益越多,它就有更多的權重,並且相應地它就會被更多的選爲領導者。具體來說明一下,如果一個驗證者和另一個驗證者有着同樣的權重,它們都會被協議以同樣的次數選中。

對於這個算法如何工作的

最簡單的解釋如下:

驗證者的權重被設置
驗證者被選擇,輪到驗證者來提議一個區塊
權重被重新計算,在本輪結束後減少一定數量的權重
隨着每一輪的進行,權重按照投票權利的相應比例逐漸遞增
再一次選擇驗證者
實際對應的代碼實現 :
https://github.com/tendermint/tendermint/blob/master/types/validator_set.go

因爲協議可以很明確地選擇區塊的提案人,鑑於你知道驗證者集合和每個驗證者的投票權重,你可以在 x, x + 1,…,x + n 輪次中準確地計算出誰會是下一個區塊的提案者。因此,有評論者爭論說 Tendermint 去中心化的還不夠。當你可以預知誰會是領導者的時候,一個攻擊者可以以這些領導者爲目標並對他們發動 DDoS 攻擊,而且很有可能使得這個鏈停止向前發展。我們通過在 Tendermint 中實現某個叫做哨兵架構的設計來減輕這個攻擊路徑的影響。

P2P 網絡協議

輪流擔任 Leader

隨着 Cosmos 網絡的影響範圍不斷變大,網絡也會經常遭受攻擊,比如說 DoS。一個有效的哨兵節點架構將保證驗證人節點的 IP 不被暴露出來,同時可以組織其他節點與驗證人節點連接。 這樣可以混淆驗證人節點的真實位置。

也就是說,哨兵節點的架構是可選擇的。驗證人有責任維護一個抗攻擊的全節點。 這是我們根據經濟激勵做出的額外假設。 假設是,驗證人會希望採取所有預防措施,以保持容錯,保持高可用,並最終在保持在共識過程中發揮其作用。 因爲如果他們不這樣做,他們會因爲長期離線被強制剔除出驗證人集合。

Peer Exchange (PEX) Reactor

Tendermint 繼承了比特幣的節點發現機制。Tendermint 沿用了 btcd 的 p2p AddressBook,比特幣在 golang 中的實現。在默認的的配置中將默認支持節點的發現。

Tendermint 實踐

除了新穎的算法設計和學術術語之外,Tendermint 還有什麼用處呢 ?

壞消息是每天都有人覺得 Tendermint 沒有用。好消息是應用程序開發人員可以跨越協議和最終用戶之間的鴻溝。Tendermint 被設計爲可自定義且靈活的,足以滿足任何設置的。無論是公共的還是企業的,他們都需要這樣的一個共識協議。

對於想要在自己的區塊鏈之上實現應用程序的開發人員來說,Tendermint 非常理想。它是預先裝配好的,所以如果開發人員想選擇運行一個純粹的基於 BTF 容錯的 POS 共識引擎爲他們的去中心化應用分區提供支撐,Tendermint 可以很容易地做到這一點。

當用戶使用 Cosmos-SDK 實現他們的高級業務邏輯時,有趣的部分就出現了。爲了與 Tendermint 的共識 / 網絡層進行連接,我們通過一個 Tendermint 套接字協議來完成,我們稱之爲區塊鏈接口,或者 ABCI。
Application Layer:
Cosmos-SDK (Blockchain Application Framework)
Cosmos-SDK Alpha Release
TendermintABCI:
http://tendermint.readthedocs.io/projects/tools/en/master/introduction.html

正在進行的研究

目前,我們正在深入研究 BLS 簽名,這可能會導致 Tendermint 塊頭的大小從 3.2 KB(帶有 ~100 驗證器) 減少到 64 字節。

我們也有一種設計,可以在安全的方法中隨機化循環選擇提議者的函數,使 DDoS 的下一個提議者更加困難,但是最初的步驟是 Sentry 節點架構。