12. 共识算法切换功能
12.1. 概述
使用长安链的过程中,为了能在不停机下,达到在不同的使用阶段可以使用不同共识算法的目的,如在确保信任的环境中, 可将bft共识切换到非bft共识如raft,以提高tps要求。
长安链在3.0.0版本引入了共识切换的功能,目前可以支持tbft和raft共识算法的相互切换。
12.2. 关键逻辑
12.2.1. 系统合约逻辑
在链配置合约SystemContract_CHAIN_CONFIG中添加了ChainConfigFunction_CONSENSUS_SWITCH方法,其主要流程如下
链启动时,会将初始化的共识状态句柄注册到vm中
vm执行链配置合约的共识切换方法,通过虚拟机上下文获取到共识状态句柄,进而获取到本节点所知道的所有共识节点的状态信息
获取目标共识可运行所需的活跃节点数,同获取到所有共识节点的状态信息进行比较,如果不满足则拒绝切换
如果目标共识运行依赖其他必需配置,则对传入的配置信息进行校验,校验不合格则拒绝切换
所有条件都检验通过,则表示可切换
12.2.2. 共识切换执行流程
链启动时,初始化所需的各个模块,依次初始化msgbus–>vm–>consensus
共识模块根据当前配置的共识类型初始化完对应的共识算法后,将共识句柄注入到vm中(提交给共识状态holder),以在合约执行的过程中能够获取共识的相关信息
创建配置块订监听器,订阅msgbus的配置块事件
启动所需模块
当有配置块被提交时,msgbus通知配置块订阅器
配置块更新本地链配置信息
判断是否是共识算法切换的配置变更,如果是则执行流程8,否则终止处理
终止当前的共识算法
根据新的链配置信息,重新初始化共识,并启动
继续监听配置变更事件
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