use crate::verifier::Verifier; #[derive(Clone, Debug)] pub struct MultiVerifier { verifiers: [V; N], } impl MultiVerifier { pub fn new(verifiers: [V; N]) -> Self { assert!(N > 0, "cannot create empty multi-verifiers"); Self { verifiers } } } impl Verifier for MultiVerifier where V: Verifier, V::Value: Clone, V::Root: Into + Clone, { type Proof = [V::Proof; N]; type Root = V::Root; type Key = [V::Key; N]; type Value = V::Value; type Error = V::Error; fn verify( &self, proofs: &Self::Proof, keys: &Self::Key, value: &Self::Value, ) -> Result { let mut root = None; let mut value = value.clone(); for (idx, verifier) in self.verifiers.iter().enumerate() { let proof = &proofs[idx]; let key = &keys[N - idx - 1]; let sub_root = verifier.verify(proof, key, &value)?; value = sub_root.clone().into(); root = Some(sub_root); } Ok(root.expect("MultiVerifier cannot be instantiated with 0 verifiers")) } }