2018-6-6 08:53
來源: cc-value
在之前的博客中,我們已經從一個更為宏觀的視角了解了Cosmos/Tendermint技術棧。
在本文中,我們將深入介紹Tendermint共識引擎的共識層和網絡層。
來源:Cosmos互聯鏈
特別感謝:Cosmos&IRISnet China Translation group的成員,Bryan、Arthur、Mike&Suyu
Cosmos-SDK將實現區塊鏈的應用邏輯,它與Tendermint共識引擎一起實現區塊鏈的三層架構:應用層、共識層、網絡層。Tendermint共識引擎將共識的產生與p2p廣播以一種創新方式結合在一起。
在軟件工程中,模塊化的設計相比于整體化的設計在代碼復用、代碼庫的維護上有明顯的優勢。
自上而下:應用層(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?它是如何工作的?
Tendermint BFT 協議棧
比特幣創造了當今所有我們耳熟能詳的區塊鏈加密幣系統的技術基礎。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落在這條紫色的邊中的某一個點上。
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#L50
因為協議可以很明確地選擇區塊的提案人,鑒于你知道驗證者集合和每個驗證者的投票權重,你可以在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#abci-overview
正在進行的研究
目前,我們正在深入研究BLS簽名,這可能會導致Tendermint塊頭的大小從3.2 KB(帶有~100驗證器)減少到64字節。
我們也有一種設計,可以在安全的方法中隨機化循環選擇提議者的函數,使DDoS的下一個提議者更加困難,但是最初的步驟是Sentry節點架構。
Cosmos Academy成立Meetup!
我們將在加州伯克利舉辦一場即將到來的聚會。資深的BFT分布式系統研究人員Zarko Milosevic將會負責對Tendermint的所有內容進行問答環節。我們將直播這次聚會,并在Cosmos Network的YouTube頻道上進行廣播。
額外的資源
請閱讀下面對Zarko Milosevic(Tendermint Core高級研究員)的采訪:
https://github.com/tendermint/aib-data/blob/develop/medium/TendermintBFT.md
Jepsen的Kyle Kingsbury展示了Tendermint BFT:
關于Tendermint的技術規范,請參閱Zach Ramsay的Readthedocs
http://tendermint.readthedocs.io/projects/tools/en/master/
閱讀Jae Kwon最初的Tendermint白皮書。
https://tendermint.com/static/docs/tendermint.pdf
閱讀Ethan Buchman的the History of Distributed State。
https://atrium.lib.uoguelph.ca/xmlui/bitstream/handle/10214/9769/Buchman_Ethan_201606_MAsc.pdf
在軟件工程的每日播客上,聽一聽分布式狀態與Ethan Buchman的歷史。
https://softwareengineeringdaily.com/2018/03/26/consensus-systems-with-ethan-buchman/
在Zaki Manian比特幣播客網站,聽一下早期區塊鏈生態系統。
http://thebitcoinpodcast.com/hashing-it-out-5/