PBFT共识算法

PBFT共识算法

PBFT包括两个主要的工作流程

  1. 网络环境良好情况下的正常工作模式(网络节点都同步 而且 leader运行正常)
  2. 用于更换崩溃leader的view-change模式

正常工作模式

正常工作模式,包含三个子协议 Pre-Prepare,Prepare,Commit.

  1. 当leader收到客户端的transaction时,根据transaction广播pre-prepare消息。
  2. 收到pre-prepare消息的节点,广播prepare消息。
  3. 当节点收到2f个preprare消息时,广播commit消息。
  4. 当节点收到2f+1个commit消息时,处理transaction。

view-change模式

当正常工作模式出现超时,共识发生停滞的时候。节点会更换至view-change模式。并将节点本地的view-number++,同时广播view-change消息

如果节点的正常工作模式没有出现超时,但是收到了f+1个view-change消息。也会切换到view-change模式,并将节点本地的view-number++,同时广播view-change消息。

view-change工作模式规定新的leader为 view-change消息的heightmod 节点总数N。因此新的leader的转换过程,是在节点集合中循环的。

当节点发现自己就是新的view的leader,而且收到了2f+1个view-change消息时,广播NEW_VIEW消息。收到的2f+1个view-change消息被组合起来作为NEW-VIEW消息的proof。

当节点接收到一个 number大于等于自己当前view-number的NEW-VIEW消息时,更新自己的view-number到NEW-VIEW消息的number。

如果节点收到的NEW-VIEWnumber小于自己的当前number,则忽略。

节点进入view-change模式后,维护一个timeout计时器。 每一次view-change工作模式的失败(例如超时,即在timeout时间内收不到NEW-VIEW消息)都会使timeout计时器的超时时间翻倍。

对PBFT的攻击

背景

  1. Andrew Miller 设计了新的共识 HoneyBadgerBFT,论文中提到了BFT共识严重依赖时序假设,所造成的脆弱性。 在论文的附录中,Andrew Miller 介绍了BFT的攻击方法,本文将对该方法进行翻译和介绍。
  2. 另外本文不再对BFT的时序脆弱性进行论证,详情可见HoneyBadgerBFT的英文论文或者 中文论文。

断断续续的正常工作模式将会阻碍PBFT

我们会设计一个恶意的proxy调度器。拦截并延迟发给leader的消息。

下图展示了攻击的整个过程 其中 〇 后面的消息是该列表示的节点向外发出的消息 • 后面的消息是该列表示的节点接受到的消息 ❌表示收到的消息view已经过时,因而忽略。 红色区域表示 延时发送 粉色区域表示 延时接受 在每一格的右下角会标注该列节点所处的 view
!
从图中我们可以看出。 第一阶段 client向0,1,2,3四个节点发出Req。 作为leader节点的0 向外发出PP 准备挖矿 但是这个PP为攻击者抑制住了 所有节点在∆时间内 没有收到PP,便误认为是leader崩溃,进入view-change模式

第二阶段 节点0123进入view-change模式 节点0123向外发出V1,试图更换view,试图将leader更换为1 这时候,攻击者抑制节点1接受V1消息 使得节点023更新到了view1,同时leader也变成了节点1 只有节点1没有收到V1,于是等待大家推选出新的leader

第三阶段 节点1接收到了刚刚被攻击者抑制的V1消息,发现大家选了自己作为leader 于是向外宣布就职,发出消息N1PP1 节点023由于没有在阶段2的时间内收到N1PP1,以为节点1已经崩溃,无法胜任leader。故向外发送V2宣布,继续大选。 节点1收到了V2,发现自己错过了就职时间,很遗憾,只能附和V2.继续推选其他leader。 此时攻击者抑制节点2接受V2消息。 截止当前 节点013都认为节点2是新的leader 只有身为leader的节点2还不知情,继续等待大家选举leader

第四阶段 由于没有收到leader发出的就职消息,大家以为节点2已经崩溃。于是发起新的大选V3 节点2也在收到V2后又收到V3,发现自己已经错过了就职时间。很遗憾但是只能附和V3

不断循环上述过程,所有矿工都陷入无尽的大选循环当中,而不从事任何劳动。导致共识停滞。

总结
只要攻击者能抑制第一个leader发出PP,并顺次抑制其他leader接收Vn 整个网络中的共识就会永久停滞。

资料

  1. 知乎:HoneyBadger-BFT核心:PBFT时间敏感性及其攻击方法
    https://zhuanlan.zhihu.com/p/161629554
### PBFT共识算法的工作原理 PBFT(Practical Byzantine Fault Tolerance Algorithm)是一种高效的分布式一致性协议,旨在解决拜占庭将军问题的同时提高性能。它通过减少通信复杂度至多项式级别,使其实现了在实际系统中的可行性[^2]。 #### 主要阶段 PBFT的核心机制分为以下几个主要阶段: 1. **请求阶段** 客户端向主节点发送服务请求消息 `REQUEST`,其中包含客户端的身份、操作详情和序列号。主节点负责接收并处理这些请求。 2. **预准备阶段(Pre-Prepare Phase)** 当主节点接收到新的请求后,会广播一条 `PRE-PREPARE` 消息给所有备份节点。此消息包含当前视图编号、序列号以及客户端请求的内容哈希值。这一过程确保所有节点都知晓即将执行的操作。 3. **准备阶段(Prepare Phase)** 各个备份节点一旦接收到合法的 `PRE-PREPARE` 消息,则回复一条 `PREPARE` 消息给自己和其他副本节点。当某个节点收集到来自超过 \( \frac{2}{3}N \) 的确认响应时,进入下一阶段。 4. **提交阶段(Commit Phase)** 收集到足够的 `PREPARE` 响应之后,各节点再发出 `COMMIT` 消息通知其余成员已准备好完成事务。同样地,只有达到多数派支持才能继续前进。 5. **答复阶段(Reply Phase)** 终于达成一致意见以后,每台机器独立计算结果并向发起者返回最终答案——即所谓的 `REPLY` 报文形式反馈出去。 这种多轮交互的设计虽然增加了延迟成本,但却极大地提升了安全性保障水平;即使存在恶意行为体试图破坏整个网络环境下的数据完整性或者可用性状况下依旧能够正常运作下去。 此外,为了应对可能出现的领导者失效情况,PBFT还引入了一个称为“视图变更”的特殊流程用于动态切换新任负责人角色承担起协调工作职责所在之处。 ```python class PBFTRound: def __init__(self, view_number, sequence_number, client_request): self.view_number = view_number self.sequence_number = sequence_number self.client_request = client_request def pre_prepare(self): # Broadcast PRE-PREPARE message to all replicas. pass def prepare(self, received_preprepare_message): # Validate the PRE-PREPARE message and broadcast PREPARE messages. pass def commit(self, collected_prepares_messages): # Once enough prepares are gathered, send COMMIT messages. pass def reply(self, result_of_computation): # Send REPLY back to the client with computed results. pass ``` ### 性能优化措施 除了上述基本运行框架之外,还有几种策略被用来进一步增强其表现效果: - 利用写时复制技术加上仅保存少量检查点的方法降低了维护状态历史记录所需资源消耗量[^3]; - 设计了一套灵活可扩展的应用层抽象模型以便轻松集成进各种具体业务场景当中去[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值