前文

网上太多关于介绍pBFT这门古典艺术的文章,但大部分文章都是只是简单的介绍一下过程,没有对其中的原理(Why)做过介绍,其实最好的学习方式是直接看pBFT的原论文,这里不做太多描述性的内容,尽可能地带领读者往pBFT的深入一点的内容去思考

n>=3f+1是怎么来的?

f即可容忍的拜占庭节点数最大值,总节点数n要>=3f+1, pBFT的论文直接引用了如下的一个结论:

在一个异步的分布式环境中,如果有f个作恶节点,如果要得到安全+活性的保障,副本节点要至少3f+1

里面的数学层面的证明请参考Asynchronous Consensus and Broadcast Protocols的Theorem 4的证明给出了一个结论

但是pBFT的论文里面却给出这样的解释:

如果有f个作恶节点,那么剩下的n-f个副本节点是要能保持通信的,由于有f个节点可能会故障并且不会有反应。有f个没响应的副本可能并非问题节点,因此那些响应的节点中有f个可能是故障的,即使这样,那些非问题节点的数量也要比有问题的节点数量多 n-2f>f => n>3f

总的来说,pBFT就是将推导环境放到最极端的场景下,有f个节点挂了,f个节点还作恶,那么剩下的就只有n-2f个节点了,根据古典拜占庭的原理,非拜占庭节点数要多余拜占庭节点数,就出现 n-2f>f

为什么是三个步骤?

Pre-Prepare 和Prepare的作用

确保所有请求在同一个View的内的有序性

prepared消息定义:preared(m,v,n,i)

每个副本收到2f+1个(包括自己)Pre-Prepare的请求的时候,就可以进入到Prepared的状态

总量为3f+1,如果收到2f的时候剩下的f个副本超时发送,可能是故障了,就可忽略不用再等待(先将故障的副本给排除掉), 收到2f个消息并且验证通过的时候,说明至少有f+1个诚实节点

如果preared(m',v,n,i) 也被认证通过了,那么至少有个一个诚实节点同时发送了 preared(m',v,n,i),preared(m,v,n,i) 这两个消息,这不就矛盾了么?

解释:认证 preared(m’,v,n,i) 有 2f+1个节点,认证preared(m,v,n,i) 也有2f+1个节点,从集合关系角度来看,即使里面混入了最大的f个欺骗节点,那这两个节点当中剩余的诚实节点都至少有一个公共的诚实节点,那就导致这个诚实节点同时发送了两个认证消息,导致了矛盾

Prepare 与Commit的作用

确保夸View的请求的顺序

当节点进入到Prepared阶段的时候,就开始发起Commit请求进入到Commit-local的状态

Commit-local(m,v,n,i)认证通过的条件,prepared(m,v,n,i)认证通过,并且收到2f+1(包括节点自身)个commits事件