use crate::{aggregation::types::Epoch, Supervisor as S, ThresholdSupervisor as TS}; use commonware_cryptography::{ bls12381::{ dkg::ops::evaluate_all, primitives::{group::Share, poly, variant::Variant}, }, PublicKey, }; use std::collections::HashMap; #[derive(Clone)] pub struct Supervisor { identity: V::Public, shares: HashMap, polynomials: HashMap>, validators: HashMap>, validators_maps: HashMap>, } impl Supervisor { pub fn new(identity: V::Public) -> Self { Self { identity, shares: HashMap::new(), polynomials: HashMap::new(), validators: HashMap::new(), validators_maps: HashMap::new(), } } } impl Supervisor { pub fn add_epoch( &mut self, epoch: Epoch, share: Share, polynomial: poly::Public, mut validators: Vec

, ) { // Setup validators validators.sort(); let mut validators_map = HashMap::new(); for (index, validator) in validators.iter().enumerate() { validators_map.insert(validator.clone(), index as u32); } // Evaluate the polynomial let identity = *poly::public::(&polynomial); assert_eq!(identity, self.identity); let polynomial = evaluate_all::(&polynomial, validators.len() as u32); // Store artifacts self.shares.insert(epoch, share); self.polynomials.insert(epoch, polynomial); self.validators.insert(epoch, validators); self.validators_maps.insert(epoch, validators_map); } } impl S for Supervisor { type Index = Epoch; type PublicKey = P; fn leader(&self, _: Self::Index) -> Option { unimplemented!() } fn participants(&self, epoch: Self::Index) -> Option<&Vec> { self.validators.get(&epoch) } fn is_participant(&self, epoch: Self::Index, candidate: &Self::PublicKey) -> Option { self.validators_maps.get(&epoch)?.get(candidate).cloned() } } impl TS for Supervisor { type Identity = V::Public; type Seed = V::Signature; type Polynomial = Vec; type Share = Share; fn identity(&self) -> &Self::Identity { &self.identity } fn leader(&self, _: Self::Index, _: Self::Seed) -> Option { unimplemented!() } fn polynomial(&self, epoch: Self::Index) -> Option<&Self::Polynomial> { self.polynomials.get(&epoch) } fn share(&self, epoch: Self::Index) -> Option<&Self::Share> { self.shares.get(&epoch) } }