拜占庭共识Tendermint介绍及简单入门
1.Tendermint是什么
Tenermint 是一個軟件,用于在多臺機器安全一致地復制一個應用。所謂安全,指的是即使有多達 1/3 的機器出現任意故障的情況下, Tendermint 仍然能夠正常工作。所謂一致,指的是每一個正常工作的機器都會有著同樣的交易日志,計算相同的狀態。安全一致的復制是分布式系統中一個至關重要的問題:從貨幣到選舉,到基礎設施規劃,它在廣泛應用的容錯中承擔了一個極其重要的角色。
能夠容忍機器以任何一種,甚至包括危害系統的方式發生故障,被稱為拜占庭容錯(BFT)。拜占庭理論已經有幾十年的歷史,但是很大程度上,直到最近像比特幣,以太坊這樣區塊鏈技術的成功,它的軟件實現才得以進一步發展。區塊鏈技術只是以一種現代化的方式對 BFT 的再形式化,而且重點關注 p2p 網絡和密碼驗證。區塊鏈這個名詞來源于交易的處理方式,通過區塊的批量方式處理交易,每個塊包含了前一個塊的加密哈希,以此來形成一個鏈。實際上,區塊鏈數據庫真正地優化了 BFT 設計。
Tendermint 包含了兩個主要的技術組件:一個區塊鏈共識引擎和一個通用的應用程序接口。共識引擎,叫做 Tendermint Core,保證了每一臺機器以相同的順序記錄同一筆交易。應用程序接口,叫做應用程序區塊鏈接口(ABCI),保證了交易可以通過任何一種編程語言進行處理。與其他預先打包內置狀態機(比如鍵值存儲或者一個奇怪的腳本語言)的區塊鏈和共識方案不同,開發者可以使用 Tendermint 實現應用的 BFT 狀態機復制,而這些應用可以用任何語言編寫,而且開發環境對開發者也十分友好。
Tendermint 的設計原則是易使用,易理解,高性能,對于各種分布式應用都十分有用。
Tendermint 說明文檔:https://tendermint.readthedocs.io/en/master/
Tendermint 地址:https://github.com/tendermint/tendermint
Tendermint 與其他技術的比較
大體上, Tendermint 與兩類軟件很類似。第一類包含了分布式的鍵值存儲,比如 Zookeeper,etcd 和 consul,它們都使用了非拜占庭容錯共識。第二類就是 “區塊鏈技術”,它既包括了像比特幣和以太坊這樣的加密貨幣,也包括了像 Hyperledger Burrow 這樣的分布式賬本設計。
Zookeeper, etcd, consul
Zookeeper,etcd 和 consul 都是在一個經典的非拜占庭容錯共識算法上, 實現了一個鍵值存儲。Zookeeper 使用了 Paxos 一個叫做 Zookeeper Atomic Broadcast 的版本,而 etcd 和 consul 則使用了更年輕,也更簡單的 Raft 共識算法。一個典型的集群由 3-5 臺機器構成,雖然可以承受 1/2 的機器發生問題,但是只要發生一次拜占庭故障,整個系統就可能被摧毀。它們每一個都提供了一個稍微有別于鍵值存儲的實現,但是都將關注點放在提供分布式系統的基礎服務上,比如動態配置,服務發現,鎖定,領導人選取等等。
Tendermint 是一個本質上類似的軟件,不過有兩點關鍵不同:它是拜占庭容錯的,這意味著它可以承受 1/3 機器發生任意形式的故障 – 包括黑客和惡意攻擊。
它并不像鍵值存儲,是針對某一指定類型的應用。相反,它關注于任意的狀態機復制,因此開發者可以量身打造適合自己的應用邏輯,從鍵值存儲到加密貨幣到電子投票平臺,甚至更多的應用都可適用。
Bitcoin, Ethereum, etc.
在比特幣和以太坊這樣的傳統加密貨幣下出現了 Tendermint,它的目的在于提供一個比比特幣的工作量證明更加有效和安全的共識算法。在早期,Tendermint 內置了一個簡單的貨幣來參與共識,用戶必須向一個保證金賬戶中“綁定”一定數量的貨幣,如果他們表現不端,這些錢就會被收回 – 這一點使得 Tendermint 成為一個 POS 算法。
自那時起,Tendermint 就進化為一個能夠承載任意應用狀態的通用區塊鏈共識引擎。這意味著它可以成為其他區塊鏈軟件共識引擎的一個即插即用的替代品。所以基于當前的以太坊代碼庫,無論是用何種語言, Rust,Go,Haskell,任何人都可以使用 Tendermint 共識運行一個 ABCI 應用。實際上,我們已經完成了這一點(ethermint)。此外,我們也計劃為 Bitcoin,ZCash,和其他確定性的應用完成同樣的工作。另一個基于 Tendermint 構建的加密貨幣應用是 Cosmos。
Fabric, Burrow
Fabric 0.6 采用了與 Tendermint 類似的方法,但是它更關注對狀態的管理,并且要求所有的應用行為能夠在多個 docker 容器,叫做 “chaincode” 的模塊中運行。它使用了來自 IBM (augmented to handle potentially non-deterministic chaincode) 的 PBFT 實現。通過擴展 Tendermint 來處理未來工作中存在的不確定性,在 Tendermint 中通過一個 ABCI 應用實現這個基于 docker 的行為是完全有可能的。Burrow 是一個以太坊虛擬機和以太坊交易機制的實現,同時附帶有名字注冊,許可權和天然合約,可替代區塊鏈 API 等額外特性。它使用 Tendermint 作為它的共識引擎,提供一個特殊的應用狀態。
2. 什么是 ABCI (應用區塊鏈接口)
區塊鏈應用接口(Application BlockChain Interface,ABCI)允許應用的拜占庭容錯復制可以由任意一種編程語言編寫。
Tendermint Core (“共識引擎”)通過一個滿足 ABCI 標準的 socket 協議與應用進行交流。
舉個大家比較熟悉的例子,比特幣。比特幣是一個加密貨幣區塊鏈,其中的每個節點維護了一個完全經過審計的 UTXO 數據庫。如果有人想要在 ABCI 之上創建一個類似比特幣的系統,Tendermint Core 將會負責:
- 在節點間共享區塊和交易
- 建立交易(區塊鏈)的標準/不可變順序
而應用將會負責:
- 維護 UTXO 數據庫
- 驗證交易的加密簽名
- 阻止花費尚未存在的交易
- 允許客戶端查詢 UTXO 數據庫
ABCI 包含了 3 個主要的消息類型,它們由 core 發送至應用,應用會對消息產生相應的回復:
DeliverTx 消息是應用的主要部分。鏈中的每筆交易都通過這個消息進行傳送。應用需要基于當前狀態,應用協議,和交易的加密證書上,去驗證接收到 DeliverTx 消息的每筆交易,。一個經過驗證的交易然后需要去更新應用狀態 – 比如通過將綁定一個值到鍵值存儲,或者通過更新 UTXO 數據庫。
CheckTx 消息類似于 DeliverTx,但是它僅用于驗證交易。Tendermint Core 的內存池首先通過 CheckTx 檢驗一筆交易的有效性,并且只將有效交易中繼到其他節點。比如,一個應用可能會檢查在交易中不斷增長的序列號,如果序列號過時,CheckTx 就會返回一個錯誤。又或者,他們可能使用一個基于容量的系統,該系統需要對每筆交易重新更新容量。
Commit 消息用于計算當前應用狀態的一個加密保證(cryptographic commitment),這個加密保證會被放到下一個區塊頭。這有一些比較方便的屬性。現在,更新狀態時的不一致性會被認為是區塊鏈的分支,分支會捕獲所有的編程錯誤。這同樣也簡化了保障輕節點客戶端安全的開發,因為 Merkel-hash 證明可以通過在區塊哈希上的檢查得到驗證,區塊鏈哈希由一個 quorum 簽署。
一個應用可能有多個 ABCI socket 連接。Tendermint Core 給應用創建了三個 ABCI 連接:一個用于內存池廣播時的交易驗證,一個用于運行提交區塊時的共識引擎,還有一個用于查詢應用狀態。
很顯然,在創建區塊鏈時,應用的設計者需要非常小心地設計他們的消息處理,這個架構提供一個范例。下圖闡釋了通過 ABCI 的消息流:
3. 共識概述
Tendermint 是一個易于理解,大部分操作為異步的 BFT 共識協議。下圖是一個簡單的狀態機,它展示了協議遵循的規則:
協議中的參與者叫著 “驗證人”(validator)。他們輪流對交易區塊進行提議,并對這些區塊進行投票。區塊會被提交到鏈上,每一個塊占據一個“高度”(height)。提交塊可能會失敗,如果失敗,協議就會開始下一輪的提交,并且一個新的驗證人會繼續提交那個高度的區塊。要想成功提交一個塊,需要有兩個階段的投票:“預投票”(pre-vote)和“預提交”(pre-commit)。在同一輪提交中,只有超過 2/3 的驗證人對同一個塊進行了預提交,這個塊才能被提交到鏈上。
上圖右下角有一對夫婦在跳波卡舞,因為驗證人做的事情就像是在跳波卡舞。當超過 2/3 的驗證人對同一個塊進行了預投票,我們就把它叫做一個“波卡”(polka)。每一個預提交都必須被同一輪中的一個波卡所證明。
由于一些原因,驗證人可能在提交一個塊時失敗:當前提議者可能離線了,或者網絡非常慢。Tendermint 允許他們證實一個驗證人應該被跳過。在進行下一輪的投票前,驗證人會等待一小段時間從提議者那里接收一個完整的提議塊。這種對于超時的依賴,使得 Tendermint 成為了一個弱同步協議,而非一個異步協議。但是,協議的剩余部分都是異步的,只有在接收到超過 2/3 的驗證人集合時,驗證人才會采取下一步操作。Tendermint 能夠簡化的一個原因就是它使用了同樣的機制來提交一個塊和跳過直接進入下一輪。
基于不到 1/3 的驗證人是拜占庭節點的前提,Tendermint 保證了永遠都不會違背其安全性 – 也就是說,驗證人永遠不會在同一高度提交沖突塊。為了達到這一點,它引入了一些 “鎖定”(locking)的規則,這些規則對流程圖中的路徑進行了模塊化。一旦一個驗證人預提交了一個塊,它就被“鎖定”在了那個塊上。然后,
1. 它必須為被鎖定的那個塊進行預投票
2. 只有在之后的輪中,有了那個塊的一個波卡,它才能夠解鎖,并為一個新塊進行預提交。
4. 簡單入門
下載編譯
mkdir -p $GOPATH/src/github.com/tendermint cd $GOPATH/src/github.com/tendermint git clone https://github.com/tendermint/tendermint.git cd tendermintlinux環境編譯:
make get_tools make get_vendor_deps make installWindows環境編譯:
cd cmd\tendermint go build編程完成得到tendermint.exe文件
下載編譯abci
go get -u github.com/tendermint/abci/cmd/abci-cli cd cmd/abci-cli go build編程完成得到abci-cli.exe
啟動KVStore 第一個例子
tendermint啟動:
tendermint.exe init --home d:\tendermint tendermint.exe node --home d:\tendermintkvstore啟動:
.\abci-cli kvstore測試
可以使用postman進行測試
啟動Counter 第二個例子
tendermint啟動:
tendermint.exe unsafe_reset_all tendermint.exe node --home d:\tendermintkvstore啟動:
.\abci-cli counter --serial測試
## 創建成功 curl localhost:46657/broadcast_tx_commit?tx=0x00 ## 創建失敗 curl localhost:46657/broadcast_tx_commit?tx=0x05 ##查看 curl localhost:46657/abci_query?path="tx"總結
tendermint是一款非常強大的共識軟件,不過目前尚未到1.0版本。官方基于tendermint修改了Ethereum的共識協議完成了ethermint,同時官方基于tendermint 構建了cosmos公有鏈。
tendermint還可以用于在聯盟鏈中作為共識協議,比如秘猿cryptape聯盟鏈使用tendermint來做共識。
總的來說,tendermint不管在共有鏈還是聯盟鏈中都是大有可為的,值得深入學習研究。筆者在后續 的文章將講講tendermint的深入使用和原理。
總結
以上是生活随笔為你收集整理的拜占庭共识Tendermint介绍及简单入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python简易画图软件开发
- 下一篇: 49CFR 571.302联邦机动车辆内