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