菜单

消息协议

相关源文件

此页面详细介绍了 Fuel Core 节点用于在 P2P 网络中交换信息的通信协议。消息协议定义了节点如何通信、它们交换的消息类型以及这些消息的编码和处理方式。有关节点发现和网络拓扑管理的信息,请参阅节点发现和管理

协议概述

Fuel Core 使用基于 libp2p 的 P2P 网络来实现节点之间的有效通信。该网络实现了三种核心协议类型:

  1. Gossipsub 协议 - 用于高效广播交易和预确认。
  2. 请求-响应协议 - 用于直接的点对点查询和响应。
  3. 心跳协议 - 用于维护连接和共享节点状态。

这些协议协同工作,以确保区块链同步、交易传播和网络健康监控。

来源:crates/services/p2p/src/lib.rs1-63 crates/services/p2p/src/service.rs1-111

消息类型

Gossipsub 消息

Gossipsub 用于将信息高效地传播给网络中的许多节点。主要有两种 Gossipsub 消息类型:

  • NewTx - 用于将新交易广播到网络。
  • TxPreConfirmations - 用于广播交易预确认。

当节点提交交易时,该交易会被封装在 GossipsubBroadcastRequest 中,并通过 gossip mesh 发布。

来源:crates/services/p2p/src/service.rs11-15 crates/services/p2p/src/p2p_service.rs166-172

请求-响应 消息

请求-响应消息允许节点之间直接通信以获取特定信息。

主要请求类型:

  1. SealedHeaders - 请求指定范围的区块头。
  2. Transactions - 请求特定区块范围的交易数据。
  3. TxPoolAllTransactionsIds - 请求对端交易池中的所有交易 ID。
  4. TxPoolFullTransactions - 请求特定交易 ID 的完整交易数据。

每种请求类型都有相应的响应格式,可以包含请求的数据或错误代码。

来源:crates/services/p2p/src/request_response/messages.rs22-28 crates/services/p2p/src/request_response/messages.rs54-62

心跳 消息

心跳消息用于维护节点连接和共享区块链状态。

心跳有几个作用:

  • 验证节点连接性。
  • 共享当前区块高度以进行同步。
  • 提供节点声誉评估的数据。

来源:crates/services/p2p/src/heartbeat/handler.rs38-46

协议实现

服务架构

P2P 消息系统通过几个相互连接的组件实现:

关键组件

  • FuelP2PService - 协调所有网络通信的主要 P2P 服务。
  • FuelBehaviour - 结合多个 libp2p 行为来处理不同的协议。
  • 消息处理器 - 处理特定类型的传入和传出消息。
  • PostcardCodec - 处理消息的序列化和反序列化。

来源:crates/services/p2p/src/p2p_service.rs104-145 crates/services/p2p/src/behavior.rs47-75

基于任务的请求系统

Fuel Core 使用基于任务的系统在内部处理 P2P 请求。

TaskRequest 枚举定义了可以从 P2P 服务请求的各种操作,例如:

  • 广播交易。
  • 检索区块头。
  • 获取交易数据。
  • 报告节点行为。

任务系统使用实现 Broadcast trait 的 SharedState 来处理广播操作,例如 tx_broadcast()block_height_broadcast()pre_confirmation_broadcast()

来源:crates/services/p2p/src/service.rs128-189 crates/services/p2p/src/service.rs936-1037 crates/services/p2p/src/service.rs372-430

消息编码

消息使用 PostcardCodec 进行编码和解码,该编解码器通过 Postcard 二进制格式实现序列化。

编码过程:

  1. 将消息对象(如 RequestMessage)传递给编解码器的 encode 方法。
  2. 编解码器使用 Postcard 将对象序列化为二进制。
  3. 生成的字节通过网络发送。
  4. 在接收端,字节会被反序列化回原始消息类型。

来源:crates/services/p2p/src/codecs/postcard.rs34-60 crates/services/p2p/src/codecs.rs1-68

协议版本控制

系统支持多种协议版本,以实现向后兼容。

协议版本:

  • V1 - 原始协议,错误处理有限(响应使用 Option)。
  • V2 - 增强协议,具有显式错误处理(响应使用 Result)。

系统包含 V1 和 V2 响应之间的双向转换功能,允许较新节点与网络中的旧节点进行通信。

