miden_crypto/merkle/smt/simple/
proof.rs

1use crate::{
2    Word,
3    merkle::{MerkleError, MerkleProof, SparseMerklePath},
4};
5
6/// A container for a [crate::Word] value and its [SparseMerklePath] opening.
7#[derive(Clone, Debug, Default, PartialEq, Eq)]
8pub struct SimpleSmtProof {
9    /// The node value opening for `path`.
10    pub value: Word,
11    /// The path from `value` to `root` (exclusive), using an efficient memory representation for
12    /// empty nodes.
13    pub path: SparseMerklePath,
14}
15
16impl SimpleSmtProof {
17    /// Convenience function to construct a [SimpleSmtProof].
18    ///
19    /// `value` is the value `path` leads to, in the tree.
20    pub fn new(value: Word, path: SparseMerklePath) -> Self {
21        Self { value, path }
22    }
23}
24
25impl From<(SparseMerklePath, Word)> for SimpleSmtProof {
26    fn from((path, value): (SparseMerklePath, Word)) -> Self {
27        SimpleSmtProof::new(value, path)
28    }
29}
30
31impl TryFrom<MerkleProof> for SimpleSmtProof {
32    type Error = MerkleError;
33
34    /// # Errors
35    ///
36    /// This conversion returns [MerkleError::DepthTooBig] if the path length is greater than
37    /// [`super::SMT_MAX_DEPTH`].
38    fn try_from(other: MerkleProof) -> Result<Self, MerkleError> {
39        let MerkleProof { value, path } = other;
40        let path = SparseMerklePath::try_from(path)?;
41        Ok(SimpleSmtProof { value, path })
42    }
43}
44
45impl From<SimpleSmtProof> for MerkleProof {
46    fn from(other: SimpleSmtProof) -> Self {
47        let SimpleSmtProof { value, path } = other;
48        MerkleProof { value, path: path.into() }
49    }
50}
51
52impl PartialEq<MerkleProof> for SimpleSmtProof {
53    fn eq(&self, rhs: &MerkleProof) -> bool {
54        self.value == rhs.value && self.path == rhs.path
55    }
56}
57
58impl PartialEq<SimpleSmtProof> for MerkleProof {
59    fn eq(&self, rhs: &SimpleSmtProof) -> bool {
60        rhs == self
61    }
62}