有人把Tendermint當成一個共識,有人把它當成一個通訊元件。這都是可以理解的。Tendermint融合了共識和網路通訊部分。它類似於一個軟體包,透過使用Tendermint可以很容易的開發一個和Cosmos相相容的區塊鏈(當然,如果使用Cosmos-sdk會更簡單,但是會遮蔽更多的細節)。可以把它理解成Cosmos的一個底層架構,提供類似於基礎服務的一個平臺。Tendermint可以提供一個Cosmos標準的跨鏈的基礎應用。
透過上面這個圖可以看出Tendermint在整個Cosmos生態中的位置。Tendermint Core是所有Cosmos生態中區塊鏈的核心(上圖中的淡綠色部分),提供了DPOS+BFT的共識機制。Cosmos Hub提供了不同區塊鏈的之間的互動和價值轉移。各個區塊鏈應用之間透過IBC介面進行通訊。
二、整體架構
1、BFT
Tendermint使用的共識演算法是拜占庭容錯共識協議,它是來源於DLS共識演算法。使用這種演算法的目的是可以簡單方便的解決區塊鏈的分叉機制。這種BFT的機制要求有固定的一組驗證人,然後他們會嘗試在某個區塊上達成共識。每個區塊的共識輪流進行,每一輪都有一個提議者來發起區塊,之後由驗證人來決定是否接受區塊或者進入下一輪投票。
Tendermint採用由絕對多數的選票(三分之二)待定的最優拜占庭演算法。因此它可以確定的做到:
· 如果想做惡,必須要有三分之一以上的選票出現問題,並且提交了兩個值。
· 如果任何驗證組引起安全問題,就會被發現並對沖突進行投票,同時廣播有問題的那些選票。
因為使用了BFT,所以其共識的速度在所有的共識中最相當快速的,很容易達到並維持每秒千筆交易的速度。
2、P2P
Tendermint中的網路底層通訊,使用的是一種普通的反應器,它透過引數來查詢需要連線的P2P節點,在Tendermint的節點連線中,維護著兩組對映來管理連線自己和自己連線的物件,分別稱做inbound,outbound.
outbound中,有兩種連線,一種是連線時指定的seed,一種是在初始化時檢測出來的節點。一般情況下,outbound的數量少於10個。而inbound控制在50個左右的連線。
既然是基於反應器的,那麼程式設計的複雜性就大大降低了。只需要服務監聽就可以了。這裡不再細節贅述網路通訊部分。
網路在啟動時,會啟動一個協程,定時輪詢outbound的數量,來控制連線的穩定性。
3、架構
Tendermint的設計目的是為了建立一個統一的區塊鏈開發的基礎元件。透過將區塊鏈中主要的P2P和共識抽象出來,實現區塊鏈開發過程中的元件式管理。這樣做的優勢有以下幾點:
一個是程式碼重用。對通用的網路通訊和共識就不必再重複的造輪子。
二是解放了區塊鏈程式設計的語言。比如以太坊用go,c++,但是透過Tendermint的抽象後,可以使用任何語言(覺得和當初JAVA才提出時一次編譯的想法有些相似啊)。特別是對於智慧合約,這個優點就更顯得明顯了。
4、Tendermint的共識過程
Tendermint共識機制中透過作驗證人(Validators)來對區塊達成共識,這個在前面已經介紹過,一組驗證人負責對每一輪的新區塊進行提議和投票。整個共識達成的過程如下圖所示。
每一輪的開始(New Round),節點對新一輪的區塊進行提議。之後,合格的提議區塊首先經過一輪預投票(Prevote)。在提議區塊獲得2/3以上的投票後,進入下一輪的預認可(Precommit),同樣是待獲得2/3以上的驗證人預認可後,被提議區塊就正式獲得了認可(Commit)。而得到認可的這個區塊就被新增的到區塊鏈中。
下面為詳細的過程:
在Tendermint演算法中,如果遇到對同一特定區塊的同意及否決資訊同時超過2/3的情況,需要啟用外部的維護機制去核查是否存在超過1/3的驗證節點偽造簽名或者投出雙重選票。
4、Tendermint的交易流程
當一個Tx進來時, Tmcore的mempool(MP)會透過mempool connection(一個socket連線,由abci-server提供)呼叫Application Logic(AL:也就是abci-app,我們自己用任何語言編寫的APP邏輯)裡的checkTx方法,AL向MP返回驗證結果。MP根據驗證結果透過或者拒絕該Tx。
Tendermint(TM)把tx暫存在記憶體池(mempool)裡,並把這條Tx透過P2P網路複製給其它TM節點。TM發起了對這條Tx的拜占庭共識投票,所有Tendermint節點都參與了。投票過程分三輪,第一輪預投票(PreVote),超過2/3認可後進入第二輪預提交(PreCommit),超過2/3認可後進入最後一輪正式提交(Commit)
TM提交Tx時依次透過Consensus Connection(一個socket連線,由abci-server提供)向ABCI-APP傳送指令BeginBlock-->多次DeliverTx-->EndBlock-->Commit,提交成功後會將StateRoot(application Merkle root hash)返回給TM,TM New出一個區塊。
如下圖所示的交易流程圖:
三、總結
透過上面的分析可以看到,其實Tendermint的重點在於共識和P2P,將二者抽象出來的有利之處在於,可以讓開發者忽略對網路通訊和共識的複雜性。直接進行業務層面的開發,而SDK的封裝,進一步減少了業務上對非相關的邏輯的考慮,大大減少了開發者生產一條區塊鏈的複雜度,而這也恰恰是Tendermint和cosmos-sdk所想達到的目的。
更多區塊鏈資訊:www.qukuaiwang.com.cn/news