分佈式一致性協議三部曲-PBFT源碼分析

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實現原理

分佈式一致性協議三部曲-PBFT源碼分析

所有的碼客文章,都在這裏,歡迎長按關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章