项目详情

rust-libp2p

去中心化世界的网络层标准件——libp2p 规范的 Rust 实现

GitHub 地址 docs.rs MIT 5.6k Stars Rust · tokio v0.56

更新于 2026-09-03

← 返回汇总
项目速览

一句话定位

P2P 网络的乐高积木

libp2p 规范的 Rust 实现:把点对点网络拆成可插拔的模块——传输(TCP/QUIC/WebRTC)、加密(Noise/TLS)、流复用、NAT 穿越(relay/打洞)、服务发现(Kademlia DHT/mDNS)、订阅广播(gossipsub),像搭积木一样组装出自己的 P2P 应用。Polkadot、以太坊 Lighthouse、Filecoin 等数十条区块链和网络都用它做网络层。适合做去中心化应用、区块链节点、私有 P2P 通信的开发者。

项目速览

核心数据

5,610
Stars
350+
贡献者
9 年
2017 至今持续演进
40+
Workspace crates
1,250
Forks
15
应用协议实现
v0.56
最新 release(2025-06)
2026-08-31
最近提交

数据来源:GitHub API,采集于 2026-09-03。维护者 Elena Frank、João Oliveira;每周维护者例会 + 双周社区电话;dependabot 持续滚动依赖升级。

背景

libp2p 是什么,Rust 版是什么地位

  • 出身:libp2p 规范源自 IPFS 项目(Protocol Labs),把「让任意节点互相找到并安全通信」抽象成模块化协议族
  • 多语言实现:Go(最早)、Rust、JS、Python、Swift、Zig 等;各实现遵循同一规范,可互操作
  • Rust 版地位:区块链行业的首选网络层——性能敏感的共识节点(以太坊 Lighthouse、Polkadot Substrate)几乎都选它
  • 单仓多 crate:一个 Cargo workspace 装下 40+ 个 crate,按需引入,编译只带你要的模块
与「直接用 TCP/WebSocket」的区别
  • 节点身份(PeerId)与密钥内建,握手即认证
  • 多路复用:一条连接跑多条子流,协议协商自动完成
  • NAT 穿越是协议族一等公民,不是外挂
  • 传输可替换:同一套应用代码,底层 TCP/QUIC/WebRTC 随意换
  • 浏览器也能当完整节点(WebRTC/WebTransport/websys)
架构

自底向上五层积木

应用协议层 protocols/ —— 15 个开箱即用 kad(DHT)· gossipsub(pubsub)· identify · ping · relay(中继)· autonat(NAT 探测)· dcutr(打洞)· rendezvous · request-response · mdns · upnp · floodsub · stream · perf swarm/ —— 中枢调度 两个核心 trait:NetworkBehaviour(全局行为:发现、订阅、路由)× ConnectionHandler(单连接行为:每条连接上的协议逻辑) 连接池管理、事件驱动模型:Behaviour 向 Handler 下发命令,Handler 向 Behaviour 上报事件 muxers/ —— 流复用 一条物理连接上开多条独立子流 yamux · 逐流背压 · 与传输升级绑定 安全升级 —— 加密握手 Noise(默认)· TLS · plaintext(仅测试) 作为 Transport upgrade 挂在传输之上 transports/ —— 传输实现(Transport trait) tcp · quic(QUIC 自带 TLS1.3,无需另挂加密升级)· websocket · webrtc / webrtc-websys(浏览器)· webtransport-websys · dns · uds(Unix 域套接字)· pnet(预共享密钥私有网络) core/ —— libp2p-core Transport 与 StreamMuxer 两大基础 trait + 多路流协商(multistream-select)—— 几乎所有 crate 都建在这层之上
可插拔实现层(transports / protocols) 中枢(swarm 双接口) 基础设施层(core / muxers / 安全)
核心机制

Swarm 双接口:写 P2P 应用只碰两个 trait

