// 创建传输层(QUIC 和 TCP)
fn create_transport(keypair: &identity::Keypair) -> Result<libp2p::core::transport::Boxed<(PeerId, libp2p::core::muxing::StreamMuxerBox)>, Box<dyn Error>> {
// 配置 QUIC 传输
let quic_transport = quic::async_std::Transport::new(quic::Config::new(keypair))
.map(|(peer_id, conn), _| (peer_id, libp2p::core::muxing::StreamMuxerBox::new(conn)));
// 配置 TCP 传输(带 Noise 加密和 Yamux 多路复用)
let tcp_transport = tcp::async_io::Transport::new(tcp::Config::default().nodelay(true))
.upgrade(libp2p::core::upgrade::Version::V1)
.authenticate(noise::Config::new(keypair)?)
.multiplex(libp2p::yamux::Config::default())
.map(|(peer_id, conn), _| (peer_id, libp2p::core::muxing::StreamMuxerBox::new(conn)));
// 组合两种传输方式(QUIC 优先,TCP 作为备选)
Ok(libp2p::core::transport::OrTransport::new(quic_transport, tcp_transport)
.map(|either, _| match either {
libp2p::futures::future::Either::Left((peer_id, conn)) => (peer_id, conn),
libp2p::futures::future::Either::Right((peer_id, conn)) => (peer_id, conn),
})
.boxed())
}
1
tarscoding545 OP QUIC 和 TCP 的俩 map 是真难看啊
|
![]() |
2
InkStone 23 天前 ![]() 没必要每个变量都用全称吧……import+alias 一下可以整洁很多。而且都 Box<dyn Error>了,不如直接 anyhow 得了。
另外你这俩 map 是一样的吧,完全可以封个函数。 |
![]() |
3
ns09005264 23 天前
你为什么用这么长的包名,看花眼了。
|
![]() |
4
sunnysab 23 天前
终于有人说了!整半天没整明白这个库,而且 Rust 版的更新慢一点
|
5
tarscoding545 OP 老哥们,改了:
pub fn create_swarm( peer_id: PeerId, transport: Boxed<(PeerId, StreamMuxerBox)> ) -> Result<Swarm<SwarmBehaviour>> { let behavior = Behaviour::new(&peer_id)?; let config = Config::with_tokio_executor(); let swarm = Swarm::new(transport, behavior, peer_id, config); Ok(swarm) } |
6
tarscoding545 OP 全局使用的 tokio 运行时,但是框架很多库对 tokio 的支持层级不太统一,主要是 quic 协议这块,不过其他协议也有类似的问题给老哥们看下目前几个协议 tokio 特性的配置:
libp2p = { version = "0.55.0", features = [ "quic", "gossipsub", "tls", "kad", "ping", "tcp", "yamux", "noise", "macros", "mdns", ], default-features = false } libp2p-mdns = { version = "0.47.0", features = ["tokio"] } libp2p-tcp = { version = "0.43.0", features = ["tokio"] } libp2p-quic = { version = "0.12.0", features = ["tokio"]} libp2p-swarm = { version = "0.46.0", features = ["tokio"] } tokio = { version = "1.44.2", features = ["full"] },有不合理的地方老哥们指摘. |