ariadne_simulator/
simple_sim.rs

1use crate::*;
2use rand_chacha::ChaCha20Rng;
3
4/// Runs Ariadne selection and prints the selected committee as JSON
5#[derive(clap::Parser, Debug)]
6pub struct Command {
7	/// Number of permissioned seats
8	#[arg(long, short = 'P')]
9	permissioned_seats: u16,
10	/// Number of registered seats
11	#[arg(long, short = 'R')]
12	registered_seats: u16,
13	/// File containing permissioned candidates, defaults to no permissioned candidates
14	#[arg(long, short = 'p')]
15	permissioned_file: Option<String>,
16	/// File containing registered candidates, defaults to no registered candidates
17	#[arg(long, short = 'r')]
18	registered_file: Option<String>,
19	/// Number of committees to select. Each committee will be a separate JSON array
20	#[arg(long, default_value = "1")]
21	repetitions: u32,
22	/// Ariadne algorithm version
23	#[arg(long, default_value = "v2")]
24	ariadne_version: AriadneVersion,
25}
26
27impl Command {
28	/// Executes the command using givern RNG
29	pub fn execute(self, mut rng: ChaCha20Rng) {
30		let registered_candidates: Vec<(String, u128)> =
31			self.registered_file.map(load_registered).unwrap_or_default();
32
33		let permissioned_candidates: Vec<String> =
34			self.permissioned_file.map(load_permissioned).unwrap_or_default();
35
36		log::info!("Number of registered candidates: {}", registered_candidates.len());
37		log::info!("Number of permissioned candidates: {}", permissioned_candidates.len());
38
39		for i in 0..self.repetitions {
40			if i % 100 == 0 && i > 0 {
41				log::info!("Generation progress: {i}/{}", self.repetitions);
42			}
43
44			let selected = self
45				.ariadne_version
46				.select_authorities(
47					self.registered_seats,
48					self.permissioned_seats,
49					registered_candidates.clone(),
50					permissioned_candidates.clone(),
51					&mut rng,
52				)
53				.expect("Selection failed");
54			println!("{}", serde_json::to_string(&selected).unwrap());
55		}
56	}
57}