12. 共识算法切换功能

12.1. 概述

​ 使用长安链的过程中,为了能在不停机下,达到在不同的使用阶段可以使用不同共识算法的目的,如在确保信任的环境中, 可将bft共识切换到非bft共识如raft,以提高tps要求。

长安链在3.0.0版本引入了共识切换的功能,目前可以支持tbft和raft共识算法的相互切换。

12.2. 关键逻辑

12.2.1. 系统合约逻辑

在链配置合约SystemContract_CHAIN_CONFIG中添加了ChainConfigFunction_CONSENSUS_SWITCH方法,其主要流程如下

合约流程图

  1. 链启动时,会将初始化的共识状态句柄注册到vm中

  2. vm执行链配置合约的共识切换方法,通过虚拟机上下文获取到共识状态句柄,进而获取到本节点所知道的所有共识节点的状态信息

  3. 获取目标共识可运行所需的活跃节点数,同获取到所有共识节点的状态信息进行比较,如果不满足则拒绝切换

  4. 如果目标共识运行依赖其他必需配置,则对传入的配置信息进行校验,校验不合格则拒绝切换

  5. 所有条件都检验通过,则表示可切换

12.2.2. 共识切换执行流程

执行流程图

  1. 链启动时,初始化所需的各个模块,依次初始化msgbus–>vm–>consensus

  2. 共识模块根据当前配置的共识类型初始化完对应的共识算法后,将共识句柄注入到vm中(提交给共识状态holder),以在合约执行的过程中能够获取共识的相关信息

  3. 创建配置块订监听器,订阅msgbus的配置块事件

  4. 启动所需模块

  5. 当有配置块被提交时,msgbus通知配置块订阅器

  6. 配置块更新本地链配置信息

  7. 判断是否是共识算法切换的配置变更,如果是则执行流程8,否则终止处理

  8. 终止当前的共识算法

  9. 根据新的链配置信息,重新初始化共识,并启动

  10. 继续监听配置变更事件

12.3. 使用说明

12.3.1. 升级办法

共识算法切换要求所有的节点都是3.0.0版本后才可以使用,不允许有23x版本,否则将导致错误发生

12.3.2. sdk逻辑接口

// ### 构造 raft切换到tbft payload 
// 参数说明:extConfig: 应用到tbft共识的配置信息  无更改则填nil
CreateRaftToTbftPayload(extConfig []*common.KeyValuePair) (*common.Payload, error)
// ### 构造 tbft切换到raft payload
// 参数说明:extConfig: 应用到raft共识的配置信息  无更改则填nil
CreateTbftToRaftPayload(extConfig []*common.KeyValuePair) (*common.Payload, error)

目前版本仅支持tbft和raft算法之间的相互切换,其中参数extConfig是为目标共识配置的扩展信息,对应链配置的consensus.ext_config,不需要此参数可选填nil

12.3.3. 权限配置

共识切换默认启用的权限为major,可通过更改资源策略来更改共识切换的权限,具体可参考身份权限管理章节

合约名:CHAIN_CONFIG, 方法名:CONSENSUS_SWITCH,资源名:CHAIN_CONFIG-CONSENSUS_SWITCH, 描述:共识切换

12.3.4. cmc命令

./cmc client chainconfig consensus switch \
--sdk-conf-path=./testdata/sdk_config.yml \
--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org4.chainmaker.org/user/admin1/admin1.tls.crt \
--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org4.chainmaker.org/user/admin1/admin1.tls.key \
--src-consensus=tbft \
--dst-consensus=raft \
--sync-result=true

说明:

  • src-consensus: 源共识类型,需和链上的当前使用的共识类型相对应

  • dst-consensus: 目标共识类型

  • 两字段取值为tbft或raft