TenderMint PBFT協議交互流程
Tendermint是一個基於PBFT(實用拜占庭容錯)的共識機制,是Cosmos跨鏈協議的核心模塊。PBFT是一種去中心化的一致性協議,非常類似Paxos,推薦先看筆者這篇文章【分佈式一致性協議三部曲-深入理解一致性協議】,由該文可知,PBFT和Paxos交互的對應關係如下,我們再次預習下。
Paxos交互圖如下
PBFT是通過廣播進行的,因而上述交互可以縮減
進而可以簡化爲如下交互
上述流程更名後就變爲
對應的詳細交互圖如下:
接下來我們通過源碼來分析這些交互流程
PBFT源碼分析
Propose
節點生成新區塊時發起Propose, Propose會廣播proposeMessage消息, 該消息由Proposer發起。
Provote
收到propose且block信息已收集好,就會廣播provote投票
-
-
由於Proposer有本地的區塊,一般會很快發出Prevote消息, 相當於proposer無需接收一個proposeMessage才發起prevote,其他節點是要接收到proposeMessage纔會。
-
-
其他節點,收到proposeMessage且收到完整區塊信息後纔會廣播provote消息
Precommit
-
收到2/3 prevote會進入precommit
收到vote
收到2/3票進入precommit
在precommit會添加lockedBlock
-
收到其他人的Precommit
Commit
-
收到2/3 precommit會進入commit
到了commit已經變爲不可逆,但是理論上將commit廣播給更多人可以加快區塊同步, 但是並沒有主動廣播commit。pBFT裏commit傳播是通過區塊同步實現的,進入commit的validator會propose新區塊,然後其他節點收到它的propose後在provote之前會先同步到proposer的高度,這就相當於同步了commit信息。
lockedBlock的四種場景
lockedBlock是pBFT的一個核心邏輯,類似Paxos的Promise已有Accepted的value。
-
當節點收到超過2/3的prevote消息, 節點會進入precommit狀態併發出precommit消息, 該高度的區塊被鎖定(類似Paxos的Accepted狀態)
-
已經有lockedBlock, 在收到下一輪的Propose時prevote時推薦這個locked區塊,類似Paxos的promise階段返回已Accepted的value
-
新的一輪Propose, 如果新的proposer收到過一個節點的Locked Block, 直接更新Round並使用該Locked Block, 不會提議新的Block。
-
未收到2/3 prevote的節點在新一輪的新block上產生了新的2/3的provotes, 那沒辦法只有承認新round, 新block。
超時處理邏輯
分佈式一致性協議算是一個比較複雜的系統,需要多思考討論,歡迎文章下面留言討論
系列文章:
【分佈式一致性協議三部曲-從paxos幽靈復現看Raft實現原理】
所有的碼客文章,都在這裏,歡迎長按關注