Module simulated

Source
Expand description

Simulate networking between peers with configurable link behavior (i.e. drops, latency, corruption, etc.).

Both peer and link modification can be performed dynamically over the lifetime of the simulated network. This can be used to mimic transient network partitions, offline nodes (that later connect), and/or degrading link quality.

§Determinism

commonware-p2p::simulated can be run deterministically when paired with commonware-runtime::deterministic. This makes it possible to reproduce an arbitrary order of delivered/dropped messages with a given seed.

§Example

use commonware_p2p::simulated::{Config, Link, Network};
use commonware_cryptography::{Ed25519, Signer, Verifier};
use commonware_runtime::{deterministic, Spawner, Runner, Metrics};

// Generate peers
let peers = vec![
    Ed25519::from_seed(0).public_key(),
    Ed25519::from_seed(1).public_key(),
    Ed25519::from_seed(2).public_key(),
    Ed25519::from_seed(3).public_key(),
];

// Configure network
let p2p_cfg = Config {
    max_size: 1024 * 1024, // 1MB
};

// Start context
let executor = deterministic::Runner::seeded(0);
executor.start(|context| async move {
    // Initialize network
    let (network, mut oracle) = Network::new(context.with_label("network"), p2p_cfg);

    // Start network
    let network_handler = network.start();

    // Register some peers
    let (sender, receiver) = oracle.register(peers[0].clone(), 0).await.unwrap();
    let (sender, receiver) = oracle.register(peers[1].clone(), 0).await.unwrap();

    // Link 2 peers
    oracle.add_link(
        peers[0].clone(),
        peers[1].clone(),
        Link {
            latency: 5.0,
            jitter: 2.5,
            success_rate: 0.75,
        },
    ).await.unwrap();

    // ... Use sender and receiver ...

    // Update link
    oracle.remove_link(
        peers[0].clone(),
        peers[1].clone(),
    ).await.unwrap();
    oracle.add_link(
        peers[0].clone(),
        peers[1].clone(),
        Link {
            latency: 100.0,
            jitter: 25.0,
            success_rate: 0.8,
        },
    ).await.unwrap();

    // ... Use sender and receiver ...

    // Shutdown network
    network_handler.abort();
});

Structs§

Config
Configuration for the simulated network.
Link
Describes a connection between two peers.
Network
Implementation of a simulated network.
Oracle
Interface for modifying the simulated network.
Receiver
Implementation of a crate::Receiver for the simulated network.
Sender
Implementation of a crate::Sender for the simulated network.

Enums§

Error
Errors that can occur when interacting with the network.