本文档涵盖了 fuel-core 用于发现、连接和管理 P2P 网络连接的机制。它侧重于对等发现协议、连接管理策略和维护网络健康的声誉系统。
有关消息协议和 gossip 通信的信息,请参阅 Message Protocols。有关更广泛的 P2P 网络架构,请参阅 Networking。
fuel-core 中的对等发现和管理系统通过几个相互关联的组件运行,这些组件处理对等生命周期管理的各个方面。
来源: crates/services/p2p/src/behavior.rs47-75 crates/services/p2p/src/peer_manager.rs61-86 crates/services/p2p/src/p2p_service.rs104-145
主要的对等发现机制使用 Kademlia 分布式哈希表来查找网络中的对等节点。
发现行为会定期执行随机游走,在有连接槽可用时查找新的对等节点。
| 组件 | 目的 | 配置 |
|---|---|---|
kad::Behaviour<MemoryStore> | 核心 Kademlia 实现 | 协议:/fuel/kad/{network_name}/kad/1.0.0 |
| 随机游走定时器 | 触发对等发现 | 指数退避,最多 60 秒 |
| 引导节点 | 初始 DHT 播种 | 可通过 bootstrap_nodes 配置 |
来源: crates/services/p2p/src/discovery.rs52-72 crates/services/p2p/src/discovery/discovery_config.rs103-180
对于本地网络发现,fuel-core 可选使用 mDNS(多播 DNS)。
mDNS 会自动发现同一本地网络中的对等节点,并将它们添加到 Kademlia 路由表中以便进行连接尝试。
来源: crates/services/p2p/src/discovery.rs210-229 crates/services/p2p/src/discovery/mdns_wrapper.rs
保留节点将获得特殊对待,并绕过正常的连接限制。
保留节点在断开连接时会自动重新连接,并且免于受对等评分处罚。
来源: crates/services/p2p/src/peer_report.rs70-78 crates/services/p2p/src/peer_manager.rs93-95
PeerManager 会分别跟踪保留和非保留的对等节点。
来源: crates/services/p2p/src/peer_manager.rs60-86 crates/services/p2p/src/peer_manager.rs40-57
对等连接遵循由 PeerManager 管理的结构化生命周期。
来源: crates/services/p2p/src/peer_manager.rs127-129 crates/services/p2p/src/peer_manager.rs199-226
系统使用 ConnectionState 和 SeqLock 来进行线程安全的插槽管理。
| 状态管理 | 描述 | 触发器 |
|---|---|---|
peers_allowed: true | 正在接受新的非保留连接 | 对等节点断开连接,可用插槽 |
peers_allowed: false | 已达到非保留对等节点的最大数量 | 最后一个插槽已满 |
来源: crates/services/p2p/src/peer_manager.rs312-340
对等节点会获得特定于应用程序的评分,这些评分会影响连接决策。
来源: crates/services/p2p/src/peer_manager.rs142-171 fuel-core-types/src/services/p2p/peer_reputation.rs
声誉系统与 libp2p 的 gossipsub 评分集成。
Gossipsub 评分低于 GRAYLIST_THRESHOLD (-16000.0) 时会触发对等节点封禁,保留节点除外,它们会受到保护。
来源: crates/services/p2p/src/peer_manager.rs97-108 crates/services/p2p/src/gossipsub/config.rs61
对等节点的健康状况通过心跳数据持续监控。
系统会因心跳过时或不频繁的对等节点而施加声誉处罚。
| 处罚类型 | 阈值 | 评分影响 |
|---|---|---|
| 旧心跳 | heartbeat_max_time_since_last | -5.0 |
| 低频率 | heartbeat_max_avg_interval | -5.0 |
来源: crates/services/p2p/src/service.rs537-576 crates/services/p2p/src/peer_manager/heartbeat_data.rs
对等管理系统支持可配置的连接限制。
来源: crates/services/p2p/src/config.rs98-107 bin/fuel-core/src/cli/run/p2p.rs91-103
可以根据不同的网络条件调整关键的发现参数。
| 参数 | 默认 | 目的 |
|---|---|---|
random_walk | 500毫秒 | Kademlia 发现频率 |
enable_mdns | false | 本地网络发现 |
bootstrap_nodes | [] | 初始 DHT 种子 |
reserved_nodes_only_mode | false | 仅白名单连接 |
来源: crates/services/p2p/src/config.rs217-258 bin/fuel-core/src/cli/run/p2p.rs73-89