—— 背景 ——

以后,区块链跨链平台的接入形式在架构设计上存在着较大差别,如何将利用链疾速、便捷地接入跨链零碎是一个亟待解决的问题。趣链BitXHub跨链服务平台采纳中继链+网关的跨链计划,其中,跨链网关负责着区块链间收集和流传交易的角色。采纳插件机制的设计将网关(Pier)与利用链交互的模块与跨链网关外围功能模块进行解耦,从而实现不同品种利用链高效地接入跨链零碎。在Pier运行时,通过动静加载插件的形式实现不同利用链的灵便适配。为了更好的晋升Pier与利用链的交互能力,具体利用链插件须要依据不同区块链的个性实现具体的接口,交互接口须要满足以下几个性能:

1)监听利用链上的跨链事件并传给外围模块进行解决;

2)执行来自于网关收回(来自于其余利用链)的跨链申请;

3)可能被动查问利用链上已收到和已执行的跨链申请状态。

在插件实现计划的设计中,咱们先后采纳了两种不同的插件机制,上面就来介绍一下咱们应用原生插件时碰到的问题以及新插件计划的劣势。

—— 原生插件——
go语言从1.13 版本开始反对编译为插件,应用形式如下

go build --buildmode=plugin -o appchain.so *.go
go我的项目在编译时能够通过 --buildmode 指定为插件模式,这种形式将输入为动静链接文件。该文件并非可间接运行的二进制文件,而是提供给其余二进制运行时的动静调用。
在主二进制文件中的应用形式如下:

总结来说原生插件具备以下特点:
长处:
1) 应用体验和原生代码统一,相似于代码模块的二进制化;

2) 效率较高,插件间接在主程序过程空间中运行。

毛病:
1)原生插件中的依赖库与主程序必须放弃完全一致,否则启动的时候会报错,而且不管这个依赖是间接援用还是间接援用,都会呈现这个问题。

—— 转战RPC插件——

原生插件中严格的版本限度,使得在降级插件和或网关主程序性能时,可能因为无心降级了主程序某些依赖,插件也必须作出雷同的适配降级。这种形式不利于插件的齐全解耦,因而咱们转向了另外一个应用RPC形式的GO插件我的项目。(该我的项目 GitHub地址:https://github.com/hashicorp/...)

在 GO 原生反对的插件机制呈现之前,hashicorp的go-plugin就曾经存在,不过GO原生插件进去之后,他们也并没有放弃对该项目标反对,因为总的来说原生插件并不是很欠缺,在某些场景下还是 go-plugin 更不便。

go-plugin 插件的应用形式如下:

简略来说,go-plugin 我的项目实现的插件形式采纳了 C/S 模式,主程序作为 RPC Client,具体插件作为 RPC Server,Server 和 Client 通信也是基于的 interface 接口标准来通信。
具体应用流程如下:

1)形象须要插件化的interface,这里间接复用原生插件中应用的接口定义即可;

2)针对 Client 端和 Server 端,都实现上述接口。Server 端的实现是具体的插件解决逻辑局部的代码;Client 端的实现只需封装一下gRPC解决的后果和异样信息,之后便能够做到主程序在应用插件时对于gRPC的弱感知化。

Server 实现局部:

Client 实现局部:

▲额定须要留神的是:

插件中须要调用 plugin.Serve 来受权主程序应用本人的RPC服务。这里须要留神的是,主程序和插件通信前须要进行握手,次要包含确认该插件的版本信息。

主程序应用 plugin.Client 对象启动插件,该插件是运行在另一个过程中的,所以插件解体并不会影响到主程序。

client与server在应用中实际上是通过过程间Socket来实现通信,这尽管就义了肯定的性能却换来了原生插件的单过程计划所不具备的依赖解耦、多语言反对等灵便利用。

—— 结语——

go-plugin提供两种通信形式的抉择,一种是 GRPC,一种是 GO语言规范库中自带的 net/rpc 。GRPC插件的益处是能够采纳不同的语言来实现,并且Google protobuf 也是反对多语言的。网关插件实质上已成为连贯利用链并实现对网关提供RPC服务的桥梁,开发者在跨语言编写插件时的妨碍会大大降低,在面对不同利用链个性时也能做到更加牢靠与简洁的逻辑出现。
对跨链技术感兴趣的小伙伴,增加小助手桔子(18458407117)退出技术交换群,共论区块链的有限将来~

作者简介
王荻矣
趣链科技数据网格实验室BitXHub团队