1. 前述
PBFT(Practical Byzantine Fault Tolerance,实用拜占庭容错算法)是联盟链常用的一种共识算法。本文讨论PBFT提交阶段的作用,要求读者对PBFT的算法有一个大致了解,如果你是刚听过这个算法,知道算法的基本流程,看完本文可能会对PBFT有更深入的理解;如果你研读过PBFT原论文,那么本文也许可以作为阅读拓展。如果有不同理解或者认为文中表述有问题,欢迎讨论指正。
2. PBFT算法的QC性质
在讨论主题之前,我们需要先了解PBFT算法的QC性质,这是证明PBFT正确性的重要前提。
Q 和 C 分别表示 Quorum 和 Certificate。
- Quorum 意思为 仲裁数,法定人数。在PBFT中,当总节点数为3f+1时(用 f 表示拜占庭节点数量时,总节点数大于等于 3f+1 时拜占庭问题才有解,这个问题的证明不在本文的讨论范围),Quorum 表示数量不少于 2f+1 的节点集合。
- Quorum certificate 则表示来自一个Quorum的每个节点的某种消息组成的一个集合,称为证书,如准备证书和提交证书。
Quorum 有两个重要的性质:
- 相交性: 任何两个 Quorum 至少有一个共同的正确节点。
- 可得性: 总能找到一个没有错误节点的 Quorum 。
Intersection property: any two quorums have at least one correct replica in common.
Availability property: there is always a quorum available with no faulty replicas.
这两个性质贯穿了PBFT的整个证明过程,特别是性质1。
第一个性质,我们可以用一个图直观地理解:
图1. Quorum 的相交性
我们在一个大小为3f+1
的集合中,画两个2f+1
子集,并且使得交集尽可能地小,可以看到,即使尽最大的努力减小交集,最小的交集还是f+1
,即交集中至少有一个正确节点。
另外,当 f=1 时,3f+1=4,当 f=2 时,3f+1=7,那么当总节点数等于5或6时,Quorum 的数量该如何计算呢?我们记总节点数为N,且 3 f + 1 ≤ N < 3 ( f + 1 ) + 1 3f+1≤N<3(f+1)+1 3f+1≤N<3(f+1)+1,则一个 Quorum 的数量不少于 ⌈ 2 N 3 ⌉ \lceil\frac{2N}{3}\rceil ⌈32N⌉,其中 ⌈ ⌉ \lceil\rceil ⌈⌉表示向上取整,推导:
设 Quorum 的数量为x,为了满足性质1,两个 Quorum 的交集大小至少为 f+1,则有
2 x − N ≥ f + 1 2x-N≥f+1 2x−N≥f+1 x ≥ N + f + 1 2 x≥\frac{N+f+1}{2}