PBFT Practical Byzantine Fault Tolerance 实用拜占庭容错

Practical Byzantine Fault Tolerance 实用拜占庭容错,是传统BFT的一种可用性实现,算法的时间复杂度为O(n2),使得其可以在现实世界中解决拜占庭容错问题,其在联盟链中有广泛应用,但由于pbft 不能动态添加删除节点且节点加入需要认证机制(女巫攻击),时间复杂度等,其在公链中其算法的效率,功能仍然不足满足实际需求。

算法流程

算法前提

  1. 节点之间的消息传输可信
  2. 总结点数为3f+1,至少有2f+1个节点是诚实的

以下对图片内容进行解释:

客户端发送交易,主节点对交易进行打包验证,并进行全网广播pre-prepare 消息,从节点对收到的pre-prepare消息广播 prepare 消息给其他节点,从节点收到 2f+1 个 prepare 后验证通过再发送 commit 消息给其他节点,节点收到 2f+1 个 commit 消息后代表网络对这些交易达成共识,将其写入本地账本中.如果节点对prepare 消息验证时未通过,则发起 ViewChange 表明本节点认为主节点有异常行为.

  1. request
    客户端 C 向主节点发送请求,例如 A 向节点发送交易信息
  2. pre-prepare
    主节点需要将交易广播给其他所有节点,使得网络达成共识. 这一步主节点校验交易后将根据一定策略将若干条有效交易连同验证信息打包后广播给网络
  3. prepare
    从节点需要对主节点发送的消息进行合法性检查,然后再向其他节点广播prepare 消息
  4. commit
    从节点收到 2f+1 个 prepare 消息以及相应的 pre-prepare 消息后进行验证,并将验证结果与主节点写入 pre-prepare 消息中的验证结果进行比对,结果一致则广播 commit 表明本节点同意主节点的验证结果
  5. reply
    收到 2f+1 个 commit 后表示网络已经达成共识,所以将该消息写入本地账本

主节点选举

设节点数为 N,当前视图为 view,则主节点 id 为:
示例

  1. 当从节点检测到主节点有异常情况时,就会触发 ViewChange 事件向其他节点广播,节点收到f+1 个 ViewChange 事件将 view加 1,
  2. 新 view 中主节点收到 2f+1个 ViewChange 消息后,向所有节点广播 NewView 消息

总结

  1. PBFT 适合有准入门槛(防止女巫攻击),节点数量不多的联盟链
  2. PBFT 最大容忍网络中 1/3的拜占庭节点
  3. PBFT 的时间复杂度 O(n2),节点数很多时性能急剧下降
posted @ 2022-04-20 17:45  哪吒young  阅读(113)  评论(0编辑  收藏  举报