当前位置: 首页 > news >正文

长安链共识算法切换:动态调整,灵活可变

#功能发布

长安链3.0正式版发布了多个重点功能,包括共识算法切换、支持java智能合约引擎、支持后量子密码、web3生态兼容等。我们接下来为大家详细介绍新功能的设计、应用与规划。

随着长安链应用愈加成熟与广泛,一些在生产中很实用的需求浮出水面。长安链3.0正式版围绕此类需求融合了多个功能特性,共识算法切换作为其中之一可以赋予联盟链更好的可扩展性,动态灵活的应对系统上线后业务发展、组织节点新增或变更等场景。

共识算法的选择取决于链上节点互信程度、容错率需求等因素。随着业务的发展,已有业务链可能会面临共识性能逐渐不满足现有需求、链上新增组织时节点间互信程度发生了改变等情况,这时共识算法切换就成了非常迫切的需求。

长安链原生支持RAFT、TBFT、ABFT、DPOS等多种共识算法,在首次配置启动后所使用的共识算法即落定不可改变。为了满足更多使用场景中改变共识的需求,长安链在3.0正式版开始支持切换已完成配置的链共识算法,目前TBFT和RAFT共识之间可切换,未来将会带来更多支持。在这里将为大家剖析下长安链是如何进行共识算法切换的。

 一、概述 

长安链共识算法切换是通过发起共识算法切换交易请求,判定当前的运行环境是否允许新共识算法运行,并对这种判定达成共识后,如果允许切换,则终止原共识算法启用新的共识算法。共识类型在长安链中配置如下

图片

 二、共识切换合约逻辑 

图片

图1

1.合约执行时,通过虚拟机运行获取到本节点所知晓的当前的共识运行环境信息;

2.获取切换的目标共识算法运行所依赖的环境条件;

3.判定目前的运行环境信息是否满足目标共识依赖的环境条件;

4.如果可切换,合约将更改链配置中共识的类型到目标共识类型,如果需要,则同时更改共识相关的额外配置信息。

概念说明

共识的运行环境:一般包括的信息有参与共识的节点、当前在线的共识节点、互相可正常连通的共识节点等。

共识算法依赖的条件:不同类型的共识算法能够正常运行所依赖的条件不尽相同,如CFT类共识需要满足2f+1<=n, BFT类满足3f+1<=n

 三、整体流程 

核心流程如下:

图片

图2

1.在共识切换合约逻辑中有提到在执行合约时,需要通过合约运行时获取到共识的运行环境信息,在长安链中这个信息由当前运行的共识算法实例提供,因此在依据链配置中的共识类型初始化成功相应的共识算法实例后,将其注册到vm中(共识状态holder);

2.创建配置块订监听器,解析监听到配置块,比对配置块中的共识类型同当前运行的共识类型是否相同,不同意味着需要对共识算法进行切换。

3.切换时,终止掉当前链的共识实例,并依据新的共识类型创建新的共识算法实例,而后将其注册到vm中以替换掉原有注册的共识实例。启动新的共识实例,完成切换。

 四、共识运行环境信息的采集 

在这里我们以RAFT为例,选择RAFT是因为RAFT算法的实现中,从节点之间是不知道彼此的状态的,而共识算法切换对于所有共识节点来说都需要获取到一个相对完备的环境信息,只有这样才能保证对切换的结果达成确定的共识,切换完成后共识也能正常地进行作业。

图片

图3

RAFT信息收集中,定义了两种消息类型

lHeartBeat:心跳消息,各个节点在启动后,会定时地给其他节点发送心跳,以保证对方节点能够知晓自己的存活状态,如果超时未获取,则标记此节点为掉线状态

lNodeLink:节点的连接信息,即节点还需要知晓其他节点所掌握的外部节点的状态信息。比如,node_1需要知道node_2所掌握的node_1、node_2、node_3的心跳状态。

通过这两个消息类型,一个节点就能够知晓整个共识网络中节点的连通状况,在目前的长安链版本中,依据最小交集原则,从中计算出能够彼此都连通的节点的最小集合,在合约执行中,判定这个最小集合是否满足目标共识的需求,如在四节点RAFT->TBFT切换时,判定最小集合的节点数是否满足2f+1即3个节点。

至此,我们从合约逻辑、整体流程及信息采集三个方面阐述了长安链共识算法切换的机制和流程。

 五、共识算法切换使用 

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。

权限配置

共识切换默认启用的权限为major,可通过更改资源策略来更改共识切换的权限合约名:CHAIN_CONFIG, 方法名:CONSENSUS_SWITCH,资源名:CHAIN_CONFIG-CONSENSUS_SWITCH, 描述:共识切换

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 \

./cmc client chainconfig consensus switch \
--sdk-conf-path=./testdata/sdk_config.yml \
--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为目标共识类型

至此,我们从合约逻辑、整体流程、信息采集和使用四个方面阐述了长安链共识算法切换的机制和流程。长安链3.0正式版本支持的共识算法可切换能力将使区块链系统更加灵活,可以动态适应复杂多变的业务场景。

相关文章:

  • 项目实践《小说网站数据爬取》
  • 容器特权和接口爆破
  • Java 在PDF中插入页眉、页脚
  • .NET 依赖注入和配置系统
  • WebGL 理论基础 01 WebGL 基础概念
  • Linux常用命令(二)
  • Qt 容器类控件
  • 在Linux/Ubuntu/Debian中创建自己的命令快捷方式
  • Vue3快速上手(十七)Vue3之状态管理Pinia
  • 基于sortablejs实现拖拽element-ui el-table表格行进行排序
  • java Flink(四十二)Flink的序列化以及TypeInformation介绍(源码分析)
  • 探索ChatGPT时代下的下一代信息检索系统:机遇与挑战
  • 系统资源耗尽对服务器的影响
  • Linux 系统日志
  • (一)Linux+Windows下安装ffmpeg
  • AHK 中 = 和 == 等比较运算符的用法
  • Android系统模拟器绘制实现概述
  • canvas 绘制双线技巧
  • css布局,左右固定中间自适应实现
  • Cumulo 的 ClojureScript 模块已经成型
  • ES6简单总结(搭配简单的讲解和小案例)
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript类型识别
  • JavaScript异步流程控制的前世今生
  • Laravel Mix运行时关于es2015报错解决方案
  • python大佬养成计划----difflib模块
  • Rancher-k8s加速安装文档
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Zsh 开发指南(第十四篇 文件读写)
  • 阿里研究院入选中国企业智库系统影响力榜
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 解决iview多表头动态更改列元素发生的错误
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 数据科学 第 3 章 11 字符串处理
  • 微信小程序:实现悬浮返回和分享按钮
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #1015 : KMP算法
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (初研) Sentence-embedding fine-tune notebook
  • (七)理解angular中的module和injector,即依赖注入
  • (一) storm的集群安装与配置
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)iOS字体
  • .NET MVC第三章、三种传值方式
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [2669]2-2 Time类的定义
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [Android 数据通信] android cmwap接入点
  • [C#]C# OpenVINO部署yolov8图像分类模型