NetworkBehaviour(全局视角)
  • 关心「整个网络」:节点发现策略、订阅拓扑、路由表维护
  • 例:Kademlia behaviour 持有 DHT 路由表,gossipsub behaviour 管 mesh 网络
  • 多个 behaviour 可用 tokio::select! 或 SwarmBuilder 组合成一个
ConnectionHandler(单连接视角)
  • 关心「这一条连接」:跑什么子协议、帧编解码、超时重试
  • 由 behaviour 按需为每条连接实例化
  • 库作者实现新协议 = 写一对 Handler + Behaviour
事件流示意
你的应用(main loop) Swarm::poll 事件循环 SwarmEvent 上报 NetworkBehaviour 组合 Kademlia + Gossipsub + Identify … 命令↓ ↑事件 ConnectionHandler(每连接一个) 子流上的协议帧收发

API 全 async(tokio),一个 Swarm 驱动全部连接——没有 per-connection 线程,靠事件驱动。

协议族

15 个应用协议,按功能分组

功能域协议 crate干什么
发现libp2p-kadKademlia DHT:节点与内容路由,去中心化网络的「电话簿」
libp2p-mdns局域网零配置发现(mDNS 广播)
广播libp2p-gossipsub业界标准 pubsub(以太坊信标链 gossip 层用它)
libp2p-floodsub朴素洪泛广播(遗留,教学用)
NAT 穿越libp2p-autonat探测本机是否在 NAT 后(能不能被直连)
libp2p-relay中继跳板:直连不了时借第三方节点转发
libp2p-dcutrRELB 打洞:通过 relay 交换地址后升级为直连
基础服务libp2p-identify握手后互报身份与监听地址
libp2p-ping连通性心跳
libp2p-request-response一问一答的 JSON/CBOR RPC 框架
会合libp2p-rendezvous中心化会合点注册/发现(比 DHT 轻的引导方案)
libp2p-upnp家用路由器端口映射(IGD/NAT-PMP)

另有 perf(吞吐基准)与 stream(通用子流)。每个协议都是独立 crate,不用就不编译。

NAT 穿越

P2P 最难的问题,协议族给了完整答案

① upnp 让家用路由器直接开端口映射 成功→直连 ② autonat 探测 问其他节点:你能直连我吗? 在 NAT 后 ③ relay 中继 借公共中继节点转发流量兜底 ④ dcutr 打洞 经中继交换打洞信息 → 升级直连 为什么这套组合值钱 · 传统 C/S 架构里 NAT 不是问题(服务器有公网);P2P 里 60%+ 家用节点在 NAT 后,没有这套机制网络根本连不起来 · relay 是可用性兜底(永远连得上),dcutr 是成本优化(能直连就不烧中继带宽)——分层降级设计 · 对比:比特币/以太坊早期自研 NAT 穿越各写各的;libp2p 把它标准化成四个可组合协议,任何新网络直接复用 浏览器节点(webrtc-websys / webtransport-websys)同样走这套 relay + 打洞路径,Web 端与桌面端互操作
快速上手

30 行组装一个能跑的 P2P 节点

// Cargo.toml: libp2p = { version = "0.56", features = ["tokio","tcp","noise","yamux","gossipsub","mdns"] }
let mut swarm = SwarmBuilder::with_new_identity()
    .with_tokio()
    .with_tcp(tcp::Config::default(), noise::Config::new, yamux::Config::default)?  // TCP + Noise 加密 + yamux 复用
    .with_behaviour(|key| {
        MyBehaviour {
            gossipsub: gossipsub::Behaviour::new(MessageAuthenticity::Signed(key.clone()), cfg)?,
            mdns: mdns::tokio::Behaviour::new(mdns::Config::default(), key.public().to_peer_id())?,
        }
    })?
    .with_swarm_config(|c| c.with_idle_connection_timeout(Duration::from_secs(60)))
    .build();

