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

43 lines
1.1 KiB
Rust
Raw Normal View History

2023-12-31 11:42:54 +00:00
use alloc::borrow::Cow;
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
2023-12-31 11:42:54 +00:00
type Key = Vec<u8>;
type Value<'a> = Cow<'a, [u8]>;
2023-12-30 12:50:47 +00:00
#[derive(Clone, Debug)]
2023-12-31 11:42:54 +00:00
pub struct CwVerifier<'a>(MultiVerifier<Ics23MembershipVerifier<Key, Value<'a>>, 2>);
2023-12-30 12:50:47 +00:00
2023-12-31 11:42:54 +00:00
impl CwVerifier<'_> {
2023-12-30 12:50:47 +00:00
pub fn verify(
&self,
proofs: &[CommitmentProof; 2],
root: &Vec<u8>,
keys: &[Vec<u8>; 2],
value: &[u8],
2023-12-30 12:50:47 +00:00
) -> 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
}
2023-12-31 16:44:29 +00:00
self.0
.verify_against_root(proofs, keys, &Cow::Borrowed(value), root)?
.then_some(())
.ok_or(ProofError::VerificationFailure)
2023-12-30 12:50:47 +00:00
}
}
2023-12-31 11:42:54 +00:00
impl Default for CwVerifier<'_> {
fn default() -> Self {
let mv = MultiVerifier::new([
Ics23MembershipVerifier::new(ics23::iavl_spec()),
Ics23MembershipVerifier::new(ics23::tendermint_spec()),
]);
Self(mv)
}
}