Switch、Peer、PeerSet、Reactor、Envelope 等)。
这些抽象之下的传输实现从 comet-p2p 切换为 lib-p2p。
lib-p2p 是一个被广泛使用的网络栈,提供可用于生产环境的点对点能力,
并且支持多种语言实现和多种传输协议(TCP、QUIC、WebSockets 等)。
你可以在 CometBFT 代码库中参考以下实现:
性能与活性
在高负载条件下,传统的comet-p2p 可能会成为现代区块链工作负载的网络瓶颈:
- 在并发消息压力下更容易发生拥塞。
- 流和消息处理在面对流量突增时扩展性较弱。
- 当其余栈已经完成优化时,这会限制端到端吞吐量。
lib-p2p 集成通过原生的面向流传输、并发接收流水线以及按 reactor 自动伸缩的工作池来解决这些问题,
有助于降低队列压力并改善高负载下的消息流动。
除了原始吞吐量提升之外,这还通过让对等节点通信和区块传播在持续拥塞与突发负载下更具韧性,
进一步改善网络活性。
在我们的基准测试中,结合栈内其他性能改进,TPS 已超过 2000,
而 lib-p2p 是促成这一结果的关键解锁项之一。
传输与对等节点 ID 的差异
lib-p2p 使用自己的 peer ID 格式,
这与 comet-p2p 不同,二者格式不兼容。
配置
在config.toml 的 p2p.libp2p 部分配置 lib-p2p。
除 external_address 和 laddr 之外,其他所有 p2p 设置都会被忽略。
默认情况下,节点监听 UDP 端口 26656。
要验证配置是否成功,请检查日志中是否出现:
“EXPERIMENTAL: go-libp2p transport is enabled.”
“EXPERIMENTAL: go-libp2p transport is enabled.”
persistent:确保始终与该对等节点保持(重新)连接。unconditional:不受最大对等节点数量限制影响。private:不会将该对等节点传播给其他对等节点。
队列伸缩器
队列伸缩器通过吞吐量/延迟反馈回路控制 reactor 的接收并发度。min_workers、max_workers:每个 reactor 的工作线程下限/上限。threshold_latency:目标处理延迟阈值。overrides:针对每个 reactor 的配置值(reactor 名称不区分大小写)。
资源管理器
资源管理器模式决定连接和流的限制方式:default:使用 libp2p 自动伸缩的限制以及内置协议的合理上限。custom:禁用大多数 cometbft p2p 限制,但强制执行显式的max_peers和max_peer_streams上限。disabled:不做任何限制,适合受控基准测试和本地测试。
- 从
mode = "default"开始,在具有代表性的负载下观察指标。 - 如果限制边界仍不清晰,可短时间使用
mode = "disabled"进行受控测试,以找出所需余量。 - 切换到
mode = "custom",并基于测量结果设置保守的max_peers/max_peer_streams上限。 - 重新测试并保留安全余量;避免在公共网络中长期使用
disabled模式。
- libp2p/go-libp2p: p2p/host/resource-manager/README.md
- libp2p/go-libp2p: p2p/host/resource-manager/limit_defaults.go
实现细节
从 CometBFT actor 模型的视角看,API 保持不变:Reactor、Peer、PeerSet、Switch 以及 envelope 流程仍然兼容,
因此现有 reactor 无需在协议层面重写即可运行。
在连接层,lib-p2p 用其原生的身份机制和安全握手机制
取代了 CometBFT 的 secret connection。
这意味着,对等会话建立、加密协商和远端身份识别都由 lib-p2p 传输栈处理。
CometBFT 的通道流量会映射到 lib-p2p 协议处理器:
- 每个 CometBFT 通道都会暴露在一个 lib-p2p
protocol.ID命名空间下(例如/p2p/cometbft/1.0.0/...)。 - 消息通过绑定到这些协议处理器的 lib-p2p 流进行交换。
- 入站处理支持并发,结合优先级 FIFO 队列和工作池,在负载下并行处理 reactor 流量。
autopool 自动伸缩:
- 它会跟踪逐消息处理时长,并基于吞吐量 EWMA、队列压力和延迟分位数(P90)做出决策。
- 吞吐量快速增长或队列压力升高时会增加工作线程;当 P90 延迟高于配置阈值时会缩减规模,以避免过载。
- 默认限制是每个 reactor 4 到 32 个工作线程;mempool 使用更大的范围(8 到 512)以吸收突发交易流量。
- 在分发前会保持优先级顺序(
Receive()按优先级推入,然后由工作线程并行消费)。
对比与限制
| 区域 | comet-p2p | lib-p2p |
|---|---|---|
| 传输 | TCP | QUIC |
| 对等身份 | Comet peer IDs(<hex>@host:port) | lib-p2p peer IDs(12D3Koo...) |
| 连接握手 | Comet secret connection | lib-p2p identity and secure handshake |
| 对等交换 | PEX + address book flow | 此版本无 PEX |
comet-p2p / lib-p2p 的网络。
指标
用于lib-p2p 队列伸缩器和资源调优的关键指标:
This is an experimental networking layer based on go-libp2p. It adds a new transport and connection-management layer for peer-to-peer communication, while keeping the reactor-facing CometBFT API unchanged. Actors still use the same core p2p concepts (
Switch, Peer, PeerSet, Reactor, Envelope, …).
The transport implementation under those abstractions is lib-p2p instead of comet-p2p.
lib-p2p is a widely used networking stack with production-ready peer-to-peer features,
and implementations across many languages and transport protocols (TCP, QUIC, WebSockets, and more).
You can refer to the implementation in the CometBFT codebase here:
Performance and Liveness
In high-load conditions, legacycomet-p2p can become a networking bottleneck for modern blockchain workloads:
- It is more prone to congestion under concurrent message pressure.
- Stream/message handling is less effective at scaling with traffic spikes.
- This limits end-to-end throughput when the rest of the stack is optimized.
lib-p2p integration addresses this with native stream-oriented transport, concurrent receive pipelines,
and autoscaled worker pools per reactor, which helps reduce queue pressure and improve message flow under load.
Beyond raw throughput, this also improves network liveness by making peer communication and block propagation
more resilient under sustained congestion and sudden load spikes.
In our benchmarks, together with additional performance improvements across the stack, we reached over 2000 TPS,
and lib-p2p has been one of the key unblockers enabling that result.
Differences in Transport and Peer IDs
lib-p2p uses its own peer ID format,
which is different from comet-p2p. The two formats are not compatible.
Configuration
Configurelib-p2p in the p2p.libp2p section of config.toml.
All other p2p settings are ignored except external_address and laddr.
By default, the node listens on UDP port 26656.
To validate successful configuration, check logs for:
“EXPERIMENTAL: go-libp2p transport is enabled.”
“EXPERIMENTAL: go-libp2p transport is enabled.”
persistent: ensures the peer is always (re)connected.unconditional: not affected by the max number of peers limit.private: peer is not gossiped to other peers.
Queue Scaler
The queue scaler controls reactor receive concurrency using a throughput/latency feedback loop.min_workers,max_workers: lower/upper worker bounds per reactor.threshold_latency: target processing-latency threshold.overrides: per-reactor values (case-insensitive reactor name).
Resource Manager
Resource manager mode determines connection and stream limits:default: uses libp2p autoscaled limits and sane built-in protocol caps.custom: disables most cometbft p2p limits but enforces explicitmax_peersandmax_peer_streamscaps.disabled: no limits, useful for controlled benchmarking and local testing.
- Start with
mode = "default"and observe metrics under representative load. - If limits are still unclear, run short, controlled tests with
mode = "disabled"to discover required headroom. - Move to
mode = "custom"and set conservativemax_peers/max_peer_streamscaps based on measurements. - Re-test and keep safety margin; avoid running public networks long-term in
disabledmode.
- libp2p/go-libp2p: p2p/host/resource-manager/README.md
- libp2p/go-libp2p: p2p/host/resource-manager/limit_defaults.go
Implementation Details
From the CometBFT actor-model perspective, the API stays the same:Reactor, Peer, PeerSet, Switch, and envelope flow remain compatible,
so existing reactors can run without protocol-level rewrites.
At the connection layer, lib-p2p replaces CometBFT secret connection with lib-p2p native
identity and secure handshake mechanisms.
This means peer session establishment, encryption negotiation, and remote identification are handled
by the lib-p2p transport stack.
CometBFT channel traffic is mapped to lib-p2p protocol handlers:
- Each CometBFT channel is exposed under a lib-p2p
protocol.IDnamespace (for example/p2p/cometbft/1.0.0/...). - Messages are exchanged over lib-p2p streams bound to those protocol handlers.
- Inbound handling is concurrent, with a priority FIFO queue and worker pool to process reactor traffic in parallel under load.
autopool:
- It tracks per-message processing durations and computes decisions from throughput EWMA, queue pressure, and latency percentile (P90).
- High throughput growth or queue pressure scales workers up; high P90 latency above the configured threshold triggers shrink to avoid overload.
- Default limits are 4-32 workers per reactor; mempool uses a wider range (8-512) to absorb bursty transaction traffic.
- Priority ordering is preserved before dispatch (
Receive()pushes by priority, then workers consume in parallel).
Comparison and Limitations
| Area | comet-p2p | lib-p2p |
|---|---|---|
| Transport | TCP | QUIC |
| Peer identity | Comet peer IDs (<hex>@host:port) | lib-p2p peer IDs (12D3Koo...) |
| Connection handshake | Comet secret connection | lib-p2p identity and secure handshake |
| Peer exchange | PEX + address book flow | No PEX in this release |
comet-p2p / lib-p2p network.
Metrics
Key metrics forlib-p2p queue-scaler and resource tuning: