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】
【分布式一致性协议三部曲-从paxos幽灵复现看Raft实现原理】
【分布式一致性协议三部曲-PBFT源码分析】
欢迎关注「一点码客」