PBFT

it2025-09-08  8

文章目录

参考解释两种情况Case1 : Normal CaseCase2 : View Change 举个栗子

参考

bilibili算法主义视频讲解-PBFT基本概念介绍 深入浅出PBFT算法原理

解释

PBFT ,Practical Byzantine Fault Tolerance,实用拜占庭容错算法。

PBFT是在联盟链共识节点较少的情况下BFT的一种解决方案。

PBFT算法前提,采用密码学算法保证节点之间的消息传送是不可篡改的。

PBFT容忍无效或者恶意节点数:f,为了保障整个系统可以正常运转,需要有2f+1个正常节点,系统的总节点数为:|R| = 3f + 1。

PBFT是一种状态机副本复制算法,所有的副本在一个视图(view)轮换的过程中操作,主节点通过视图编号以及节点数集合来确定,即:主节点 p = v mod |R|。v:视图编号,|R|节点个数,p:主节点编号。

一张很经典的PBFT算法流程图附上: 主节点:node0

1 : request

客户端向主节点发送请求 : <REQUEST, o, t, c>

o: 请求的具体操作 t: 请求时客户端追加的时间戳 c: 客户端标识 REQUEST: 包含消息内容m,以及消息摘要d(m)

客户端需要对请求进行签名

2 : pre-prepare

主节点操作 校验客户端请求消息签名是否正确 if 正确: 正确请求 分配一个编号n (用于对请求进行排序) 广播 <<PRE-PREPARE, v, n,d>, m> 消息给其他副本节点 else: 非法请求,丢弃

v: 视图编号 d: 客户端消息摘要 m: 消息内容 n: 在[h, H]区间内 <PRE-PREPARE, v, n, d>进行主节点签名

3 : prepare

副本节点操作 1. 校验主节点PRE-PREPARE消息签名是否正确 2. 校验是否曾收过过同一v下,编号n,签名不同的 <<PRE-PREPARE, v, n,d>, m> 3. 校验d和d(m)是否一致 4. 校验n是否在[h, H]区间内 if 1,2,3,4正确: 广播 <PREPARE, v, n, d, i> 给其他节点(包括主节点) else: 非法请求,丢弃

v, n, d, m与上述PRE-PREPARE消息内容相同 i:当前节点的编号 <PREPARE, v, n, d, i>进行副本节点i的签名 记录PRE-PREPARE和PREPARE消息到log中,用于View Change过程中恢复未完成的请求操作。

4 : commit

主节点和副本节点收到PREPARE消息进行校验 1. 校验副本节点PREPARE消息签名是否正确 2. 校验是否已经收到了同一视图v下的n 3. 校验n是否在[h, H]区间内 4. 校验d是否和当前已收到的<<PRE-PREPARE, v, n,d>, m>中的d相同 if 正确: if i 收到 2f+1 个验证通过的 PREPARE 消息: 广播 <COMMIT, v, n, d, i> 给其他节点(包括主节点) else: 非法请求,丢弃

v, n, d, i与上述PREPARE消息内容相同 <COMMIT, v, n, d, i>进行副本节点i的签名 记录COMMIT消息到日志中,用于View Change过程中恢复未完成的请求操作。记录其他副本节点发送的PREPARE消息到log中。

5 :reply

主节点和副本节点收到COMMIT消息进行校验 1. 校验消息签名是否正确 2. 校验当前副本节点是否已经收到了同一视图v下的n 3. 校验d和d(m)是否一致 4. 校验n是否在[h, H]区间内 if 正确: if i 收到 2f+1 个验证通过的 COMMIT 消息: 运行客户端请求操作o 返回 <REPLY, v, t, c, i, r> 给客户端 else: 非法请求,丢弃

r:请求操作结果,客户端如果收到2f+1个相同的REPLY消息,说明客户端发起的请求已经达成全网共识,否则客户端需要判断是否重新发送请求给主节点。记录其他副本节点发送的COMMIT消息到log中。

两种情况

Case1 : Normal Case

Normal Case: 队长不是拜占庭的情况

replica0队长 replica3攻击节点

step1 : client向队长replica0发出一个请求 step2 :队长replica0把请求转播给其他人 step3 :其他人收到队长转播的请求之后,不知道队长说的靠不靠谱,所以大家互相交换一下信息 step4 :互相交换完信息之后,所有人都清楚其他人的状况,这个时候应该有2f+1个一致的信息(f个有问题的节点,f<n/3) step5 :所以所有的节点都知道这个信息是一致的,是靠谱的,所以大家都告诉其他人,我们可以commit这个信息了 step6 :等commit之后,节点再回复客户

Case2 : View Change

队长本身存在问题

step1 : client向队长replica0发出一个请求 step2 :队长给其余节点不同的信息 step3 :节点之间相互交流 step4 :各个节点之间等不到2f+1个相同信息(因为每个节点收到的消息都不一致) step5 :各个节点,死等……等一个时间片 等一个时间片都等不到 换队长! 如果整个系统中有2f+1个人说要换队长,就更换队长,按顺序来,如原本replica0是队长,现在replica1变成队长。

举个栗子

Case1公正的哆啦A梦是队长,告诉大家9点出去玩耍,大雄不想静香和男孩出去玩,所以大雄作恶,但是由于哆啦A梦,静香,男孩的消息都是9点,也就是一共4个人,有3个一致的消息,所以大家达成一致,9点是正确的信息。 Case2作恶的大雄是队长,因为不想让静香和别的男孩玩,所以他告诉每个人的消息都不一样,当哆啦A梦,静香和男孩之间互通消息之后发现大家的信息都不一致,就知道队长传递的信息有误

最新回复(0)