共计 2565 个字符,预计需要花费 7 分钟才能阅读完成。
背景
以后的区块链利用和底层技术平台呈现出百花齐放的状态,但支流区块链利用中的每条链大多仍是一个独立的、垂直的关闭体系。在业务模式日益简单的商业利用场景下,链与链之间不足对立的互联互通机制,这极大限度了区块链上数字资产价值的流动性,跨链需要由此而来。
BitXHub 平台由中继链、利用链以及跨链网关三种角色组成,并链原生集成 W3C 规范的 DID,根据场景导向可灵便组织部署架构,具备通用跨链传输协定、异构交易验证引擎、多层级路由三大外围性能个性,保障跨链交易过程的安全性、灵活性与可靠性。BitXHub 于 2020 年 3 月份开源外围代码组件,心愿与宽广开发者携手共建万链互联生态。
我的项目开源地址
GitHub: https://github.com/meshplus/b…
BitXHub 零碎架构
BitXHub 的技术架构如下图,自下而上分为物理层、根底层、跨链服务层、接口层四局部:
第一层是物理层,中继链的设计为了满足不同场景下用户物理环境需要,反对在一般物理机、云主机或者嵌入式设施上稳固运行,兼顾多场景适用性。
第二层是根底层,这一层蕴含了联盟链自身须要具备的模块,比方网络模块、存储模块、共识模块、虚拟机、隐衷平安模块。
第三层是跨链相干的服务层,包含利用链治理模块、执行模块、事务管理模块、验证引擎模块和隐衷爱护模块,各模块相互合作实现中继跨链流程。
第四层是接口层,中继链对外提供 gRPC 和 Restful 两种接口服务,反对不同场景下用户的应用。
接下来为大家分享 BitXHub 外围模块的工作原理,次要包含:跨链交易并行执行设计方案、如何应用 GO 插件机制适配多种共识算法以及 BitXHub 中的多模块化实际。
跨链交易并行处理
▲ 背景
在区块链中,每个区块中蕴含一个交易列表,然而个别都是串行执行,因为串行执行尽管可能保障每个节点失去账本保持一致。
在中继链上,交易可能分为跨链交易和一般交易。一般交易负责中继链上原生的一些事务处理,数量较少,执行的速度较快;另一部分是跨链交易,这是中继链上次要的交易类型,跨链交易因为波及到验证规定的验证,在执行速度上是比较慢的。
为了减速中继链上的交易执行,咱们想到能够对无依赖关系的交易进行并行化的解决,这些交易对于账本的改变并不重合,能够晋升中继链解决交易的效率。
咱们对于中继链上的交易进行分类,并对链上的次要交易类型——跨链交易进行额定的减速策略。
▲ 分组策略
对于一个区块中的交易列表:
首先辨别一般交易和跨链交易
依照区块中交易的程序,没有被一般交易隔断的跨链交易能够分为一组,碰到一般交易之后必须开始从新分组。这是因为一般交易中可能蕴含利用链治理、验证规定治理等类型的交易,如果这些类型的交易为执行的话,可能会影响到后续跨链交易的执行。
跨链交易分组
对于上述的每一个跨链交易分组,还能够进一步细分这些跨链交易。因为跨链交易中可能是从不同的利用链上发送过去的,这些不同利用链上收回的跨链交易自身在中继链上的解决是不会相互影响的,所以这些跨链交易能够被持续细分。
交易执行
在上述两个步骤中,可能失去多个分组,然而对于这些分组,并不能简略的全副并行执行。可能进行并行处理的局部是跨链交易的局部,一般交易还是无奈并行执行。当交易列表中存在一般交易时,必须复原到串行执行,碰到跨链交易的分组,能够依照发动链分成的细分组来并行处理。
共识算法插件模块
Go 语言的插件零碎基于 C 语言动静库实现的,通过采纳 Go 语言提供的插件模式,实现 BitXHub 对共识插件的动静链接加载。动静链接的机制能够为咱们提供更多的灵活性,主程序能够在编译后动静加载共享库实现热插
查找插件门路是否存在(编译后的.so 文件);
- 通过 Go 语言 plugin 模块加载插件文件,plugin.Open 返回构造体中蕴含办法符号表;
- 查找插件是否实现 NewNode 办法符号,间接利用了构造体中的符号表,如果没有对应的符号表会返回谬误;
- 类型断言办法的入参和出参;
- 调用 NewNode 办法,这一步返回真正的共识算法模块实例;
多模块抉择加载
BitXHub 中某些模块有多种实现,比方交易执行模块有串行执行器和并行执行器,账本模块有带历史数据的账本实现和不带历史数据的账本实现。如果仅仅是这种多种实现的状况,间接在 BitXHub 代码中进行实现即可,BitXHub 启动时依据配置文件进行抉择。然而咱们碰到了一个特地的需要,某些个性(比方并行执行器)仅在商业版 BitXHub 中提供,并不凋谢源代码。因而间接在开源的 BitXHub 中实现代码是不可能的;同时,商业版和开源版的大部分代码是一样的,在外部再保护一份商业版本的 BitXHub 也是不太事实的。因而,咱们抉择仅仅把商业版本个性闭源,利用 go 语言的个性将开源的 BitXHub 和闭源的商业版本模块联合,即可编译出商业版本的 BitXHub 二进制文件。
以串行执行器和并行执行器为例,并行执行器模块如何编译到 BitXHub 中呢?BitXHub 代码中存在一个.template 文件专门 import 用于闭源的模块,如果编译商业版本,
Makefile 便会依据该文件生成.go 文件将这两个模块的包引入(这种 go 语言中带下划线的 import 形式能够显式的调用包的 init 办法);同时,BitXHub 中存在一个 goent.diff,外面记录了那些闭源的个性模块应用的具体版本,编译商业版本时会依据该文件批改 go.mod。这样闭源个性相干模块就编译进 BitXHub 了。
另外,咱们开发了一个独自的 Agency 模块,该模块有 register 和 get 办法,register 办法用于注册不同类型的执行器的构造方法,get 办法依据传入的类型失去对应的执行器的构造方法。
串行执行器和并行执行器都在 init 办法中调用 agency 中的 register 办法进行各自类型和构造方法的注册。当 BitXHub 启动时,所有包的 init 办法会先于 main 办法运行,这样两个执行器的类型和构造方法就被注册进 agency 模块了,当 main 函数运行时,BitXHub 依据配置文件失去须要加载的执行器类型,并从 agency 模块中失去对应的构造函数,就能够结构出对应的执行器进行应用了。
作者简介
徐才巢
趣链科技数据网格实验室 BitXHub 我的项目负责人
与小助手桔子(18458407117)一起“趣”!