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_n | 8 | 8 |
mesh_n_high | 12 | 12 |
mesh_n_low | 4 | 4 |
mesh_outbound_min | 3 | 3 |
connection_handler_queue_len | 50,000 | 50,000 |
max_transmit_size | 256 KB | 256 KB |
flood_publish | false | true(所有订阅者) |
消息压缩
| 格式 | 状态 | 用途 |
|---|---|---|
| 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) 的广播开销。
网络端口
| 端口 | 协议 | 服务 |
|---|---|---|
| 4001 | TCP | P2P(libp2p)默认 |
| 8333 | TCP | P2P(备用) |
| 8545 | HTTP | RPC(JSON-RPC 2.0) |
| 8546 | WS | WebSocket |
| 9090 | HTTP | Prometheus 指标 |
配置
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)。