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