in node/src/main.rs [94:153]
fn deploy_testbed(nodes: usize) -> Result<Vec<JoinHandle<()>>, Box<dyn std::error::Error>> {
let keys: Vec<_> = (0..nodes).map(|_| Secret::new()).collect();
// Print the committee file.
let epoch = 1;
let mempool_committee = MempoolCommittee::new(
keys.iter()
.enumerate()
.map(|(i, key)| {
let name = key.name;
let front = format!("127.0.0.1:{}", 7000 + i).parse().unwrap();
let mempool = format!("127.0.0.1:{}", 7100 + i).parse().unwrap();
(name, front, mempool)
})
.collect(),
epoch,
);
let consensus_committee = ConsensusCommittee::new(
keys.iter()
.enumerate()
.map(|(i, key)| {
let name = key.name;
let stake = 1;
let addresses = format!("127.0.0.1:{}", 7200 + i).parse().unwrap();
(name, stake, addresses)
})
.collect(),
epoch,
);
let committee_file = "committee.json";
let _ = fs::remove_file(committee_file);
Committee {
mempool: mempool_committee,
consensus: consensus_committee,
}
.write(committee_file)?;
// Write the key files and spawn all nodes.
keys.iter()
.enumerate()
.map(|(i, keypair)| {
let key_file = format!("node_{}.json", i);
let _ = fs::remove_file(&key_file);
keypair.write(&key_file)?;
let store_path = format!("db_{}", i);
let _ = fs::remove_dir_all(&store_path);
Ok(tokio::spawn(async move {
match Node::new(committee_file, &key_file, &store_path, None).await {
Ok(mut node) => {
// Sink the commit channel.
while node.commit.recv().await.is_some() {}
}
Err(e) => error!("{}", e),
}
}))
})
.collect::<Result<_, Box<dyn std::error::Error>>>()
}