miden_objects/decoded/primitives/
advice.rs1use 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}