mirror of https://github.com/poanetwork/hbbft.git
56 lines
1.7 KiB
Rust
56 lines
1.7 KiB
Rust
//! Network simulator for testing without message serialisation. Socket
|
|
//! connections between nodes are simulated using
|
|
//! `crossbeam_channel::unbounded`.
|
|
|
|
extern crate crossbeam_channel;
|
|
extern crate log;
|
|
|
|
use crossbeam_channel::{Sender, Receiver, unbounded};
|
|
|
|
pub struct NetSim<Message: Clone + Send + Sync> {
|
|
/// The number of simulated nodes.
|
|
num_nodes: usize,
|
|
/// All TX handles
|
|
txs: Vec<Sender<Message>>,
|
|
/// All RX handles
|
|
rxs: Vec<Receiver<Message>>,
|
|
}
|
|
|
|
impl<Message: Clone + Send + Sync> NetSim<Message> {
|
|
pub fn new(num_nodes: usize) -> Self {
|
|
assert!(num_nodes > 1);
|
|
// All channels of a totally connected network of size `num_nodes`.
|
|
let channels: Vec<(Sender<Message>, Receiver<Message>)> =
|
|
(0 .. num_nodes * num_nodes)
|
|
.map(|_| unbounded())
|
|
.collect();
|
|
let txs = channels.iter()
|
|
.map(|&(ref tx, _)| tx.to_owned())
|
|
.collect();
|
|
let rxs = channels.iter()
|
|
.map(|&(_, ref rx)| rx.to_owned())
|
|
.collect();
|
|
NetSim {
|
|
num_nodes: num_nodes,
|
|
txs: txs,
|
|
rxs: rxs
|
|
}
|
|
}
|
|
|
|
/// The TX side of a channel from node `src` to node `dst`.
|
|
pub fn tx(&self, src: usize, dst: usize) -> Sender<Message> {
|
|
assert!(src < self.num_nodes);
|
|
assert!(dst < self.num_nodes);
|
|
|
|
self.txs[src * self.num_nodes + dst].clone()
|
|
}
|
|
|
|
/// The RX side of a channel from node `src` to node `dst`.
|
|
pub fn rx(&self, src: usize, dst: usize) -> Receiver<Message> {
|
|
assert!(src < self.num_nodes);
|
|
assert!(dst < self.num_nodes);
|
|
|
|
self.rxs[src * self.num_nodes + dst].clone()
|
|
}
|
|
}
|