Simplify API

This commit is contained in:
hu55a1n1 2023-12-31 03:42:54 -08:00
parent 02439df550
commit 94c951e53b
4 changed files with 25 additions and 27 deletions

View file

@ -1,3 +1,4 @@
use alloc::borrow::Cow;
use alloc::vec::Vec; use alloc::vec::Vec;
use ics23::CommitmentProof; use ics23::CommitmentProof;
@ -5,10 +6,13 @@ use ics23::CommitmentProof;
use crate::error::ProofError; use crate::error::ProofError;
use crate::verifier::{ics23::Ics23MembershipVerifier, multi::MultiVerifier, Verifier}; use crate::verifier::{ics23::Ics23MembershipVerifier, multi::MultiVerifier, Verifier};
#[derive(Clone, Debug)] type Key = Vec<u8>;
pub struct CwVerifier(MultiVerifier<Ics23MembershipVerifier<Vec<u8>>, 2>); type Value<'a> = Cow<'a, [u8]>;
impl CwVerifier { #[derive(Clone, Debug)]
pub struct CwVerifier<'a>(MultiVerifier<Ics23MembershipVerifier<Key, Value<'a>>, 2>);
impl CwVerifier<'_> {
pub fn verify( pub fn verify(
&self, &self,
proofs: &[CommitmentProof; 2], proofs: &[CommitmentProof; 2],
@ -20,7 +24,8 @@ impl CwVerifier {
return Err(ProofError::EmptyMerkleRoot); return Err(ProofError::EmptyMerkleRoot);
} }
let verified = self.0.verify_against_root(proofs, keys, value, root)?; let value = Cow::Borrowed(value);
let verified = self.0.verify_against_root(proofs, keys, &value, root)?;
if !verified { if !verified {
return Err(ProofError::VerificationFailure); return Err(ProofError::VerificationFailure);
} }
@ -29,7 +34,7 @@ impl CwVerifier {
} }
} }
impl Default for CwVerifier { impl Default for CwVerifier<'_> {
fn default() -> Self { fn default() -> Self {
let mv = MultiVerifier::new([ let mv = MultiVerifier::new([
Ics23MembershipVerifier::new(ics23::iavl_spec()), Ics23MembershipVerifier::new(ics23::iavl_spec()),

View file

@ -10,12 +10,12 @@ use crate::error::ProofError;
use crate::verifier::Verifier; use crate::verifier::Verifier;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Ics23MembershipVerifier<K> { pub struct Ics23MembershipVerifier<K, V> {
spec: ProofSpec, spec: ProofSpec,
_phantom: PhantomData<K>, _phantom: PhantomData<(K, V)>,
} }
impl<K> Ics23MembershipVerifier<K> { impl<K, V> Ics23MembershipVerifier<K, V> {
pub fn new(spec: ProofSpec) -> Self { pub fn new(spec: ProofSpec) -> Self {
Self { Self {
spec, spec,
@ -24,22 +24,22 @@ impl<K> Ics23MembershipVerifier<K> {
} }
} }
impl<K> Verifier for Ics23MembershipVerifier<K> impl<K, V> Verifier for Ics23MembershipVerifier<K, V>
where where
K: AsRef<[u8]>, K: AsRef<[u8]>,
V: AsRef<[u8]>,
{ {
type Proof = CommitmentProof; type Proof = CommitmentProof;
type Root = Vec<u8>; type Root = Vec<u8>;
type Key = K; type Key = K;
type Value = Vec<u8>; type Value = V;
type ValueRef = [u8];
type Error = ProofError; type Error = ProofError;
fn verify( fn verify(
&self, &self,
commitment_proof: &Self::Proof, commitment_proof: &Self::Proof,
key: &Self::Key, key: &Self::Key,
value: &Self::ValueRef, value: &Self::Value,
) -> Result<Self::Root, Self::Error> { ) -> Result<Self::Root, Self::Error> {
if value.as_ref().is_empty() { if value.as_ref().is_empty() {
return Err(ProofError::EmptyVerifiedValue); return Err(ProofError::EmptyVerifiedValue);
@ -57,7 +57,7 @@ where
&self.spec, &self.spec,
&root, &root,
key.as_ref(), key.as_ref(),
value, value.as_ref(),
) { ) {
return Err(ProofError::VerificationFailure); return Err(ProofError::VerificationFailure);
} }

View file

@ -1,6 +1,3 @@
use alloc::borrow::ToOwned;
use core::borrow::Borrow;
pub mod cw; pub mod cw;
pub mod ics23; pub mod ics23;
pub mod multi; pub mod multi;
@ -9,22 +6,21 @@ trait Verifier {
type Proof; type Proof;
type Root: Eq; type Root: Eq;
type Key; type Key;
type Value: Borrow<Self::ValueRef>; type Value;
type ValueRef: ?Sized + ToOwned<Owned = Self::Value>;
type Error; type Error;
fn verify( fn verify(
&self, &self,
proof: &Self::Proof, proof: &Self::Proof,
key: &Self::Key, key: &Self::Key,
value: &Self::ValueRef, value: &Self::Value,
) -> Result<Self::Root, Self::Error>; ) -> Result<Self::Root, Self::Error>;
fn verify_against_root( fn verify_against_root(
&self, &self,
proof: &Self::Proof, proof: &Self::Proof,
key: &Self::Key, key: &Self::Key,
value: &Self::ValueRef, value: &Self::Value,
root: &Self::Root, root: &Self::Root,
) -> Result<bool, Self::Error> { ) -> Result<bool, Self::Error> {
let found_root = self.verify(proof, key, value)?; let found_root = self.verify(proof, key, value)?;

View file

@ -1,6 +1,3 @@
use alloc::borrow::ToOwned;
use core::borrow::Borrow;
use crate::verifier::Verifier; use crate::verifier::Verifier;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -19,27 +16,27 @@ impl<V, const N: usize> Verifier for MultiVerifier<V, N>
where where
V: Verifier, V: Verifier,
V::Root: Into<V::Value> + Clone, V::Root: Into<V::Value> + Clone,
V::Value: Clone,
{ {
type Proof = [V::Proof; N]; type Proof = [V::Proof; N];
type Root = V::Root; type Root = V::Root;
type Key = [V::Key; N]; type Key = [V::Key; N];
type Value = V::Value; type Value = V::Value;
type ValueRef = V::ValueRef;
type Error = V::Error; type Error = V::Error;
fn verify( fn verify(
&self, &self,
proofs: &Self::Proof, proofs: &Self::Proof,
keys: &Self::Key, keys: &Self::Key,
value: &Self::ValueRef, value: &Self::Value,
) -> Result<Self::Root, Self::Error> { ) -> Result<Self::Root, Self::Error> {
let mut root = None; let mut root = None;
let mut value: V::Value = value.to_owned(); let mut value: V::Value = value.clone();
for (idx, verifier) in self.verifiers.iter().enumerate() { for (idx, verifier) in self.verifiers.iter().enumerate() {
let proof = &proofs[idx]; let proof = &proofs[idx];
let key = &keys[N - idx - 1]; let key = &keys[N - idx - 1];
let sub_root = verifier.verify(proof, key, value.borrow())?; let sub_root = verifier.verify(proof, key, &value)?;
value = sub_root.clone().into(); value = sub_root.clone().into();
root = Some(sub_root); root = Some(sub_root);