显示crate…

1 个不稳定版本

0.27.0 2021年3月15日

#91 in #tetcore


tet-libp2p 中使用

MIT 许可证

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