46个版本 (breaking)
新 0.47.0 | 2024年8月9日 |
---|---|
0.46.1 | 2023年12月9日 |
0.46.0 | 2023年11月5日 |
0.45.0 | 2023年6月20日 |
0.16.0 | 2020年2月14日 |
#1688 in 网络编程
72,997 monthly downloads
用于75个crate(直接使用4个)
1.5MB
27K SLoC
实现了Gossipsub协议。
Gossipsub是一种P2P pubsub(发布/订阅)路由层,旨在扩展floodsub和meshsub路由协议。
概述
注意:Gossipsub协议规范(https://github.com/libp2p/specs/tree/master/pubsub/gossipsub)为路由协议提供了一个概述。对于更详细的信息,应查阅这些规范。
Gossipsub是meshsub(用于数据)和randomsub(用于mesh元数据)的结合。它通过meshsub构建提供有界度数和放大因子,并使用randomsub技术通过gossip传播元数据来增强它。
路由器维护一个覆盖网络,其中包含用于高效发送消息和元数据的对等节点。对等节点使用控制消息在网格网络中广播和请求已知消息,以及订阅/取消订阅主题。
重要差异
本节概述了当前实现与其它实现之间可能存在的差异,这是由于当前规范中未定义的元素。
-
主题 - 在gossipsub中,主题可通过
hash_topics
配置参数配置。主题类型为TopicHash
。当前的Go实现使用原始的utf-8字符串,这是rust-libp2p中的默认配置。可以通过将hash_topics
配置参数设置为true来对主题进行哈希(SHA256哈希后base64编码)。 -
序列号 - 在gossipsub网络上,消息通过源
PeerId
和消息的nonce(序列号)来标识。在此实现中,序列号以原始字节的形式通过网络发送。它们是64位大端无符号整数。当消息被签名时,它们是从随机值开始的单调递增整数,并在u64::MAX处循环。当消息未签名时,它们是随机选择的。注意:在当前的Go实现中,这些数字是连续的。
节点发现
Gossipsub本身不提供节点发现。节点发现是P2P网络中的节点交换彼此信息的过程,其目的之一是提高对网络引导节点故障或更换的抵抗力。
节点发现可以通过结合Kademlia协议和Identify协议来实现。有关更多信息,请参阅Kademlia实现文档。
使用Gossipsub
Gossipsub配置
Config
结构体指定了各种网络性能/调整配置参数。具体来说,它指定了
此结构体实现了 Default
特性,可以通过 [Config::default()
] 进行初始化。
行为
Behaviour
结构体实现了 libp2p_swarm::NetworkBehaviour
特性,允许它作为 libp2p_swarm::Swarm
中的路由行为。此结构体需要一个 PeerId
和 Config
实例。
示例
有关如何使用gossipsub的示例,请参阅聊天示例。
依赖项
~10-20MB
~271K SLoC