PBFT算法流程

转载原址:https://my.oschina.net/u/3620978/blog/3142775

1. 系统模型

本部分介绍PBFT算法运行的系统模型。

1.1 网络

PBFT工作在异步的分布式系统中,系统中各个节点彼此通过网络连接。 系统运行时,消息的传递允许出现下列情形:不能正确发送、延迟、重复、乱序

1.2 拜占庭错误节点

系统允许错误节点也就是拜占庭节点表现出任意行为,但是需要附加一个限定条件: 节点失效彼此应相互独立,从而大部分或全部节点不会同时失效。
在有恶意攻击存在的情况下,可以采取类似于下列措施来保证这个限制的成立:各节点运行的服务程序和操作系统的版本尽可能多样化;各节点的管理员帐号和密码不同。

1.3 消息加密属性

1.3.1 使用加密技术的目的

防止身份欺骗、重播攻击;监测错误消息

1.3.2 具体使用的加密技术

公钥签名:用于验证消息发送者身份,PBFT中,实际上只用于view-change和new-view消息,以及出现错误的情况。其他消息都采用下面将会提到的MAC(消息认证码)进行认证。这是算法设计中提出的一种优化措施,用于提升算法性能。MAC:即消息认证码,用于算法正常操作流程中的消息认证消息摘要:用于检测错误消息

1.4 敌手特性

算法限定敌手(adversary)可以:串通拜占庭节点;延迟通信或正常节点。
同时,敌手不可以:无限延迟正常节点的通信;伪造正常节点签名;从消息摘要反推原始消息;让不同消息产生相同摘要。

2. 服务属性

本部分介绍运行PBFT算法的系统的服务属性。

2.1 关于副本复制服务

PBFT算法可用于实现确定性的副本复制服务(Replicated service)。 副本复制服务拥有状态(state)和操作(operation)。
客户端(client)向服务发起请求,以执行操作,并等待响应。
服务由 n个节点组成。操作可以执行任何计算,只要这些计算始终产生确定性的结果。
节点和客户端如果遵循算法的预定步骤执行操作,则被称为正常节点或客户端。

2.2 关于Safety和Liveness

只要系统中失效节点的个数不超过容错数 ,系统就能提供safety和liveness。

2.2.1 Safety

Safety的提供,是系统能保证客户端请求的线性一致性(linearizability),即请求按顺序一次一条地被执行。
PBFT相对于之前的算法如Rampart等的一个显著的不同在于,其Safety不依赖于同步假设。
算法不需限定客户端一定是正常的,允许其发送不合法的请求,原因是各正常节点可以一致性地监测客户端请求的各种操作。并且算法可以通过权限控制的方式对客户端进行限制。

2.2.2 Liveness

由于算法不依赖于同步提供 Safety,因此必须通过同步假设来提供 Liveness。
这里的同步假设是,客户端的请求最终总能在有限的时间内被系统接收到。
客户端可能会通过多次重传的方式,发送请求到服务,确保其被服务接收到。
PBFT所依赖的同步假设其实是比较弱的假设,原因是在真实的系统中,网络错误最终总可以修复。

2.3 关于算法弹性

PBFT的算法弹性(resiliency)是最优的:假定系统中失效节点最大个数为f,则系统最少只需要 3f+1 个节点就可以保证Safety和Liveness。

简单证明:
考虑到最不理想的情况,系统有最大数量的失效节点,即f个。(总节点数为n) 客户端此时可以接收到的回复个数最坏情况是 n-f,因为失效节点可能都不会回复。 但是,由于网络等原因,客户端接收到的 n-f 个请求中,实际上有可能包含有失效节点的回复(有可能是错误的),而另外一些正常节点的回复还未及时收到。 这其中,最坏的情况是,n-f个结果中,有f个是失效节点发送的。按照PBFT算法的定义,客户端需要收到 f+1 个相同的回复,才被当作是正确的结果。因此 n-f 个结果中,出去f个失效节点的结果,即 n-f-f = n-2f 至少要是f+1, 即 n-2f = f+1,也就是说 n=3f+1是最少需要的节点数量。

2.4 关于信息保密性

一般情况下,为确保服务的高效性,不能提供容错的信息保密性。
可能可以使用secret sharing scheme来获得操作参数和部分对操作来说透明的状态的保密性。

3. 算法主流程

本部分介绍运行PBFT算法的主流程,即正常操作流程。

3.1 主流程简介

3.1.1 相关定义

算法是状态机副本复制技术的一种形式:服务被建模为状态机,其状态在分布式系统中的不同副本节点上被复制。每个状态机副本节点保存维护着服务状态,并实现服务的各种操作。

假设所有副本节点个数为n,算法中,每个节点依次编号为 0, 1, ..., n-1

方便起见,假设系统中的副本节点总数为 3f+1。可以有更多数量的节点,但是这不会使算法的弹性更优,只会使系统的性能降低。

系统在称为视图(view)的配置下工作。视图以整数编号,从0开始。在一个具体的视图 v 中,通过 p =v mod n,决定出主节点(primary),而其余节点成为副本节点(backup)。当主节点失效时,进行视图变更(view change)。视图的编号是连续递增的。

3.1.2 算法主流程简要描述

算法主流程可简要描述如下:
1. 客户端通过向主节点发送请求,以调用服务的操作;
2. 主节点向其他所有副本节点广播该请求;
3. 各节点执行客户请求,同时将回复发送到客户端;
4. 客户端收到 f+1 个来自不同节点的相同的回复后,此回复即为本次请求的结果。

因为算法基于状态机副本复制技术,所以节点需满足两个条件:必须是确定性的,即对于给定的状态,以及给定的参数集合,调用相同的操作后,将始终得到相同的结果。

各节点拥有相同的初始状态。

在满足上述两个条件的情况下,算法可以保证系统的Safety属性:即使存在失效的节点,各正常副本节点仍可以就不同的请求的执行顺序达成总体的一致。

3.2 算法主流程

接下来详细描述算法主流程。为方便起见,这里省略讨论以下细节:
节点因空间不足导致错误,以及如何恢复;
类似网络的原因等导致的客户端消息的重传。

另外,假设消息使用公钥签名进行认证,而不是更高效的 MAC 的方式。算法流程的启动从客户端发送请求开始。

3.2.1 客户端操作

客户端操作流程示意图如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值