来源:crates/services/p2p/src/request_response/messages.rs47-53 crates/services/p2p/src/request_response/messages.rs64-107

协议行为

Gossipsub 协议行为

Gossipsub 协议通过网状网络高效地广播消息。

主要功能

  • 基于主题 - 消息发布到特定主题(NewTx、PreConfirmations)。
  • 网状网络 - 每个节点为每个主题维护与一部分节点的连接。
  • 消息验证 - 节点在传播消息之前会验证收到的消息。
  • 声誉评分 - 节点根据其在 gossip 协议中的行为进行评分。

来源:crates/services/p2p/src/gossipsub/config.rs94-250 crates/services/p2p/src/p2p_service.rs597-630

请求-响应 协议行为

请求-响应协议处理直接的点对点信息交换。

主要功能

  • 直接通信 - 消息被发送到特定节点,而不是广播。
  • 请求超时 - 请求具有可配置的超时时间,以防止挂起。
  • 响应通道 - 响应通过单次通道交付。
  • 数据库处理 - 重的数据库操作会被卸载到专用线程。

来源:crates/services/p2p/src/service.rs594-813 crates/services/p2p/src/p2p_service.rs656-798

心跳 协议行为

心跳协议维护节点连接并监控网络健康。

主要功能

  • 定期更新 - 节点会定期交换区块高度信息。
  • 连接监控 - 该协议有助于检测和处理失败的连接。
  • 节点声誉 - 心跳行为有助于节点声誉评分。
  • 同步支持 - 区块高度信息有助于识别同步源。

来源:crates/services/p2p/src/heartbeat/handler.rs106-285 crates/services/p2p/src/service.rs537-576

节点声誉系统

P2P 协议包含一个节点声誉系统,以确保网络健康。

关键组件

  • Gossipsub 评分 - 基于协议合规性(消息验证、传播)。
  • 应用评分 - 基于更高级别的行为(有效交易、响应)。
  • 心跳声誉 - 基于连接可靠性和区块高度报告。
  • 分数衰减 - 分数会随时间衰减,允许节点从问题中恢复。
  • 执行 - 得分非常低的节点可以被禁止或列入灰名单

来源: crates/services/p2p/src/peer_manager.rs97-108 crates/services/p2p/src/peer_manager.rs148-164 crates/services/p2p/src/service.rs558-576

配置选项

P2P 消息协议可以进行广泛的配置

参数描述默认
max_block_size区块的最大大小(以字节为单位)50 MiB
max_headers_per_request每次请求的最大区块头数100
max_txs_per_request每次请求的最大交易数10000
request_timeout请求-响应操作的超时时间20s
max_concurrent_streams最大并发请求流数256
heartbeat_check_interval节点心跳检查之间的间隔5秒
heartbeat_max_avg_interval心跳之间的最大平均时间20s
heartbeat_max_time_since_last距离上次心跳的最大时间40s
subscribe_to_pre_confirmations是否订阅预确认true

这些参数可以通过命令行标志或配置文件进行调整。

来源: bin/fuel-core/src/cli/run/p2p.rs38-212 crates/services/p2p/src/config.rs45-53

常见消息流

交易广播

来源: crates/services/p2p/src/service.rs952-967 crates/services/p2p/src/p2p_service.rs385-403

区块头同步

来源: crates/services/p2p/src/service.rs968-979 crates/services/p2p/src/service.rs684-727

交易池同步

来源: crates/services/p2p/src/service.rs999-1004 crates/services/p2p/src/service.rs773-814

总结

Fuel Core 中的消息协议通过结合基于 Gossip 的广播和直接请求-响应交互,实现了高效的网络通信。这些协议基于 libp2p 构建,并具有以下特点:

  1. 高效的消息传播 - 使用 Gossipsub 协议进行广播
  2. 可靠的数据检索 - 使用请求-响应协议进行直接查询
  3. 网络健康监控 - 使用心跳协议进行连接维护
  4. 节点声誉管理 - 维护网络质量和安全
  5. 协议版本控制 - 确保在网络发展过程中的向后兼容性

这些协议共同构成了一个强大的通信层,支持 Fuel Core 的高吞吐量区块链架构。

来源: crates/services/p2p/src/lib.rs1-63 crates/services/p2p/Cargo.toml1-73