RBFT
鉴于公链中的POW共识等算法存在算力消耗浪费资源等问题,传统PBFT算法在可靠性与灵活性方面不够完善,平台改进算法RBFT(Robust Byzantine Fault Tolerant),极大地提高了传统PBFT的可靠性与性能。RBFT能够将交易的延时控制在300 ms,最高可以支持每秒上万笔的交易量,为区块链的商业应用提供了稳定高性能的算法保障。同时,平台通过Recovery机制,解决单点自动恢复、账本动态数据自动恢复等可靠性难题,保证集群非停机的情况下节点动态增删、热备切换和动态数据失效恢复(ARCM),大大增强了共识模块的可用性。
共识流程
RBFT共识算法的核心在于保证了区块链各节点以相同的顺序处理来自客户端的交易。其中,图中的Primary节点为区块链中动态选举出来的主节点,负责对客户端消息的排序打包,Replica节点为备份节点,所有Replica节点与Primary节点执行交易的逻辑相同。
RBFT共识流程如下图所示:
- 客户端Client将交易发送到区块链中的任意节点;
- Replica节点接收到交易之后转发给Primary节点,Primary自身也能直接接收交易消息;
- Primary会将收到的交易进行打包,生成batch进行验证,剔除其中的非法交易;
- (三阶段第一阶段)Primary将验证通过的batch构造PrePrepare消息广播给其他节点,这里只广播批量交易的哈希值;
- (三阶段第二阶段)Replica接收来自Primary的PrePrepare消息之后构造Prepare消息发送给其他Replica节点,表明该节点接收到来自主节点的PrePrepare消息并认可主节点的batch排序;
- (三阶段第三阶段)Replica接收到2f个节点的Prepare消息之后对batch的消息进行合法性验证,验证通过之后向其他节点广播Commit消息,表示自己同意了Primary节点的验证结果;
- Replica节点接收到2f+1个Commit之后执行batch中的交易并同主节点的执行结果进行验证,验证通过将会写入本地账本,并通过checkpoint检查点来进行结果校验的步骤,检查点规则可配置。
由以上的RBFT常规流程可以看出,RBFT将交易的验证流程穿插于共识算法的整个流程中,做到了对写入区块结果的共识。首先,Primary节点接收到交易之后首先进行验证,这保证了平台的算力不会被非法交易所消耗,使Replica节点能够高效地处理Primary节点的拜占庭失效。其次,Replica节点在接收到2f个Prepare消息之后对Primary节点的验证结果进行验证,如果结果验证不通过则会触发ViewChange消息,这再一次保证了系统的安全性。
视图更换
Viewchange(视图更换)是指因原Primary节点失效而Replica节点参与新Primary节点选举的过程,该机制是保证整个共识算法健壮性的关键。
Viewchange流程如下图所示:
- Replica节点检测到主节点有以上异常情况或者接收来自其他f+1个节点的ViewChange消息之后会向全网广播ViewChange消息;
- 当新主节点收到N-f个ViewChange消息时,会发送NewView消息;
- Replica节点接收到NewView消息之后进行消息的验证和对比,验证View的切换信息相同之后正式更换ViewChange并打印FinishVC消息,从而完成整个ViewChange流程。
节点增删
在联盟链的场景下,由于联盟的扩展或者某些成员的退出,需要联盟链支持成员的动态进出服务,而传统的PBFT算法不支持节点的动态增删。RBFT为了能够更加方便地控制联盟成员的准入和准出,为PBFT添加了保持集群非停机的情况下动态增删节点的功能。RBFT新增节点流程如下图所示:
- 首先,新的节点需要得到证书颁发机构颁发的证书,然后向联盟中的所有节点发送请求;
- 各个节点确认同意后会向联盟中的其他节点进行全网广播,当一个节点得到2f+1个同意加入的回复后会与新的节点建立连接;
- 随后,当新的节点和N-f(N为区块链联盟节点总数)个节点建立连接后就可以执行主动恢复算法,同步区块链联盟成员的最新状态;
- 随后,新节点再向主节点请求加入常规共识流程。最后,主节点确认过新节点的请求后会定义在哪个块号后需要改变节点总数N来共识(确保新节点的加入不会影响原有的共识,因为新节点的加入会导致全网共识N的改变,意味着f值可能改变)。
RBFT动态删除节点流程和新增节点流程类似。
数据恢复
区块链网络在运行过程中由于网络抖动、突然断电、磁盘故障等原因,可能会导致部分节点的执行速度落后于大多数节点或者直接宕机。在这种场景下,节点需要能够做到自动恢复并将账本同步到当前区块链的最新账本状态,才能参与后续的交易执行。为了解决这类数据恢复工作,RBFT算法提供了一种动态数据自动恢复机制。
RBFT的自动恢复机制通过主动索取区块信息,使自身节点的存储状态尽快和整个系统最新的存储状态一致,增强了区块链系统的可用性。