
268
|
第
14
章
请求 预准备
客户端
准备 提交 响应
图
14-13
:
PBFT
共识算法,正常情况下的操作
在准备阶段和提交阶段中,节点向其他所有节点发送消息,并等待从相应数量的其他节
点收到消息,以检查消息是否匹配并确保不广播错误的消息。各节点对所有消息进行交
叉验证,从而保证只有无缺陷的节点才能成功提交消息。如果无法收集足够多的匹配消
息,节点不会进入下一步。
当副本收集到足够多的提交消息时,它们会通知客户端并完成当前回合。只有当收到
f + 1 个匹配的响应后,客户端才能确定执行已正确完成。
当副本注意到主节点处于非活动状态且怀疑它可能发生了故障时,就会发生视图变更。
检测到主节点故障的节点将不再回应消息(除了检查点和视图变更相关消息),广播一个
视图变更通知并等待确认。当新视图的主节点收到 2f 个视图变更事件时,它将发起一
个新视图。
为了减少协议中的消息数量,客户端可以先
试探性
执行请求(比如,当它们收集到足够
多匹配的 Prepared 消息之后)并收集 2f + 1 个匹配的响应。如果客户端无法收集到
足够多匹配的试探性响应,它将重试并等待 f + 1 的非试探性响应,就像之前描述的
那样。
PBFT 中的只读操作仅需一轮网络交互即可完成。客户端向所有副本发送读请求。各副
本等到所有进行中的修改该值的操作完成提交,然后在其试探性状态(tentative state)上
执行请求并回复客户端。当从不同副本收集到值相同的 2f + 1 个响应后,操作就完成
了。
14.5.2
恢复和检查点
副本将接受的消息保存在一个稳定的日志中。每条消息至少要保留到 ...