2020-11-26

PBFT (Practical Byzantine Fault Tolerance)

1、问题定义
拜占庭节点:节点的行为是任意的
异步环境的特点:消息丢失、消息延迟、消息重复传播、消息乱序
当分布式系统的拜占庭节点个数 f 占比全部节点个数 N 的 1/3 时,系统总能就某一问题达到一致性状态。
1/3 的原因:
由于是在异步系统,假设有 f 个诚实节点由于异步环境的特点不能及时返回消息,并且 f 个拜占庭节点传播的坏消息先于诚实节点到达,此时如果要保证系统能够正常运转,就要保证活跃的诚实节点的投票大于拜占庭节点的投票,即 N - f - f > f,即N > 3f

2、算法工作流程
整个算法的运行是分视图进行的,每个视图都有一个主节点负责对请求排序,其他节点是副本节点。主节点的选择是通过num = v mod R轮流选出的,其中num 是选中的节点的序号,v是视图数值,R是系统中节点的个数,整个系统的拜占庭节点个数小于1/3。当主节点出现故障时(可能的原因有主节点本身是个拜占庭节点、不可抗力造成的宕机等),就会启动视图更换。算法执行过程如下所示:
PBFT一般正常情况下工作流程其中,C为客户端,0是主节点,1、2、3是备份节点,其中3是故障节点。

1)request阶段
用户C将请求m发送给主节点,消息形式如下所示
request_message其中REQUEST:表明消息发送类型;o 表示请求对状态机的具体操作;t 确保用户的本次请求只会执行一次(后续的时间戳都大于本次的,即时间戳有序);c 指明客户端;σ是客户端 c 的签名

2)pre-prepare阶段
主节点 p 给请求分配一个序列号 n,并向其他所有的副本节点发送一个pre-prepare消息,消息形式如下所示:
在这里插入图片描述v是当前视图值,d是请求m的摘要。
收到pre-prepare消息的备份节点,检查消息的正确性,即视图是否是当前视图、分配的序号十分正确、主节点签名是否正确等。如果通过检查,副本节点就构造一个prepare消息,然后进入prepare阶段。

3)prepare阶段
通过检查的副本节点 i 将prepare消息转发给系统中的所有人,同时将自己构造的prepare消息和pre-prepare消息保存到自己的日志中。prepare消息的格式如下所示:
在这里插入图片描述每个收到prepare消息的节点,都会检查各个字段的有效性,通过检查之后,就会把该prepare消息记录到自己的日志中。
我们定义一个prepare消息为真,当且仅当,收到 2f 个不同的备份节点对同一个pre-prepare确认生成的prepare消息。

4)commit阶段
当一个节点 i(包括主节点和备份节点) 的prepare消息为真时,节点就进入commit节点,并构造一个commit消息,并将该消息发送给其余全部节点。消息格式如下所示:
在这里插入图片描述每个收到commit消息的节点就会检查每个字段的有效性,通过检查就将该commit消息保存到自己的日志中。
我们定义committed(m,v,n)为真,当且仅当有 f+1 个诚实节点的prepare消息为真;定义committedlocal(m,v,n,i)为真,当且仅当节点 i 的prepare消息为真,并且收到了 2f + 1 个节点发送来的commit。

5)reply阶段
每个committedlocal为真的节点就会执行对应的请求,并reply给用户。只要用户收到 f + 1个reply时就认为自己的请求被正确执行,因为假设最多只有 f 个拜占庭节点,收到 f+1个reply,则至少有一个是诚实节点的响应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值