1.为什么我们需要自研网络
关注长安链的小伙伴都了解,长安链的P2P网络模块是基于libp2p开源项目进行封装的。libp2p体系完善、功能强大,为什么还要开发自研网络呢?主要有以下几个原因: (1)libp2p针对通用场景而设计,应用于区块链场景还需要进一步适配。 (2)libp2p过重,长安链使用的只是冰山一角,绝大部分功能没有用武之地。 (3)自研网络模块将进一步提升长安链自主可控性。 在这样的背景下,自研网络模块诞生了。 我们给自研P2P网络起了一个新名字——Liquid,寓意着快速适应复杂易变的网络环境以及流畅的传输效率。
2.了解自研网络Liquid
在自研网络Liquid设计和开发的过程中,我们对libp2p进行了重新梳理,同时对使用libp2p遇到的一些问题进行优化。Liquid的设计目标主要可归纳为以下几点: (1)Liquid与区块链场景完美适配。在设计之初,我们综合考虑并融合了原网络模块补充的功能,如:多链隔离、节点黑名单等。 (2)Liquid更加精简。我们对网络模块做减法,只保留必须的功能,形成了现在极其精简的Liquid的第一个版本。 (3)Liquid自主可控。无论从技术架构、代码实现,还是后续的技术演进,我们做到了“自己说了算”。 (4)Liquid融入更多新特性。研发团队从区块链的技术特征出发,为网络模块丰富了更多特性,如:多连接并发复用、大报文拆包并行传输、消息优先级管理等。 另外,非常重要的一点,Liquid满足长安链灵活装配的特性。基于相同的模块接口与长安链无缝适配,可以根据开发者的需要快速的装配和使用。
本次发布的Liquid alpha版本,为长安链的网络模块带来了三个新特性: (1)多连接并发复用。Liquid优化了libp2p节点间只建立一条物理连接的限制,多条链路可以更有效的利用网络资源。这个特性也是下面两个特色功能的实现基础。 (2)大报文拆包并行传输。区块链系统节点间存在大报文通信的场景,如共识的区块报文,在高并发场景下会产生几十MB甚至上百MB的报文传输。将大报文拆分,并给予多连接并发复用的机制并行传输,可以极大的缩短报文传输延时,对性能的提示效果显著。 (3)消息优先级管理。区块链节点间存在多种消息类型,如:共识投票消息、交易广播消息、区块同步消息、节点发现消息等。某些消息虽然比重不大但至关重要,例如共识投票消息控制着整个出块周期,决定着各节点间块高度的一致性。因此,Liquid增加了消息优先级管理的功能,将共识类的消息定义为最高优先级,同时也给开发者预留了定义优先级的接口,可以定制化设置。
我们可以把节点间的消息传递想象成车辆通过高速公路收费站的场景,以便进一步理解。
Libp2p只提供了一个收费窗口,所有车辆无差别对待,按先来后到排队通过。而Liquid则是设置了多个窗口(多连接),同时增设了速通窗口(优先级管理)保证重要车辆优先通行。如果需要运输体积较大的货物,则把货物拆分并使用多辆车运输通过收费站(拆包并行传输),提升收费站的通过效率。 注:基于libp2p的网络模块同样做了上述特性的升级。
下面汇总liquid与现有libp2p网络模块的特性对比:
3.Liquid后续规划
未来Liquid主要有以下几个主要的技术演进路线:
(1)支持复杂网络组网,目前NAT穿透、节点中继等功能还在规划中,需要在后续版本提供。
(2)支持更多传输协议,扩展WebSocket、基于流的传输协议等。
(3)支持层级架构的网络组网,支持万级规模节点组网,兼具良好扩展性。
敬请期待。
4.如何使用Liquid
在chainmaker-go中启用Liquid作为网络实现,只需将
net: provider: libp2p
改为:
net: provider: liquid
注:Liquid与libp2p传输协议不兼容,所以对于同一条链,必须装配使用同一个版本的网络模块。
Liquid支持TCP、QUIC两种底层传输协议,具体使用哪种协议会根据本地监听地址自动识别。使用TCP的本节点地址配置:
net: listen_addr: /ip4/0.0.0.0/tcp/11301
使用QUIC的本节点地址配置:
net: listen_addr: /ip4/0.0.0.0/udp/11301/quic
其他节点地址的格式也需要与传输协议保持一致,例如: 使用TCP的其他节点地址配置:
/ip4/127.0.0.1/tcp/11302/p2p/QmcQHCuAXaFkbcsPUj7e37hXXfZ9DdN7bozseo5oX4qiC4
使用QUIC的其他节点地址配置:
/ip4/127.0.0.1/udp/11302/quic/p2p/QmcQHCuAXaFkbcsPUj7e37hXXfZ9DdN7bozseo5oX4qiC4
Liquid支持多连接复用并行发送,假设我们允许与每个其他节点最多创建5个连接,可通过如下配置开启:
net: max_conn_count_each_peer: 5
LiquidNet支持将大消息体拆分为最多256个小包并行发送,在接收端自动组装成原大体积消息的功能。可通过如下配置开启:
net: pkt_enabled: true
LiquidNet支持消息发送优先级控制,可通过如下配置开启:
net: priority_control: true #优先级总共划分为[0-9]总共10级,值越高,优先级越高。
开启优先级控制后,会使用下面默认优先级设置,开发者也可以根据需要自定义消息优先级。 优先级9:共识引擎消息 优先级8:区块消息 优先级7:交易消息 优先级5:同步引擎消息