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