This commit adds a type, MutationSet, which represents a set of changes to a SparseMerkleTree that haven't happened yet, and can be queried on to ensure a set of insertions result in the correct tree root before finalizing and committing the mutation. This is a direct step towards issue 222, and will directly enable removing Merkle tree clones in miden-node InnerState::apply_block(). As part of this change, SparseMerkleTree now requires its Key to be Ord and its Leaf to be Clone (both bounds which were already met by existing implementations). The Ord bound could instead be changed to Eq + Hash, if MutationSet were changed to use a HashMap instead of a BTreeMap. Additionally, as MutationSet is a generic type which works on any type that implements SparseMerkleTree, but is intended for public API use, the SparseMerkleTree trait and InnerNode type have been made public so MutationSet can be used outside of this crate.
60 lines
1.4 KiB
Rust
60 lines
1.4 KiB
Rust
//! Data structures related to Merkle trees based on RPO256 hash function.
|
|
|
|
use super::{
|
|
hash::rpo::{Rpo256, RpoDigest},
|
|
Felt, Word, EMPTY_WORD, ZERO,
|
|
};
|
|
|
|
// REEXPORTS
|
|
// ================================================================================================
|
|
|
|
mod empty_roots;
|
|
pub use empty_roots::EmptySubtreeRoots;
|
|
|
|
mod index;
|
|
pub use index::NodeIndex;
|
|
|
|
mod merkle_tree;
|
|
pub use merkle_tree::{path_to_text, tree_to_text, MerkleTree};
|
|
|
|
mod path;
|
|
pub use path::{MerklePath, RootPath, ValuePath};
|
|
|
|
mod smt;
|
|
pub use smt::{
|
|
LeafIndex, MutationSet, SimpleSmt, Smt, SmtLeaf, SmtLeafError, SmtProof, SmtProofError,
|
|
SMT_DEPTH, SMT_MAX_DEPTH, SMT_MIN_DEPTH,
|
|
};
|
|
|
|
mod mmr;
|
|
pub use mmr::{InOrderIndex, Mmr, MmrDelta, MmrError, MmrPeaks, MmrProof, PartialMmr};
|
|
|
|
mod store;
|
|
pub use store::{DefaultMerkleStore, MerkleStore, RecordingMerkleStore, StoreNode};
|
|
|
|
mod node;
|
|
pub use node::InnerNodeInfo;
|
|
|
|
mod partial_mt;
|
|
pub use partial_mt::PartialMerkleTree;
|
|
|
|
mod error;
|
|
pub use error::MerkleError;
|
|
|
|
// HELPER FUNCTIONS
|
|
// ================================================================================================
|
|
|
|
#[cfg(test)]
|
|
const fn int_to_node(value: u64) -> RpoDigest {
|
|
RpoDigest::new([Felt::new(value), ZERO, ZERO, ZERO])
|
|
}
|
|
|
|
#[cfg(test)]
|
|
const fn int_to_leaf(value: u64) -> Word {
|
|
[Felt::new(value), ZERO, ZERO, ZERO]
|
|
}
|
|
|
|
#[cfg(test)]
|
|
fn digests_to_words(digests: &[RpoDigest]) -> alloc::vec::Vec<Word> {
|
|
digests.iter().map(|d| d.into()).collect()
|
|
}
|