Expand description

Episub: Proximity Aware Epidemic PubSub for libp2p

This behaviour implements a large-scale gossiping protocol that is based on three main ideas introduced by the following papers:

  1. Epidemic Broadcast Trees, 2007 (DOI: 10.1109/SRDS.2007.27)
  2. HyParView: a membership protocol for reliable gossip-based broadcast, 2007 (DOI: 10.1109/DSN.2007.56)
  3. GoCast: Gossip-enhanced Overlay Multicast for Fast and Dependable Group Communication, 2005

Those ideas were first compiled into one protocol originally by @vyzo in https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/episub.md

This implementation introduces a number of small changes to the original proposal that surfaced during implementation and testing of this code.

Usage Examples

let local_key = identity::Keypair::generate_ed25519();
let local_peer_id = PeerId::from(local_key.public());
let transport = libp2p::development_transport(local_key.clone()).await?;

// Create a Swarm to manage peers and events
let mut swarm = libp2p::Swarm::new(transport, Episub::new(), local_peer_id);

// Listen on all interfaces and whatever port the OS assigns
swarm
  .listen_on("/ip4/0.0.0.0/tcp/4001".parse().unwrap())
  .unwrap();

// subscribe to the topic specified on the command line
swarm.behaviour_mut().subscribe(opts.topic);
swarm.dial(bootstrap).unwrap()

while let Some(event) = swarm.next().await {
  match event {
     SwarmEvent::Behaviour(EpisubEvent::Message(m, t)) => {
        println!("got a message: {:?} on topic {}", m, t);
     }
     SwarmEvent::Behaviour(EpisubEvent::Subscribed(t)) => {}
     SwarmEvent::Behaviour(EpisubEvent::Unsubscribed(t)) => {}
     SwarmEvent::Behaviour(EpisubEvent::ActivePeerAdded(p)) => {}
     SwarmEvent::Behaviour(EpisubEvent::ActivePeerRemoved(p)) => {}
  }
}

Structs

Configuration paramaters for Episub

Network behaviour that handles the Episub protocol.

Enums

Event that can be emitted by the episub behaviour.

Errors associated with converting values from wire format to internal represenation

Error associated with publishing a gossipsub message.

Errors associated with RPC calls between active nodes