分布式一致性协议三部曲-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源码分析

所有的码客文章,都在这里,欢迎长按关注

发布了21 篇原创文章 · 获赞 56 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/itchosen/article/details/105746494