用途
P2P 网络层负责连接 Midnight 节点,并在去中心化网络中实现数据交换。Midnight 使用 Polkadot SDK 默认的 Rust libp2p 实现。该网络层为上层同步与 gossip 协议提供基础支撑。
网络栈结构
整个栈按四个层次组织:
- 对等节点发现(Peer discovery):Bootstrap 节点、mDNS(局域网)、Kademlia DHT 随机游走。
- 连接(Connection):TCP/IP、WebSockets、DNS 解析。
- 升级(Upgrade):Noise 协议加密、Yamux 多路复用、Multistream-Select 协商。
- 子流协议(Substream protocols):Ping 存活检测、Request-Response 区块/交易查询、Notifications 广播(gossip、最终性、同步)。
数据流为:发现 → 连接 → 安全升级 → 子流协议。
发现机制
节点要加入网络,必须先发现并连接到对等节点:
Bootstrap 节点
- 网络配置中预定义的受信任对等节点(硬编码身份标识与地址)。
- 节点启动时连接 Bootstrap 对等节点以加入网络,并获知更多对等节点。
mDNS(多播 DNS)
- 通过 UDP 广播发现同一局域网内的对等节点。
- 适用于开发、测试网或同地部署场景。
- 可通过网络设置启用或禁用。
Kademlia DHT(随机游走)
- 当节点至少连接到一个对等节点后,会在每个已配置链的 DHT 上执行基于 Kademlia 的随机游走。
- 发送
FIND_NODE查询以发现更多对等节点。 - 随着时间推移,构建出具有韧性且不断扩展的网络视图。
发现流程:节点启动 → 连接 Bootstrap → 获知对等节点地址 → Kademlia 随机游走 → 发现更多对等节点 → 持续游走。局域网 mDNS 可辅助获知地址。
连接建立
发现之后,对等节点会:
- 建立直接连接。
- 协商共享的协议能力(传输、安全、多路复用)。
传输层
当节点 A(Alice)连接节点 B(Bob)时,可用的传输方式:
| 传输 | 说明 |
|---|---|
| TCP/IP | 传统 IPv4/IPv6 套接字 |
| WebSockets | TCP + WebSocket 帧封装(对浏览器/代理友好) |
| DNS | 连接过程中将域名解析为 IP |
加密与多路复用
基础传输连接建立后,对等节点通过协商协议进行升级:
| 协议 | 用途 |
|---|---|
| Noise | 端到端机密性与完整性 |
| Yamux | 在单个物理连接上承载多个逻辑流 |
| Multistream-Select | 选择兼容的加密与多路复用选项 |
连接升级时序:Alice 向 Bob 发起 TCP / WebSocket 连接 → Multistream-Select(Noise)→ 建立加密通道 → Multistream-Select(Yamux)→ 建立多路复用子流 → 打开 Ping / Request-Response / Notifications 子流。
子流协议
每个子流运行一个专用的应用级协议:
| 协议 | 用途 |
|---|---|
| Ping | 存活检查与延迟测量 |
| Request-Response | 结构化交换(区块查询、交易查询) |
| Notifications | 广播:新交易、区块公告、最终性更新、轻客户端状态同步 |
对等节点身份
- 每个节点拥有唯一的 Ed25519 公钥作为 P2P 身份。
- 该密钥对与共识消息签名密钥相互独立。
- 在握手期间交换,用于对会话中的对等节点进行身份认证。
关于 Ed25519 在 libp2p 与 GRANDPA 中的使用差异,另见 midnight-cryptography/ 相关技能。
相关技能
- midnight-consensus/ —— 验证者 gossip 的内容(区块、最终性)
- midnight-cryptography/ —— Noise、Ed25519 对等节点身份
- midnight-rpc/ —— 外部客户端访问(与 P2P 同步互补)
限制
资料未提供具体的配置参数、性能指标、支持平台版本或部署要求等细节。