commonware_storage/adb/
mod.rs1use crate::{journal::fixed::Journal, mmr::journaled};
14use commonware_cryptography::Hasher;
15use commonware_runtime::{Clock, Metrics, Storage};
16use thiserror::Error;
17
18pub mod any;
19pub mod current;
20pub mod immutable;
21pub mod keyless;
22pub mod sync;
23pub mod verify;
24use tracing::warn;
25pub use verify::{
26 create_multi_proof, create_proof, create_proof_store, create_proof_store_from_digests,
27 digests_required_for_proof, extract_pinned_nodes, verify_multi_proof, verify_proof,
28 verify_proof_and_extract_digests,
29};
30
31#[derive(Error, Debug)]
33pub enum Error {
34 #[error("mmr error: {0}")]
35 Mmr(#[from] crate::mmr::Error),
36
37 #[error("metadata error: {0}")]
38 Metadata(#[from] crate::metadata::Error),
39
40 #[error("journal error: {0}")]
41 Journal(#[from] crate::journal::Error),
42
43 #[error("operation pruned: {0}")]
44 OperationPruned(u64),
45
46 #[error("key not found")]
48 KeyNotFound,
49}
50
51async fn align_mmr_and_locations<E: Storage + Clock + Metrics, H: Hasher>(
54 mmr: &mut journaled::Mmr<E, H>,
55 locations: &mut Journal<E, u32>,
56) -> Result<u64, Error> {
57 let aligned_size = {
58 let locations_size = locations.size().await?;
59 let mmr_leaves = mmr.leaves();
60 if locations_size > mmr_leaves {
61 warn!(
62 mmr_leaves,
63 locations_size, "rewinding misaligned locations journal"
64 );
65 locations.rewind(mmr_leaves).await?;
66 locations.sync().await?;
67 mmr_leaves
68 } else if mmr_leaves > locations_size {
69 warn!(mmr_leaves, locations_size, "rewinding misaligned mmr");
70 mmr.pop((mmr_leaves - locations_size) as usize).await?;
71 locations_size
72 } else {
73 locations_size }
75 };
76
77 assert_eq!(aligned_size, locations.size().await?);
79 assert_eq!(aligned_size, mmr.leaves());
80
81 Ok(aligned_size)
82}