高级的说法: http://qyuan.top/2019/08/13/pbft-1/
节点总数是n,其中作恶节点有f,那么剩下的正确节点为n - f,意味着只要收到n - f个消息就能做出决定(所以后面要对f做出限定条件),但是这n - f个消息有可能由f个是由作恶节点(作恶节点也可以什么都不干)冒充的,那么正确的消息就是n - f - f(最恶劣的情况下)个,为了多数一致,正确消息必须占多数,也就是n - f - f > f但是节点必须是整数个,所以n最少是3f+1个。
或者可以这样理解,假定f个节点是故障节点,f个节点是作恶,那么达成一致需要的正确节点最少就是f+1个,当然这是最坏的情况,如果故障节点集合和拜占庭节点集合有重复,可以不需要f+1个正确节点,但是为了保证最坏的情况算法还能正常运行,所以必须保证正确节点数量是f+1个。
如果还是有些模糊的话,可以看看下面的解释:
看看更加详细的解释: https://dinghaoli.github.io/2018/12/PBFT/
The resiliency of our algorithm is optimal: 3f + 1 is the minimum number of replicas that allow an asynchronous system to provide the safety and liveness properties when up to f replicas are faulty (see [2] for a proof). This many replicas are needed because it must be possible to proceed after communicating with n - f replicas, since f replicas might be faulty and not responding. However, it is possible that the f replicas that did not respond are not faulty and, therefore, f of those that responded might be faulty. Even so, there must still be enough responses that those from non-faulty replicas outnumber those from faulty ones, i.e., n - 2f > f. Thereforen n > 3f.
对于原文的理解:假设作恶节点数量为f(注意:作恶节点可能不发送任何消息,也可能发送错误消息),那么为了保证一致性达成,系统内节点数量必须大于3。为什么呢?原文的意思是:因为我们知道有f个作恶节点,所以我们必须在n-f个状态复制机的沟通内,就要做出决定(为什么呢?因为我们在设计异步通信算法的时候,我们不知道那f个节点是恶意节点还是故障节点,这f个节点可以不发送消息,也可以发送错误的消息,所以在设计阈值的时候,我们要保证必须在n-f个状态复制机的沟通内,就要做出决定,因为如果阈值设置为需要n-f+1个消息,那么如果这f个作恶节点全部不回应,那这个系统根本无法运作下去)。
在n-f个状态复制机的沟通内,就要做出决定。而且我们无法预测这f个作恶节点做了什么(错误消息/不发送),所以我们并不知道,这n-f个里面有几个是作恶节点,我们必须保证正常的节点大于作恶节点数。所以有 n-f-f > f,从而得出了n > 3f。
这里顺便提供⽹上看到的⼀个证明,但原理也是一样的:
• Liveness要求,Q <= n-f; (Q是要进行选举的法定⼈数,系统要能保证正常跑着,不中断,法定 人数不能多于可以进行选举的人数n-f)。
• Safy要求,根据quorum intersection property: 2Q-n > f,(2个不同的提议情况如何达成一致,只 要有分别支持两个提议的人有交叉,而且交叉的是⼀个non-faulty节点,就能达成一致,这是2Q-n > 0的情况,PBFT容忍f个faulty节点,所以需要有f个non-faulty的交叉) n+f < 2Q <= 2(n - f) => f < n/3 => n > 3f。最⼩n为3f+1。