pbft拜占庭容错
October 18th, 2021

pbft介绍

拜占庭容错是为处理拜占庭将军问题而提供的一种实用性解决方案。

拜占庭将军问题的核心是说一个分布式网络中,在缺少可信任的中心节点和可靠的信道以及存在作恶节点的情况下,如何让网络中的各个节点达成共识,使数据趋向保持一致性,从而保障整个网络系统的正常运转。

拜占庭容错技术就是为解决这个点对点通讯问题而提出的一套解决方案。

pbft拜占庭容错算法是一种状态机副本复制算法,它包括三种协议:一致性协议,检查点协议,视图轮换协议。

发生故障的节点被称为拜占庭节点,而正常的节点为非拜占庭节点。

我们知道消息在可能丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。因此pbft建立的前提条件是不去考虑通信过程中消息是否会被截获或无法传达信息等问题,即消息传递的信道绝无问题,亦或者说网络中的消息可能存在丢失、乱序或延时到达的情况,但只要保证大部分消息在有限的时间里都能传达到目的地即可。

pbft算法要求一个分布式网络中要想容忍f个节点错误,则整个网络总节点数量要超过3f+1个,也就是说一个分布式网络系统中失效节点数量不可超过总节点数量的三分之一。

pbft算法可以在失效节点不超过总数1/3的情况下同时保证系统安全性和活性。

由于网络延迟或宕机,系统存在f个节点不回复响应(f个节点包括拜占庭节点和非拜占庭节点,最坏情况f个节点全是非拜占庭节点),剩下2f+1个响应中可能有f个拜占庭节点,从而得到n-2f>f,即响应中非拜占庭节点数目大于拜占庭节点数目(f+1>f)。

pbft算法的基本思路

假定在一个分布式网络中共有7个节点,每个节点都保存一个副本数据,7个节点现阶段都是副本节点,当网络启动并初始化时,我们假定当前视图状态为0,那么在0号视图下,通过视图编号对副本数量也就是节点数量取余数,即0除以7余数为0,那么就以编号为0的节点作为当前0号视图下的主节点,pbft通过这样一个方式来决定当前视图状态下话语主导权的归属。

在众多副本节点选出主节点后,客户端发来的消息请求都要由主节点来接收,并对这些消息请求进行数据校验,比对,封装,组织,排序,签名等等,然后把处理好的pre-prepare消息广播给其他副本节点,这个阶段称为前期准备阶段(pre-prepare)

副本节点收到主节点广播的pre-prepare消息后同样需要对其消息数据进行校验,比对,封装,组织,签名等操作,然后向各个副本节点包括主节点广播自己处理好的prepare消息,这个阶段称为准备阶段(prepare)

每个副本节点都会向其他副本节点包括主节点广播自己的prepare消息,也会接收并验证其他副本节点发给自己的prepare消息,当副本节点收到了2f+1个(包括自己的prepare消息)验证通过的prepare消息,表明网络中的大多数节点已经同意这个数据信息,此时副本节点便可以向其它副本节点包括主节点发送commit消息,这个阶段称为提交阶段(commit)

commit阶段用来确保网络中大多数节点都已经收到足够多的信息来达成共识,如果commit阶段发生视图轮换,会保存原来commit阶段的请求,不会达不成共识,也不会丢失请求编号。

每个副本节点都会向其他副本节点包括主节点广播自己的commit消息,也会接收并验证其他副本节点发给自己的commit消息,如果副本节点收到了2f+1个(包括自己的commit消息)验证通过的commit消息,说明当前网络中的大部分节点已经达成共识,运行客户端的请求操作,并反馈reply消息给到客户端,这个阶段称为响应阶段(reply)

客户端如果收到f+1个相同的reply消息,也就是超过三分之一的节点反馈reply消息给到客户端,说明客户端发起的请求已经达成全网共识,否则客户端需要判断是否重新发送请求给主节点。

Subscribe to 0xFd8c…A063
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from 0xFd8c…A063

Skeleton

Skeleton

Skeleton