长安链ChainMaker的多链隔离设计

在联盟链场景,一般一个节点对应一个参与方,一条链对应一类业务。当一个参与方有多个业务要上链,就需要采用多链方式去部署,一方面可以复用节点,另一方面可以做到业务的隔离。

长安链支持多链方式部署。如果同一个节点属于不同的链,就需要做到不同链之间的数据隔离,多链的隔离可以是进程的隔离或者服务的隔离。

长安链中多链的隔离除了网络模块,其他的模块都采用了服务的隔离:也就是不同的链有着不同的账本、不同的共识模块、不同的权限控制模块、不同的虚拟机模块等。

P2P网络模块是长安链节点之间信息交互的媒介,在网络模块实现多链数据隔离,相当于在信息的传输层面实现多链数据之间的隔离。

长安链的P2P网络模块传输信息的方式主要有两种,一种是单播直发,另一种是广播。两者多链数据隔离的原理是相同的。如果两个节点之间需要交互,那么实际的网络连接是必须要存在的,多链的数据隔离并没有做在网络层面,而是逻辑上的隔离。怎么理解“逻辑上的隔离”呢?我们打个比方来说,A、B、C三地都是快递中转站,A地只接收顺丰快递,B地只接收京东快递,C地既接收顺丰快递又接收京东快递,C地要想把快递分开处理有两个选择:一种是C地有两种快递不同的仓库,不同的工作人员,不同的运输体系,大家都互不影响,是真正的隔离;但这种方式投入较大,成本更高。而另一种方式是两种快递采用相同的仓库,相同的运输体系,只不过在快递到来之后,要做一个挑拣工作,如果快递是发往A地,就只需要把顺丰快递挑选出来后发送。前面所说的“逻辑上的隔离”就类似于第二种发快递的方式。

我们先来看一下长安链数据多链隔离的整体设计,如图:

图1

node1和node2节点属于链1(chain1),node3和node2节点属于链2(chain2),也就是node2既属于chain1又属于chain2,这时候就需要chain1和chain2的数据隔离。

不同的链有属于自己的权限控制模块(AccessControl),权限控制模块主要的职责是校验节点的身份信息,也就是判断节点属不属于一条链,当两个节点之间建立网络连接时,需要经过TLS握手,两个节点在TLS握手过程中,节点会使用权限控制模块去校验对方节点的身份,如果节点自己本身就属于多条链,那么它会用每条链的权限控制模块依次去校验对方,只要对方属于某一条或多条链的合法成员,网络连接就会建立。

网络连接建立后,节点会根据权限控制模块的校验结果,将自己连接的节点所属于的链记录到自己本地,维护一个节点和链关系的列表。

我们从三个具体方面去看网络模块多链的隔离:

1.网络拓扑;

2.消息单播直发;

3.消息广播。

网络拓扑

长安链的P2P网络模块是具有节点发现功能的,一旦一个节点加入到长安链的区块链网络中,会被其他节点发现并尝试建立连接。例如下图:

图2

node1和node3虽然不在同一条链上,但是因为它们都与node2相连,就会通过节点发现功能彼此发现对方,这样两个节点就会产生建立连接的可能。两者在TLS握手时,node1属于chain1,便会使用chain1的AccessControl模块去校验node3的身份,node3属于chain2,便会使用chain2的AccessControl模块去校验node1的身份,最后结果是全部校验失败,因为node3并不属于chain1,而node1也不属于chain2,所以node1和node3并不能通过TLS握手,不能建立连接。

也就是说,当两个节点并没有共同参与的区块链时,他们的网络连接都不能够正常建立,也就做到了隔离。

消息单播直发

消息单播直发的主要分为两种情况。

第一,两个节点并没有共同参与的链。单播直发的前提条件是两个节点之间建立连接,如果两个节点并没有共同参与的链,他们的网络连接不能正常建立,也就不能做到直发消息,做到了隔离。

第二,节点参与了多条链,单播直发不同的链的消息怎么做到隔离?如下图:

图3

我们在每一个消息中增加了链ID的标识,当一个参与了chain1和chain2的节点,收到了一条消息,该节点从消息中取得消息所属的链ID标识,根据链ID标识,把消息分给该链的消息总线模块(msgbus),由消息总线模块再分发给该链的其他模块。

消息广播

长安链在P2P网络模块有两种不同的实现:libp2p和liquid。libp2p是基于开源的p2p网络项目libp2p的改造实现;liquid是我们自主研发的p2p网络实现。

两者在广播上多链隔离实现的原理其实是差不多的,如下图:

图4

当一个节点收到消息广播时,会将不同链的消息,根据自己本地维护的节点与链的关系列表,来判断该消息该转发给哪些节点。

例如,图里的node2收到一条chain1的消息,从node2维护的节点与链的关系列表可知,目前chain1的消息需要转发给node1,而node3不属于chain1,所以消息并不会转发给node3,也就做到了广播的多链隔离。

在具体实现上,libp2p和liquid稍有不同,原因是libp2p的广播模块(libp2p-pubsub)原本并没有实现数据广播的绝对隔离,而我们自研的liquid网络是有广播隔离功能的。

Libp2p本身没有广播的绝对隔离功能,也就是libp2p-pubsub在收到消息之后,理论上会广播给路由表中所有的节点,我们通过改造libp2p-pubsub的路由表,增加了一个白名单的功能,使其在广播时,只将消息转发给白名单里的节点,然后,每一个链都有自己的一个广播模块(libp2p-pubsub),每个广播模块的白名单里的节点都是属于该链的成员节点。这样就实现了消息只在链内隔离广播的功能。

Liquid是长安链团队自主研发,其本身就有广播隔离的功能。Liquid的广播模块路由表里的节点必须是注册了相同协议ID的节点,而该协议ID是根据链ID标识建立。也就是说,不同的链拥有不同的广播模块,每一个广播模块的路由表里的节点都只能是该链上的节点,因为只有该链上的节点才能根据链ID标识注册该广播协议,以此实现了消息只在链内隔离广播的功能。

RECOMMEND

推荐阅读

打通链上链下,构建全链条可信价值生态—长安链预言机

长安链交易防重之布谷鸟过滤器

BigFilter全局交易防重组件的介绍与应用

Tips

更多长安链开源项目QA,可登录开源社区、技术文档库查看。

下载源码

https://git.chainmaker.org.cn/chainmaker/chainmaker-go

查阅文档

https://docs.chainmaker.org.cn/

长安链ChainMaker案例征集

http://www.wenjuan.com/s/UZBZJvhFGte/

“长安链ChainMaker”是国内首个自主可控区块链软硬件技术体系,由微芯研究院联合头部企业和高校共同研发,具有全自主、高性能、强隐私、广协作的突出特点。长安链面向大规模节点组网、高交易处理性能、强数据安全隐私等下一代区块链技术需求,融合区块链专用加速芯片硬件和可装配底层软件平台,为构建高性能、高可信、高安全的数字基础设施提供新的解决方案,为长安链生态联盟提供强有力的区块链技术支撑。取名“长安链”,喻意“长治久安、再创辉煌、链接世界“。

猜你喜欢

转载自blog.csdn.net/weixin_55760491/article/details/126284341