Skip to main content

miden_objects/decoded/primitives/
advice.rs

1use miden_protobuf::unwrap_infallible;
2pub use proto::primitives::DecodedMerkleStoreNode as MerkleStoreNode;
3
4use crate::{Verify, proto};
5
6#[cfg(test)]
7mod tests;
8
9impl Verify for MerkleStoreNode {
10    type Verified = miden_protocol::crypto::merkle::InnerNodeInfo;
11    type Error = core::convert::Infallible;
12    fn verify(self) -> Result<Self::Verified, Self::Error> {
13        Ok(Self::Verified {
14            value: self.value,
15            left: self.left,
16            right: self.right,
17        })
18    }
19}
20
21pub use proto::primitives::DecodedAdviceMapEntry as AdviceMapEntry;
22
23impl Verify for AdviceMapEntry {
24    type Verified = (miden_protocol::Word, alloc::vec::Vec<miden_protocol::Felt>);
25    type Error = core::convert::Infallible;
26    fn verify(self) -> Result<Self::Verified, Self::Error> {
27        Ok((self.key, self.values))
28    }
29}
30
31pub use proto::primitives::DecodedAdviceStack as AdviceStack;
32
33impl Verify for AdviceStack {
34    type Verified = miden_protocol::vm::AdviceStack;
35    type Error = core::convert::Infallible;
36    fn verify(self) -> Result<Self::Verified, Self::Error> {
37        Ok(self.values.into_iter().collect())
38    }
39}
40
41pub use proto::primitives::DecodedAdviceMap as AdviceMap;
42
43impl Verify for AdviceMap {
44    type Verified = miden_protocol::vm::AdviceMap;
45    type Error = AdviceError;
46    fn verify(self) -> Result<Self::Verified, Self::Error> {
47        let mut entries = alloc::collections::BTreeMap::new();
48        for entry in self.entries {
49            if entries.insert(entry.key, entry.values).is_some() {
50                return Err(AdviceError::DuplicateMapKey(entry.key));
51            }
52        }
53        Ok(entries.into())
54    }
55}
56
57#[derive(Debug, thiserror::Error)]
58pub enum AdviceError {
59    #[error("duplicate advice map key {0}")]
60    DuplicateMapKey(miden_protocol::Word),
61    #[error("duplicate Merkle store parent {0}")]
62    DuplicateMerkleParent(miden_protocol::Word),
63}
64
65pub use proto::primitives::DecodedMerkleStore as MerkleStore;
66
67impl Verify for MerkleStore {
68    type Verified = miden_protocol::crypto::merkle::store::MerkleStore;
69    type Error = AdviceError;
70    fn verify(self) -> Result<Self::Verified, Self::Error> {
71        let mut nodes = alloc::collections::BTreeMap::new();
72        for node in self.nodes {
73            let node = unwrap_infallible(node.verify());
74            if nodes.insert(node.value, node.clone()).is_some() {
75                return Err(AdviceError::DuplicateMerkleParent(node.value));
76            }
77        }
78        let mut store = Self::Verified::new();
79        store.extend(nodes.into_values());
80        Ok(store)
81    }
82}
83
84pub use proto::primitives::DecodedAdviceInputs as AdviceInputs;
85
86impl Verify for AdviceInputs {
87    type Verified = miden_protocol::vm::AdviceInputs;
88    type Error = AdviceError;
89    fn verify(self) -> Result<Self::Verified, Self::Error> {
90        Ok(Self::Verified::new(
91            unwrap_infallible(self.advice_stack.verify()),
92            self.advice_map.verify()?,
93            self.merkle_store.verify()?,
94        ))
95    }
96}