显示crate…

3个不稳定版本

0.29.0 2021年3月12日
0.27.1 2021年4月3日
0.27.0 2021年4月2日
0.0.0 2021年3月11日

#3 in #tetsy-libp2p

Download history 37/week @ 2024-04-01 15/week @ 2024-04-08 18/week @ 2024-04-15 23/week @ 2024-04-22 18/week @ 2024-04-29 17/week @ 2024-05-06 23/week @ 2024-05-13 13/week @ 2024-05-20 23/week @ 2024-05-27 25/week @ 2024-06-03 18/week @ 2024-06-10 13/week @ 2024-06-17 23/week @ 2024-06-24 4/week @ 2024-07-08 27/week @ 2024-07-15

55 每月下载量
用于 tetsy-libp2p

MIT 许可证

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