跳到主要内容

P2P 网络

Savitri Network 使用 libp2p 0.55 进行所有点对点通信。

传输层栈

层级技术
传输层TCP
加密Noise 协议
多路复用Yamux
节点发现Kademlia DHT
发布/订阅Gossipsub
身份Ed25519 节点密钥

Gossipsub 主题

主题发布者订阅者用途
/savitri/tx/1轻节点轻节点、主节点交易广播
/savitri/block/1轻节点所有节点区块广播
/savitri/consensus/cert/1轻节点主节点、观察节点区块接受证书
/savitri/peer_registry/1所有节点主节点节点保活/注册
/savitri/lightnode/group/announce/1主节点轻节点群组分配
/savitri/group/{id}/election群组成员群组成员群内选举

Gossipsub 配置

参数轻节点主节点
mesh_n88
mesh_n_high1212
mesh_n_low44
mesh_outbound_min33
connection_handler_queue_len50,00050,000
max_transmit_size256 KB256 KB
flood_publishfalsetrue(所有订阅者)

消息压缩

格式状态用途
snap已启用通用 P2P 消息
lz4已启用高吞吐量路径
zstd在 MSVC 上禁用Windows 下不使用

节点存活检测

轻节点

  • PoU 分数共享:每 60 秒通过 gossipsub 发布
  • 延迟探测:每 30 秒通过直接 P2P 探测
  • 心跳:在 /savitri/peer_registry/1 上发布 gossipsub

主节点

  • last_seen 刷新:收到任意节点的 gossipsub 消息时更新
  • 非活跃超时:600 秒(可通过主节点配置自定义)
  • cleanup_inactive():移除超过超时时间的节点
  • SlowPeer 处理器:断开发送队列已满的节点

观察节点

  • 30 秒心跳:在 /savitri/peer_registry/1 上发布
  • 订阅/savitri/consensus/cert/1/savitri/block/1

引导节点

引导节点在 config/bootstrap_nodes.json 中配置:

[
{
"peer_id": "12D3KooW...",
"address": "/ip4/3.120.x.x/tcp/4001"
}
]

节点在启动时连接引导节点,并通过 Kademlia DHT 发现更多节点。

直接 P2P(请求-响应)

某些操作使用直接点对点通信,而非 gossipsub:

操作协议
延迟探测直接请求-响应
PoU ACK点对点响应
选举候选人直接 P2P

对于只需到达特定节点的操作,此方式可避免 O(N^2) 的广播开销。

网络端口

端口协议服务
4001TCPP2P(libp2p)默认
8333TCPP2P(备用)
8545HTTPRPC(JSON-RPC 2.0)
8546WSWebSocket
9090HTTPPrometheus 指标

配置

config/development.toml

[network]
max_peers = 10
block_time_secs = 2
max_tps = 100
group_size = 3

config/production.toml

[network]
max_peers = 50
block_time_secs = 5
max_tps = 1000
group_size = 7
slashing_enabled = true

日志过滤

减少冗余 gossipsub 日志:

RUST_LOG=info,libp2p_gossipsub::behaviour=error

此设置可抑制包含完整消息载荷的发送队列警告(每条 1-2KB,可导致日志超过 120MB)。