其他分享
首页 > 其他分享> > 为什么PBFT中需要2f+1

为什么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节点的作恶问题。

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.

标签:PBFT,为什么,Prepare,Prepared,2f,集群,消息,节点
来源: https://blog.csdn.net/u014633283/article/details/112517885