miden_protocol/batch/
note_tree.rs1use alloc::vec::Vec;
2
3use crate::crypto::merkle::MerkleError;
4use crate::crypto::merkle::smt::{LeafIndex, SimpleSmt};
5use crate::note::{NoteId, NoteMetadata, compute_note_commitment};
6use crate::utils::serde::{
7 ByteReader,
8 ByteWriter,
9 Deserializable,
10 DeserializationError,
11 Serializable,
12};
13use crate::{BATCH_NOTE_TREE_DEPTH, EMPTY_WORD, Word};
14
15#[derive(Debug, Clone, PartialEq, Eq)]
19pub struct BatchNoteTree(SimpleSmt<BATCH_NOTE_TREE_DEPTH>);
20
21impl BatchNoteTree {
22 pub fn with_contiguous_leaves<'a>(
29 entries: impl IntoIterator<Item = (NoteId, &'a NoteMetadata)>,
30 ) -> Result<Self, MerkleError> {
31 let leaves = entries
32 .into_iter()
33 .map(|(note_id, metadata)| compute_note_commitment(note_id, metadata));
34
35 SimpleSmt::with_contiguous_leaves(leaves).map(Self)
36 }
37
38 pub fn root(&self) -> Word {
40 self.0.root()
41 }
42
43 pub fn num_leaves(&self) -> usize {
45 self.0.num_leaves()
46 }
47
48 pub fn remove(&mut self, index: u64) -> Result<(), MerkleError> {
56 let key = LeafIndex::new(index)?;
57 self.0.insert(key, EMPTY_WORD);
58
59 Ok(())
60 }
61
62 pub fn into_smt(self) -> SimpleSmt<BATCH_NOTE_TREE_DEPTH> {
64 self.0
65 }
66}
67
68impl Serializable for BatchNoteTree {
72 fn write_into<W: ByteWriter>(&self, target: &mut W) {
73 self.0.leaves().collect::<Vec<_>>().write_into(target);
74 }
75}
76
77impl Deserializable for BatchNoteTree {
78 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
79 let leaves = Vec::read_from(source)?;
80 let smt = SimpleSmt::with_leaves(leaves.into_iter()).map_err(|err| {
81 DeserializationError::UnknownError(format!(
82 "failed to deserialize BatchNoteTree: {err}"
83 ))
84 })?;
85 Ok(Self(smt))
86 }
87}