swarm.behaviour().gossipsub.subscribe(&topic)?;   // 订阅话题
loop {
    match swarm.select_next_some().await {          // 事件循环
        SwarmEvent::Behaviour(MyBehaviourEvent::Gossipsub(e)) => { /* 收到消息 */ }
        SwarmEvent::NewListenAddr { address, .. } => println!("监听: {address}"),
        _ => {}
    }
}
生产用户

区块链行业的「TCP/IP」

以太坊系

Lighthouse(共识客户端,gossipsub 传播信标区块);OpenMina(浏览器里跑 Mina)。

Polkadot 系

Substrate 框架的网络层整个建在 rust-libp2p 上——Polkadot 生态所有平行链默认继承。

Filecoin / IPFS 系

Forest(Filecoin Rust 实现)、rust-ipfs、beetle(下一代 IPFS,云+移动)。

高性能链

Fuel(fuel-core)、Neptune(zk-STARK 后量子链)、HotShot(Espresso 去中心化排序器)。

非链应用

qaul.net(无网状网通信)、Safe Network、Locutus(去中心化 KV)、COMIT(BTC-XMR 原子交换)。

新势力

Ceylon(多 Agent 系统框架)、Fungi(多设备互联平台)——P2P 正被 AI Agent 协作场景重新捡起。

21 个官方列出项目 + 大量未列的——「网络层不自己写,用 libp2p」在 Rust 去中心化生态里已是默认共识。

工程与治理

九年长跑的工程纪律

  • 规范驱动:跟随 libp2p 规范(spec repo)实现,跨语言互操作有测试套件保障
  • 版本纪律:0.x semver,minor 版本也允许 breaking——升级要读 CHANGELOG,但每个 crate 变更记录极细
  • 依赖卫生:dependabot 全自动 PR(最近 5 个 commit 全是依赖升级),CI 全矩阵跑(platform × protocol 组合)
  • 安全流程:私有漏洞报告通道(GitHub Security Advisories),不开公开 issue
  • 开放治理:每周维护者例会 + 双周社区电话,会议记录公开在 Discussions
版本节奏观察
Release日期间隔
v0.53.22023-12—
v0.54.02024-088 个月
v0.55.02025-015 个月
v0.56.02025-065 个月

release 节奏稳(5-8 月一大版),但 main 分支持续活跃(2026-08 仍有提交)——大版本积攒中。293 个 open issue 是活跃生态的正常水位。

风险与局限

上手前要知道的

潜力评估

打分

维度评分依据
成熟度
9 年、350+ 贡献者、数十条生产链背书
工程质量
多 crate 架构、CI 矩阵、依赖机器人、规范跟随
生态位
Rust 去中心化网络层事实标准,无可替代者
上手体验
概念多、文档散、examples 救场
发展动能
持续维护但大版本节奏放缓;WebRTC/WebTransport 补齐浏览器节点

综合 9/10。P2P 基础设施里的「央行级」资产——不性感、不上新闻,但区块链与去中心化应用的每一层都压在它上面。AI Agent 点对点协作若成气候,它是现成的传输底座。

最终裁决

适合谁,不适合谁

选它
  • 做区块链节点 / 共识网络——行业默认答案
  • 构建去中心化应用(文件共享、消息、联邦系统)
  • 需要 NAT 穿越可靠落地的私有 P2P 通信
  • 想学网络栈工程:分层 trait 设计教科书
别选
  • 普通 C/S 应用(HTTP/gRPC 足够,别硬上 P2P)
  • 想快速出活的小团队 demo(学习成本先付一周)
  • 非 Rust 栈(看 Go 版 go-libp2p 或 JS 版)
  • 需要极简二进制体积(嵌入式考虑 spec 自实现子集)

在线体验

协议栈组装器

像 SwarmBuilder 一样组装你的节点:选传输、加密、发现、广播协议,实时生成 Cargo feature 清单 + builder 代码骨架 + 组合提示(比如选了 QUIC 就不需要 Noise 升级)。

进入 Playground →
1 / 15