use std::{thread, time::Duration};
use rand_core::OsRng;
use hotstuff_rs::types::{
crypto_primitives::SigningKey, data_types::Power, update_sets::ValidatorSetUpdates,
};
mod common;
use common::{
logging::log_with_context,
network::mock_network,
node::Node,
number_app::{NumberApp, NumberAppTransaction},
};
#[test]
fn block_sync_test() {
let mut csprg = OsRng {};
let mut keypairs: Vec<SigningKey> = (0..4).map(|_| SigningKey::generate(&mut csprg)).collect();
let mut network_stubs = mock_network(keypairs.iter().map(|kp| kp.verifying_key()));
let lagging_replica_keypair = keypairs.split_off(3);
let lagging_replica_network = network_stubs.split_off(3);
let init_as = NumberApp::initial_app_state();
let init_vs_updates = {
let mut vs_updates = ValidatorSetUpdates::new();
vs_updates.insert(keypairs[0].verifying_key(), Power::new(1));
vs_updates.insert(keypairs[1].verifying_key(), Power::new(1));
vs_updates.insert(keypairs[2].verifying_key(), Power::new(1));
vs_updates
};
let mut live_nodes: Vec<Node> = keypairs
.into_iter()
.zip(network_stubs)
.map(|(keypair, network)| {
Node::new(
keypair.clone(),
network,
init_as.clone(),
init_vs_updates.clone(),
)
})
.collect();
log_with_context(
None,
"Submitting one Increment transactions to each of replica 0 and replica 1.",
);
live_nodes[0].submit_transaction(NumberAppTransaction::Increment);
live_nodes[1].submit_transaction(NumberAppTransaction::Increment);
log_with_context(
None,
"Polling the app state of the live replicas until each sees the number as 2.",
);
while !live_nodes.iter().all(|node| node.number() == 2) {
thread::sleep(Duration::from_millis(500));
}
log_with_context(None, "Start the lagging replica.");
let lagging_node = Node::new(
lagging_replica_keypair[0].clone(),
lagging_replica_network[0].clone(),
init_as.clone(),
init_vs_updates.clone(),
);
log_with_context(None, "Polling the app state of the lagging replica.");
while lagging_node.number() != 2 {
thread::sleep(Duration::from_millis(500));
}
}