main.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. pub mod sim;
  2. mod stats;
  3. mod types;
  4. use std::{env, process};
  5. use crate::types::{Quorum, Region};
  6. use crate::stats::{CurrentStats, CumulativeStats};
  7. use crate::sim::Simulation;
  8. use rand_pcg::Pcg64;
  9. use rand::SeedableRng;
  10. fn usage(cmd: &String) {
  11. eprintln!("Usage: {} h m r k g iters seed", cmd);
  12. eprintln!("h: number of honest nodes");
  13. eprintln!("m: number of malicious nodes");
  14. eprintln!("lg_r: log_2 of the number of regions");
  15. eprintln!("lg_c: log_2 of the number of regions per quorum");
  16. eprintln!("k: k - 1 no. of secondary joins in CCR before new primary joins are accepted");
  17. eprintln!("g: desired number of nodes in a *region*");
  18. eprintln!("T: number of iterations after initialization");
  19. eprintln!("seed: random seed");
  20. }
  21. fn main() {
  22. let args: Vec<String> = env::args().collect();
  23. if args.len() != 9 {
  24. usage(&args[0]);
  25. process::exit(1);
  26. }
  27. let valid_args: Vec<usize> = args.iter().enumerate()
  28. .filter(|(i, _)| *i != 0)
  29. .map(|(_, v)| v.parse::<usize>())
  30. .filter(|x| x.is_ok())
  31. .map(|x| x.unwrap())
  32. .collect();
  33. if valid_args.len() != 8 {
  34. usage(&args[0]);
  35. process::exit(1);
  36. }
  37. let h = valid_args[0];
  38. let m = valid_args[1];
  39. let lg_r = valid_args[2];
  40. let lg_c = valid_args[3];
  41. let k = valid_args[4];
  42. let g = valid_args[5];
  43. let iters = valid_args[6];
  44. let seed = valid_args[7];
  45. if (lg_c > lg_r) | (k > g) {
  46. usage(&args[0]);
  47. process::exit(1);
  48. }
  49. let blankregion = Region {
  50. num_honest: 0,
  51. num_malicious: 0,
  52. last_join: 0
  53. };
  54. let blankquorum = Quorum {
  55. tot_honest: 0,
  56. tot_malicious: 0,
  57. tot_last_join: 0,
  58. num_nodes_since_last_primary_join: 0,
  59. };
  60. let mut sim = Simulation {
  61. done_init: false,
  62. now: 0,
  63. rand: Pcg64::seed_from_u64(seed as u64),
  64. quorums: Vec::new(),
  65. regions: Vec::new(),
  66. lg_regions_per_quorum: lg_c,
  67. num_region_mask: (1<<lg_r)-1,
  68. cur_stats: CurrentStats::default(),
  69. cum_stats: CumulativeStats::default(),
  70. k,
  71. g,
  72. };
  73. sim.regions.resize(1<<lg_r, blankregion);
  74. sim.quorums.resize(1<<(lg_r-lg_c), blankquorum);
  75. eprintln!("Starting simulation h={} m={} 2^r={} regions 2^c={} regions/quorum k={} g={} desired quorum size T={} seed={}",
  76. h, m, 1 << lg_r, 1 << lg_c, k, g, iters, seed);
  77. sim.init(h, m);
  78. for iter in 0..iters {
  79. sim.move_malicious();
  80. if iter % 100000 == 0 {
  81. eprintln!("iter {}", iter);
  82. }
  83. }
  84. println!("h={} m={} 2^r={} 2^c={} k={} g={} T={} seed={}",
  85. h, m, 1 << lg_r, 1<< lg_c, k, g, iters, seed);
  86. sim.cum_stats.print();
  87. }