commonware_storage/mmr/
read.rs1use crate::mmr::{iterator::PeakIterator, proof, Error, Location, Position, Proof};
8use alloc::{collections::BTreeMap, vec::Vec};
9use commonware_cryptography::Digest;
10use core::ops::Range;
11
12pub trait Readable<D: Digest>: Send + Sync {
14 fn size(&self) -> Position;
16
17 fn get_node(&self, pos: Position) -> Option<D>;
19
20 fn root(&self) -> D;
22
23 fn pruned_to_pos(&self) -> Position;
25
26 fn leaves(&self) -> Location {
28 Location::try_from(self.size()).expect("invalid mmr size")
29 }
30
31 fn peak_iterator(&self) -> PeakIterator {
33 PeakIterator::new(self.size())
34 }
35
36 fn bounds(&self) -> Range<Position> {
38 self.pruned_to_pos()..self.size()
39 }
40
41 fn proof(&self, loc: Location) -> Result<Proof<D>, Error> {
43 if !loc.is_valid() {
44 return Err(Error::LocationOverflow(loc));
45 }
46 self.range_proof(loc..loc + 1).map_err(|e| match e {
47 Error::RangeOutOfBounds(loc) => Error::LeafOutOfBounds(loc),
48 _ => e,
49 })
50 }
51
52 fn range_proof(&self, range: Range<Location>) -> Result<Proof<D>, Error> {
54 let leaves = self.leaves();
55 let positions = proof::nodes_required_for_range_proof(leaves, range)?;
56 let digests = positions
57 .into_iter()
58 .map(|pos| self.get_node(pos).ok_or(Error::ElementPruned(pos)))
59 .collect::<Result<Vec<_>, _>>()?;
60 Ok(Proof { leaves, digests })
61 }
62}
63
64pub trait BatchChainInfo<D: Digest> {
66 fn base_size(&self) -> Position;
69
70 fn collect_overwrites(&self, into: &mut BTreeMap<Position, D>);
74}