显示crate…
1 个不稳定版本
0.27.0 | 2021年3月15日 |
---|
#91 in #tetcore
在 tet-libp2p 中使用
1MB
22K SLoC
Gossipsub 是一种 P2P pubsub(发布/订阅)路由层,旨在扩展 floodsub 和 meshsub 路由协议。
概述
注意:gossipsub 协议规范(https://github.com/libp2p/specs/tree/master/pubsub/gossipsub)为路由协议提供了一个概述。应参考这些规范以获取更多详细信息。
Gossipsub 是数据用的 meshsub 和用于 mesh 元数据的 randomsub 的混合体。它通过 meshsub 构造提供有界度和放大因子,并使用 randomsub 技术通过 gossip 传播元数据来增强它。
路由器维护一个覆盖层网络,其中的对等节点可以高效地发送消息和元数据。对等节点使用控制消息在网格网络中广播、请求已知消息以及订阅/取消订阅主题。
重要差异
本节概述了当前实现与其他实现之间可能存在的差异,这是由于当前规范中的未定义元素。
-
主题 - 在 gossipsub 中,主题可以通过
hash_topics
配置参数进行配置。主题类型为TopicHash
。当前的 go 实现使用原始 utf-8 字符串,这是 rust-libp2p 中的默认配置。可以通过将hash_topics
配置参数设置为 true 来对主题进行哈希(SHA256 哈希后进行 base64 编码)。 -
序列号 - gossipsub 网络中的消息通过消息的来源
tet_libp2p_core::PeerId
和消息的 nonce(序列号)来标识。此实现中的序列号以原始字节的形式通过线发送。它们是 64 位大端无符号整数。在此 gossipsub 实现中随机选择,但在当前的 go 实现中是顺序的。
使用 Gossipsub
GossipsubConfig
GossipsubConfig
结构体指定了各种网络性能/调整配置参数。具体来说,它指定了
这个结构体实现了 Default
特性,可以通过 [GossipsubConfig::default()
]. 来初始化。
Gossipsub
Gossipsub
结构体实现了 tet_libp2p_swarm::NetworkBehaviour
特性,允许它在 tet_libp2p_swarm::Swarm
中充当路由行为。这个结构体需要一个 tet_libp2p_core::PeerId
的实例和 GossipsubConfig
。
示例
初始化一个与 gossipsub 兼容的 swarms 的示例
use gossipsub::GossipsubEvent;
use tet_libp2p_core::{identity::Keypair,transport::{Transport, MemoryTransport}, Multiaddr};
use gossipsub::MessageAuthenticity;
let local_key = Keypair::generate_ed25519();
let local_peer_id = tet_libp2p_core::PeerId::from(local_key.public());
// Set up an encrypted TCP Transport over the Mplex
// This is test transport (memory).
let noise_keys = tet_libp2p_noise::Keypair::<tet_libp2p_noise::X25519Spec>::new().into_authentic(&local_key).unwrap();
let transport = MemoryTransport::default()
.upgrade(tet_libp2p_core::upgrade::Version::V1)
.authenticate(tet_libp2p_noise::NoiseConfig::xx(noise_keys).into_authenticated())
.multiplex(tet_libp2p_mplex::MplexConfig::new())
.boxed();
// Create a Gossipsub topic
let topic = gossipsub::IdentTopic::new("example");
// Set the message authenticity - How we expect to publish messages
// Here we expect the publisher to sign the message with their key.
let message_authenticity = MessageAuthenticity::Signed(local_key);
// Create a Swarm to manage peers and events
let mut swarm = {
// set default parameters for gossipsub
let gossipsub_config = gossipsub::GossipsubConfig::default();
// build a gossipsub network behaviour
let mut gossipsub: gossipsub::Gossipsub =
gossipsub::Gossipsub::new(message_authenticity, gossipsub_config).unwrap();
// subscribe to the topic
gossipsub.subscribe(&topic);
// create the swarm
tet_libp2p_swarm::Swarm::new(
transport,
gossipsub,
local_peer_id,
)
};
// Listen on a memory transport.
let memory: Multiaddr = tet_libp2p_core::multiaddr::Protocol::Memory(10).into();
let addr = tet_libp2p_swarm::Swarm::listen_on(&mut swarm, memory).unwrap();
println!("Listening on {:?}", addr);
依赖关系
~12–18MB
~370K SLoC