cycles-quartz/utils/cw-proof/src/verifier/cw.rs

41 lines
1 KiB
Rust
Raw Normal View History

2023-12-30 20:33:51 +00:00
use alloc::vec::Vec;
2023-12-30 12:50:47 +00:00
use ics23::CommitmentProof;
2023-12-30 21:42:30 +00:00
use crate::error::ProofError;
2023-12-30 12:56:07 +00:00
use crate::verifier::{ics23::Ics23MembershipVerifier, multi::MultiVerifier, Verifier};
2023-12-30 12:50:47 +00:00
#[derive(Clone, Debug)]
pub struct CwVerifier(MultiVerifier<Ics23MembershipVerifier<Vec<u8>, Vec<u8>>, 2>);
impl CwVerifier {
pub fn verify(
&self,
proofs: &[CommitmentProof; 2],
root: &Vec<u8>,
keys: &[Vec<u8>; 2],
value: &Vec<u8>,
) -> Result<(), ProofError> {
if root.is_empty() {
2023-12-30 21:42:30 +00:00
return Err(ProofError::EmptyMerkleRoot);
2023-12-30 12:50:47 +00:00
}
let verified = self.0.verify_against_root(proofs, keys, value, root)?;
if !verified {
2023-12-30 21:42:30 +00:00
return Err(ProofError::VerificationFailure);
2023-12-30 12:50:47 +00:00
}
Ok(())
}
}
impl Default for CwVerifier {
fn default() -> Self {
let mv = MultiVerifier::new([
Ics23MembershipVerifier::new(ics23::iavl_spec()),
Ics23MembershipVerifier::new(ics23::tendermint_spec()),
]);
Self(mv)
}
}