为什么PBFT的节点数量是3f+1?

问题:为什么PBFT的节点数量是3f+1?

pbft的论文提到这样2段话,可以很好的解决这个问题:


page3

在存在f个faulty节点的情况下,3f+1是保证系统安全性和活跃性的最小的总节点数量。当存在f个节点不响应的情况下,需要n-f个正常节点达成共识需要保障n-f > f。另外一种情况:f个响应的节点是错误的(响应错误数据),f个节点没有响应,但他们不是faulty的,所以要保证好的响应的节点 - 好的未响应的节点 - 坏的响应的节点 > 坏的节点,即需要n - f -f > fn > 3f。但n只能是整数,所以n >= 3f + 1


page3

副本节点的数量设为R,为了简便使R = 3f + 1。尽管存在副本节点数量多于3f+1的情况,比如3f+2, 3f+3但多出来的节点没有带来任何改善,反而降低了系统的性能,因为需要更多的通信量

为什么这样说呢?

3f+2, 3f+3的实际能容错的节点数量与3f+1是相同的,即只能容忍f个faulty的节点。

根据论文,当n = 3f+1时,

  • 在Prepare进入Commit阶段,需要2f个Prepare消息,即需要n - 1 - f条Prepare消息。
  • 在Commit阶段完成,需要2f+1条Commit消息,即需要n - f条Commit消息。

请思考,当n = 3f+2时,

  • 在Prepare进入Commit阶段,需要n - 1 - f个Prepare消息,即2f+1需要条Prepare消息。
  • 在Commit阶段完成,需要n - 1 - f条Commit消息,即需要2f+1条Commit消息。
  1. 如果这篇文章对你有帮助,不妨关注下我的Github,有文章会收到通知。
  2. 本文作者:大彬
  3. 如果喜欢本文,随意转载,但请保留此原文链接:http://lessisbetter.site/2019/01/23/why-pbft-using-3f-plus-1/

关注公众号,获取最新Golang文章