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],
|
2023-12-30 23:10:11 +00:00
|
|
|
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-30 21:45:53 +00:00
|
|
|
|
2023-12-31 11:42:54 +00:00
|
|
|
impl Default for CwVerifier<'_> {
|
2023-12-30 21:45:53 +00:00
|
|
|
fn default() -> Self {
|
|
|
|
let mv = MultiVerifier::new([
|
|
|
|
Ics23MembershipVerifier::new(ics23::iavl_spec()),
|
|
|
|
Ics23MembershipVerifier::new(ics23::tendermint_spec()),
|
|
|
|
]);
|
|
|
|
Self(mv)
|
|
|
|
}
|
|
|
|
}
|