为什么PBFT中需要2f+1

0. 写在前面

关于PBFT中为什么需要2f+1个Prepare/Commit的问题,网上其实有很多博客和文献来阐述,如这篇博客PBFT中的几个重要参数以及这本书"Introduction to reliable and secure distributed programming"。
这些博客和文献大都采用了比较理论的证明方式,使用了Quorum的概念。即拜占庭网络中的Quorum值是2f+1,因此PBFT中必须使用2f+1这个参数。这种证明方式总的来说是比较抽象的。

本文和上面那些博客和文献不同,打算用通俗易懂的例子进行说明。具体来说,是通过举一些反例,即:如果少于2f+1会怎么样?

1. Prepare阶段为何需要2f+1?

Prepare阶段时,为何要确认接收到了2f+1条消息
答:
主要是考虑到Primary节点的作恶问题。

  • Primary节点是诚实的,f+1就足够了
  • 考虑到Primary节点可能会作恶,必须要收到2f+1条消息。假如只要求收到2f条消息:Primary节点是作恶的,另外还有f-1个节点也是作恶的(假设这f个恶意节点构成集群B),剩下的2f+1个节点都是正确的。那么Primary节点坑会给f个正确节点发送a=1PrePrepare消息(假设这f个正确节点构成集群C),给另外f+1个正确节点发送a=2PrePrepare消息(假设这f个正确节点构成集群D)。同时,另外集群B中的恶意节点也会给集群C中的正确节点发送a=1Prepare消息,给集群D中的f+1个正确节点发送a=2Prepare消息。集群C和集群D中的节点也都会向彼此发送Prepare消息。此时,对于集群C中的节点,其可能收到1个a=1PrePrepare消息,f-1个a=1Prepare消息(从集群B收到),和f个a=1Prepare消息(从集群C中收到,包括自己的)。总计2f条消息,从而得到a=1的结论。另一方面,对于集群D中的节点,其可能收到1个a=2PrePrepare消息,f-1个a=2Prepare消息(从集群B收到),和f+1个a=2Prepare消息(从集群D中收到,包括自己的)。总计2f+1条消息,从而得到a=2的结论。也即集群C和集群D中的节点得出了不一样的结论,没能达成共识。

2. Commit阶段为何需要2f+1?

说到这里,另外一个疑问是:既然Prepare阶段已经去除了Primary作恶的影响了,为什么到了Commit阶段还是要求2f+1呢?
答:这需要首先回顾一下上一篇博客中关于Commit阶段必要性的分析。简而言之:Commit阶段配合View Change机制保证了节点状态在不同的View中也可以保持一致。
基于该理解,之所以Commit阶段也要求收到2f+1个Prepared消息,是因为恶意节点可能在当前View中发送了Prepared数据,但在View Change的时候故意不发送该Prepared数据。

举例来说:假设PBFT集群中有4个节点:ABCD,其中节点D是恶意节点,并且假设上一轮View中,A是主节点。如果只需要2f个Prepared数据,节点C在收到DPrepared数据后,加上自己的Prepared数据就达到了2f个的计数,从而提交了(也即执行了相应的交易)。此时AB都还没有到达Prepared状态。并且,在此时发生了View切换的操作,下一个主节点是BB节点收到了包括自己ADVIEW-CHANGE消息后,就发起了NEW-VIEW消息。但由于AB都未在上一轮View中到达Prepared状态,因而其VIEW-CHANGE消息中不包含相应的Prepared数据;而D是恶意节点,故意在VIEW-CHANGE消息中不包含相应的Prepared数据。因此,上一轮在节点CCommit了的数据在新的View中,未能被NEW-VIEW包含,从而可能在后期被其他节点执行矛盾交易,造成集群中节点状态的不一致。

参考文献

  1. 实用拜占庭容错算法(PBFT)
  2. PBFT中的几个重要参数
  3. Cachin C, Guerraoui R, Rodrigues L. Introduction to reliable and secure distributed programming[M]. Springer Science & Business Media, 2011.
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值