use vrf_pbft::{hex, Config, ConsensusEngine, Node};
fn main() {
let config = Config::new(1); let mut engine = ConsensusEngine::new(config);
for i in 1..=4 {
let node = Node::new(i, 1000).expect("failed to create node");
engine.add_node(node);
}
println!("Running VRF-PBFT with 4 nodes (f=1)...\n");
loop {
match engine.run_round() {
Ok(block) => {
println!("Consensus reached on round {}!", engine.round());
println!(" Proposer: node {}", block.proposer);
println!(" Seed: {}", block.seed);
println!(" Prev hash: {}...", &hex(&block.prev_hash)[..16]);
println!(" Hash: {}...", &hex(&block.hash())[..16]);
println!("\nMessages exchanged: {}", engine.messages().len());
break;
}
Err(vrf_pbft::Error::NoProposer(r)) => {
println!("Round {}: no proposer elected, retrying...", r);
}
Err(vrf_pbft::Error::InsufficientVotes { needed, got }) => {
println!(
"Round {}: not enough votes ({}/{}), retrying...",
engine.round(),
got,
needed
);
}
Err(e) => {
eprintln!("Fatal error: {}", e);
std::process::exit(1);
}
}
}
}