Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Co-authored-by: Robert Hambrock
  • Loading branch information
serban300 committed May 10, 2024
1 parent 1d27d84 commit f330121
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 10 deletions.
13 changes: 11 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 7 additions & 5 deletions substrate/frame/merkle-mountain-range/src/mmr/mmr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ use crate::{
primitives::{self, Error, NodeIndex},
Config, HashOf, HashingOf,
};
use sp_mmr_primitives::{mmr_lib, utils::NodesUtils};
use sp_mmr_primitives::{mmr_lib, mmr_lib::MMRStoreReadOps, utils::NodesUtils};
use sp_std::prelude::*;

/// Stateless verification of the proof for a batch of leaves.
Expand Down Expand Up @@ -69,7 +69,8 @@ where
T: Config<I>,
I: 'static,
L: primitives::FullLeaf,
Storage<StorageType, T, I, L>: mmr_lib::MMRStore<NodeOf<T, I, L>>,
Storage<StorageType, T, I, L>:
MMRStoreReadOps<NodeOf<T, I, L>> + mmr_lib::MMRStoreWriteOps<NodeOf<T, I, L>>,
{
mmr: mmr_lib::MMR<NodeOf<T, I, L>, Hasher<HashingOf<T, I>, L>, Storage<StorageType, T, I, L>>,
leaves: NodeIndex,
Expand All @@ -80,7 +81,8 @@ where
T: Config<I>,
I: 'static,
L: primitives::FullLeaf,
Storage<StorageType, T, I, L>: mmr_lib::MMRStore<NodeOf<T, I, L>>,
Storage<StorageType, T, I, L>:
MMRStoreReadOps<NodeOf<T, I, L>> + mmr_lib::MMRStoreWriteOps<NodeOf<T, I, L>>,
{
/// Create a pointer to an existing MMR with given number of leaves.
pub fn new(leaves: NodeIndex) -> Self {
Expand Down Expand Up @@ -145,7 +147,7 @@ where

/// Commit the changes to underlying storage, return current number of leaves and
/// calculate the new MMR's root hash.
pub fn finalize(self) -> Result<(NodeIndex, HashOf<T, I>), Error> {
pub fn finalize(mut self) -> Result<(NodeIndex, HashOf<T, I>), Error> {
let root = self.mmr.get_root().map_err(|e| Error::GetRoot.log_error(e))?;
self.mmr.commit().map_err(|e| Error::Commit.log_error(e))?;
Ok((self.leaves, root.hash()))
Expand Down Expand Up @@ -174,7 +176,7 @@ where
let store = <Storage<OffchainStorage, T, I, L>>::default();
let leaves = positions
.iter()
.map(|pos| match mmr_lib::MMRStore::get_elem(&store, *pos) {
.map(|pos| match store.get_elem(*pos) {
Ok(Some(Node::Data(leaf))) => Ok(leaf),
e => Err(Error::LeafNotFound.log_debug(e)),
})
Expand Down
18 changes: 16 additions & 2 deletions substrate/frame/merkle-mountain-range/src/mmr/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ impl<StorageType, T, I, L> Default for Storage<StorageType, T, I, L> {
}
}

impl<T, I, L> mmr_lib::MMRStore<NodeOf<T, I, L>> for Storage<OffchainStorage, T, I, L>
impl<T, I, L> mmr_lib::MMRStoreReadOps<NodeOf<T, I, L>> for Storage<OffchainStorage, T, I, L>
where
T: Config<I>,
I: 'static,
Expand Down Expand Up @@ -98,13 +98,20 @@ where
Ok(sp_io::offchain::local_storage_get(StorageKind::PERSISTENT, &temp_key)
.and_then(|v| codec::Decode::decode(&mut &*v).ok()))
}
}

impl<T, I, L> mmr_lib::MMRStoreWriteOps<NodeOf<T, I, L>> for Storage<OffchainStorage, T, I, L>
where
T: Config<I>,
I: 'static,
L: primitives::FullLeaf + codec::Decode,
{
fn append(&mut self, _: NodeIndex, _: Vec<NodeOf<T, I, L>>) -> mmr_lib::Result<()> {
panic!("MMR must not be altered in the off-chain context.")
}
}

impl<T, I, L> mmr_lib::MMRStore<NodeOf<T, I, L>> for Storage<RuntimeStorage, T, I, L>
impl<T, I, L> mmr_lib::MMRStoreReadOps<NodeOf<T, I, L>> for Storage<RuntimeStorage, T, I, L>
where
T: Config<I>,
I: 'static,
Expand All @@ -113,7 +120,14 @@ where
fn get_elem(&self, pos: NodeIndex) -> mmr_lib::Result<Option<NodeOf<T, I, L>>> {
Ok(Nodes::<T, I>::get(pos).map(Node::Hash))
}
}

impl<T, I, L> mmr_lib::MMRStoreWriteOps<NodeOf<T, I, L>> for Storage<RuntimeStorage, T, I, L>
where
T: Config<I>,
I: 'static,
L: primitives::FullLeaf,
{
fn append(&mut self, pos: NodeIndex, elems: Vec<NodeOf<T, I, L>>) -> mmr_lib::Result<()> {
if elems.is_empty() {
return Ok(())
Expand Down
2 changes: 1 addition & 1 deletion substrate/primitives/merkle-mountain-range/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"]
codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false }
scale-info = { version = "2.11.1", default-features = false, features = ["derive"] }
log = { workspace = true }
mmr-lib = { package = "ckb-merkle-mountain-range", version = "0.5.2", default-features = false }
mmr-lib = { package = "ckb-merkle-mountain-range", git = "https://github.com/paritytech/merkle-mountain-range.git", branch = "master", default-features = false }
serde = { features = ["alloc", "derive"], optional = true, workspace = true }
sp-api = { path = "../api", default-features = false }
sp-core = { path = "../core", default-features = false }
Expand Down

0 comments on commit f330121

Please sign in to comment.