use clap::{Arg, Command, value_parser};
use commonware_codec::Encode;
use commonware_cryptography::{
Signer as _,
bls12381::{
dkg::feldman_desmedt::deal_anonymous,
primitives::{sharing::Mode, variant::MinSig},
},
ed25519,
};
use commonware_formatting::hex;
use commonware_utils::{N3f1, NZU32};
use rand::{SeedableRng, rngs::StdRng};
fn main() {
let matches = Command::new("dealer")
.about("generate threshold secret")
.arg(
Arg::new("seed")
.long("seed")
.required(true)
.value_parser(value_parser!(u64)),
)
.arg(
Arg::new("participants")
.long("participants")
.required(true)
.value_delimiter(',')
.value_parser(value_parser!(u64))
.help("All participants (arbiter and contributors)"),
)
.get_matches();
let seed = *matches.get_one::<u64>("seed").expect("seed is required");
let mut validators = Vec::new();
let participants = matches
.get_many::<u64>("participants")
.expect("Please provide allowed keys")
.copied();
if participants.len() == 0 {
panic!("Please provide at least one participant");
}
for peer in participants {
let verifier = ed25519::PrivateKey::from_seed(peer).public_key();
validators.push((peer, verifier));
}
validators.sort_by(|(_, a), (_, b)| a.cmp(b));
let n = validators.len() as u32;
let mut rng = StdRng::seed_from_u64(seed);
let (public, shares) =
deal_anonymous::<MinSig, N3f1>(&mut rng, Mode::NonZeroCounter, NZU32!(n));
println!("polynomial: {}", hex(&public.encode()));
println!("public: {}", public.public());
for share in shares {
let validator = validators[usize::from(share.index)].0;
println!(
"share (index={} validator={}): {}",
share.index,
validator,
hex(&share.encode())
);
}
}