From 76eb7f6d0186d4c75a47411a2bfd7be407599eda Mon Sep 17 00:00:00 2001 From: Qyriad Date: Tue, 5 Nov 2024 16:17:41 -0700 Subject: [PATCH] smt: add from_raw_parts() to trait interface --- src/merkle/smt/full/mod.rs | 21 +++++++++++++++++++++ src/merkle/smt/mod.rs | 8 ++++++++ src/merkle/smt/simple/mod.rs | 21 +++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/src/merkle/smt/full/mod.rs b/src/merkle/smt/full/mod.rs index 0b170d6..34a677c 100644 --- a/src/merkle/smt/full/mod.rs +++ b/src/merkle/smt/full/mod.rs @@ -81,6 +81,14 @@ impl Smt { >::with_entries(entries) } + pub fn from_raw_parts( + inner_nodes: BTreeMap, + leaves: BTreeMap, + root: RpoDigest, + ) -> Result { + >::from_raw_parts(inner_nodes, leaves, root) + } + // PUBLIC ACCESSORS // -------------------------------------------------------------------------------------------- @@ -247,6 +255,19 @@ impl SparseMerkleTree for Smt { const EMPTY_VALUE: Self::Value = EMPTY_WORD; const EMPTY_ROOT: RpoDigest = *EmptySubtreeRoots::entry(SMT_DEPTH, 0); + fn from_raw_parts( + inner_nodes: BTreeMap, + leaves: BTreeMap, + root: RpoDigest, + ) -> Result { + if cfg!(debug_assertions) { + let root_node = inner_nodes.get(&NodeIndex::root()).unwrap(); + assert_eq!(root_node.hash(), root); + } + + Ok(Self { root, inner_nodes, leaves }) + } + fn with_entries( entries: impl IntoIterator, ) -> Result { diff --git a/src/merkle/smt/mod.rs b/src/merkle/smt/mod.rs index 7ef302e..22b6d53 100644 --- a/src/merkle/smt/mod.rs +++ b/src/merkle/smt/mod.rs @@ -299,6 +299,14 @@ pub(crate) trait SparseMerkleTree { where Self: Sized; + fn from_raw_parts( + inner_nodes: BTreeMap, + leaves: BTreeMap, + root: RpoDigest, + ) -> Result + where + Self: Sized; + /// The root of the tree fn root(&self) -> RpoDigest; diff --git a/src/merkle/smt/simple/mod.rs b/src/merkle/smt/simple/mod.rs index 0a30b04..62ce753 100644 --- a/src/merkle/smt/simple/mod.rs +++ b/src/merkle/smt/simple/mod.rs @@ -100,6 +100,14 @@ impl SimpleSmt { Ok(tree) } + pub fn from_raw_parts( + inner_nodes: BTreeMap, + leaves: BTreeMap, + root: RpoDigest, + ) -> Result { + >::from_raw_parts(inner_nodes, leaves, root) + } + /// Wrapper around [`SimpleSmt::with_leaves`] which inserts leaves at contiguous indices /// starting at index 0. pub fn with_contiguous_leaves( @@ -309,6 +317,19 @@ impl SparseMerkleTree for SimpleSmt { const EMPTY_VALUE: Self::Value = EMPTY_WORD; const EMPTY_ROOT: RpoDigest = *EmptySubtreeRoots::entry(DEPTH, 0); + fn from_raw_parts( + inner_nodes: BTreeMap, + leaves: BTreeMap, + root: RpoDigest, + ) -> Result { + if cfg!(debug_assertions) { + let root_node = inner_nodes.get(&NodeIndex::root()).unwrap(); + assert_eq!(root_node.hash(), root); + } + + Ok(Self { root, inner_nodes, leaves }) + } + fn with_entries( entries: impl IntoIterator, Word)>, ) -> Result {