长安链支持自动发现、自动连接的组网方式,默认在线的每个节点都可以作为种子节点为其他节点提供网络发现服务,每个种子节点都会记录网内节点地址信息。当有新节点连接到某个种子节点时,新节点会向该种子节点查询网内其他可连接节点的地址,拿到其他节点地址后,新节点会主动尝试与这些节点建立连接;另外,种子节点在接受了新节点链接后,会通过网络发现服务将该新节点的地址通知给其他在线的种子节点,其他节点在获得该新节点地址后,也会主动尝试与该新节点建立连接。
长安链理论上可实现上万甚至更多节点同时在线组网。
长安链可以针对复杂网络环境场景提供组网通讯解决方案,包括但不限于NAT穿透、代理节点转发等。
基于libp2p的改进:manage
核心包增加对国密SM算法的支持;
libp2p-gossip-pubsub功能模块增加白名单功能,实现对Gossip路由表的控制,达到广播消息隔离效果;
引入StreamPool,实现stream复用提高性能、网络吞吐能力自动扩容等特性。
P2P网络相关特性,可用下图一图汇总,包括:
大规模节点组网;
动态节点和连接管理;
专有网络穿透连接;
多链网络隔离。
ChainNodeInfo是链上节点信息结构体,主要存储某个链上与本地节点建立连接的节点NodeID、网络地址、TLS证书等信息。
MsgHandler是网络消息处理器,当网络模块收到来自其他节点或订阅的消息时,会根据消息类型回调给不同的消息处理器去处理接收到的消息。
ChainNodesInfoProvider是链上节点信息Provider接口定义,主要用于给rpcServer或VM提供查询当前链已连接节点信息功能。
NetService是网络服务接口定义,主要用于为其他模块提供网络服务支持。
BroadcastMsg方法,向链内广播一条消息,需要指定消息类型。
Subscribe方法,一个用于处理指定消息类型的订阅消息处理器,与BroadcastMsg配合使用。
CancelSubscribe方法,一个用于处理指定消息类型的订阅消息处理器。
ConsensusBroadcastMsg方法,向链内共识节点广播一条消息,需要指定消息类型。该方法只会把消息发给共识节点,非共识节点收不到该方法广播的消息。
ConsensusSubscribe方法,一个用于处理指定消息类型的只发给共识节点的订阅消息处理器,与ConsensusBroadcastMsg配合使用。
CancelConsensusSubscribe方法,注销一个用于处理指定消息类型的只发给共识节点的订阅消息处理器。
SendMsg方法,向指定节点直接发送网络消息。
ReceiveMsg方法,注册一个用于处理其他节点直接发送过来的消息处理器。
Start方法,启动网络服务。
Stop方法,停止网络服务。
GetNodeUidByCertId方法,根据证书ID查询使用该证书ID对应的TLS证书节点的NodeID。
GetChainNodesInfoProvider方法,返回ChainNodesInfoProvider接口实现。
网络模块主要负责如下功能实现:
节点组网
具有安全保障的节点间数据通讯
节点网络身份认证
消息广播及订阅(Pubsub)
扩展支持节点自动发现、自动组网
多链间网络消息数据隔离
复杂网络环境场景解决方案的支持