此页面详细介绍了 Fuel Core 节点用于在 P2P 网络中交换信息的通信协议。消息协议定义了节点如何通信、它们交换的消息类型以及这些消息的编码和处理方式。有关节点发现和网络拓扑管理的信息,请参阅节点发现和管理。
Fuel Core 使用基于 libp2p 的 P2P 网络来实现节点之间的有效通信。该网络实现了三种核心协议类型:
这些协议协同工作,以确保区块链同步、交易传播和网络健康监控。
来源:crates/services/p2p/src/lib.rs1-63 crates/services/p2p/src/service.rs1-111
Gossipsub 用于将信息高效地传播给网络中的许多节点。主要有两种 Gossipsub 消息类型:
当节点提交交易时,该交易会被封装在 GossipsubBroadcastRequest 中,并通过 gossip mesh 发布。
来源:crates/services/p2p/src/service.rs11-15 crates/services/p2p/src/p2p_service.rs166-172
请求-响应消息允许节点之间直接通信以获取特定信息。
主要请求类型:
每种请求类型都有相应的响应格式,可以包含请求的数据或错误代码。
来源: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 消息系统通过几个相互连接的组件实现:
关键组件
来源: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 二进制格式实现序列化。
编码过程:
RequestMessage)传递给编解码器的 encode 方法。来源:crates/services/p2p/src/codecs/postcard.rs34-60 crates/services/p2p/src/codecs.rs1-68
系统支持多种协议版本,以实现向后兼容。
协议版本:
Option)。Result)。系统包含 V1 和 V2 响应之间的双向转换功能,允许较新节点与网络中的旧节点进行通信。
来源:crates/services/p2p/src/request_response/messages.rs47-53 crates/services/p2p/src/request_response/messages.rs64-107
Gossipsub 协议通过网状网络高效地广播消息。
主要功能
来源: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 协议包含一个节点声誉系统,以确保网络健康。
关键组件
来源: 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 构建,并具有以下特点:
这些协议共同构成了一个强大的通信层,支持 Fuel Core 的高吞吐量区块链架构。
来源: crates/services/p2p/src/lib.rs1-63 crates/services/p2p/Cargo.toml1-73