Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Replace u64 with NodeIndex
  • Loading branch information
Xavier Lau committed Sep 5, 2021
commit 5cb4a96ddafe2b9f3fff2d7e472c4c97ca4d214c
9 changes: 6 additions & 3 deletions frame/merkle-mountain-range/primitives/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ use sp_std::fmt;
#[cfg(not(feature = "std"))]
use sp_std::prelude::Vec;

/// Node index type.
pub type NodeIndex = u64;

/// A provider of the MMR's leaf data.
pub trait LeafDataProvider {
/// A type that should end up in the leaf of MMR.
Expand Down Expand Up @@ -275,9 +278,9 @@ impl_leaf_data_for_tuple!(A:0, B:1, C:2, D:3, E:4);
#[derive(codec::Encode, codec::Decode, RuntimeDebug, Clone, PartialEq, Eq)]
pub struct Proof<Hash> {
/// The index of the leaf the proof is for.
pub leaf_index: u64,
pub leaf_index: NodeIndex,
/// Number of leaves in MMR, when the proof was generated.
pub leaf_count: u64,
pub leaf_count: NodeIndex,
/// Proof elements (hashes of siblings of inner nodes on the path to the leaf).
pub items: Vec<Hash>,
}
Expand Down Expand Up @@ -402,7 +405,7 @@ sp_api::decl_runtime_apis! {
/// API to interact with MMR pallet.
pub trait MmrApi<Hash: codec::Codec> {
/// Generate MMR proof for a leaf under given index.
fn generate_proof(leaf_index: u64) -> Result<(EncodableOpaqueLeaf, Proof<Hash>), Error>;
fn generate_proof(leaf_index: NodeIndex) -> Result<(EncodableOpaqueLeaf, Proof<Hash>), Error>;

/// Verify MMR proof against on-chain MMR.
///
Expand Down
4 changes: 2 additions & 2 deletions frame/merkle-mountain-range/rpc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ pub trait MmrApi<BlockHash> {
#[rpc(name = "mmr_generateProof")]
fn generate_proof(
&self,
leaf_index: u64,
leaf_index: NodeIndex,
at: Option<BlockHash>,
) -> Result<LeafProof<BlockHash>>;
}
Expand All @@ -98,7 +98,7 @@ where
{
fn generate_proof(
&self,
leaf_index: u64,
leaf_index: NodeIndex,
at: Option<<Block as BlockT>::Hash>,
) -> Result<LeafProof<<Block as BlockT>::Hash>> {
let api = self.client.runtime_api();
Expand Down
2 changes: 1 addition & 1 deletion frame/merkle-mountain-range/src/benchmarking.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ benchmarks_instance_pallet! {
on_initialize {
let x in 1 .. 1_000;

let leaves = x as u64;
let leaves = x as NodeIndex;
}: {
for b in 0..leaves {
Pallet::<T, I>::on_initialize((b as u32).into());
Expand Down
12 changes: 6 additions & 6 deletions frame/merkle-mountain-range/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,10 @@ mod mock;
mod tests;

pub use pallet::*;
pub use pallet_mmr_primitives as primitives;
pub use pallet_mmr_primitives::{self as primitives, NodeIndex};

pub trait WeightInfo {
fn on_initialize(peaks: u64) -> Weight;
fn on_initialize(peaks: NodeIndex) -> Weight;
}

#[frame_support::pallet]
Expand Down Expand Up @@ -159,7 +159,7 @@ pub mod pallet {
/// Current size of the MMR (number of leaves).
#[pallet::storage]
#[pallet::getter(fn mmr_leaves)]
pub type NumberOfLeaves<T, I = ()> = StorageValue<_, u64, ValueQuery>;
pub type NumberOfLeaves<T, I = ()> = StorageValue<_, NodeIndex, ValueQuery>;

/// Hashes of the nodes in the MMR.
///
Expand All @@ -168,7 +168,7 @@ pub mod pallet {
#[pallet::storage]
#[pallet::getter(fn mmr_peak)]
pub type Nodes<T: Config<I>, I: 'static = ()> =
StorageMap<_, Identity, u64, <T as Config<I>>::Hash, OptionQuery>;
StorageMap<_, Identity, NodeIndex, <T as Config<I>>::Hash, OptionQuery>;

#[pallet::hooks]
impl<T: Config<I>, I: 'static> Hooks<BlockNumberFor<T>> for Pallet<T, I> {
Expand Down Expand Up @@ -227,7 +227,7 @@ where
}

impl<T: Config<I>, I: 'static> Pallet<T, I> {
fn offchain_key(pos: u64) -> sp_std::prelude::Vec<u8> {
fn offchain_key(pos: NodeIndex) -> sp_std::prelude::Vec<u8> {
(T::INDEXING_PREFIX, pos).encode()
}

Expand All @@ -238,7 +238,7 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
/// all the leaves to be present.
/// It may return an error or panic if used incorrectly.
pub fn generate_proof(
leaf_index: u64,
leaf_index: NodeIndex,
) -> Result<(LeafOf<T, I>, primitives::Proof<<T as Config<I>>::Hash>), primitives::Error> {
let mmr: ModuleMmr<mmr::storage::OffchainStorage, T, I> = mmr::Mmr::new(Self::mmr_leaves());
mmr.generate_proof(leaf_index)
Expand Down
14 changes: 7 additions & 7 deletions frame/merkle-mountain-range/src/mmr/mmr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use crate::{
utils::NodesUtils,
Hasher, Node, NodeOf,
},
primitives::{self, Error},
primitives::{self, Error, NodeIndex},
Config, HashingOf,
};
#[cfg(not(feature = "std"))]
Expand Down Expand Up @@ -60,7 +60,7 @@ where
Storage<StorageType, T, I, L>: mmr_lib::MMRStore<NodeOf<T, I, L>>,
{
mmr: mmr_lib::MMR<NodeOf<T, I, L>, Hasher<HashingOf<T, I>, L>, Storage<StorageType, T, I, L>>,
leaves: u64,
leaves: NodeIndex,
}

impl<StorageType, T, I, L> Mmr<StorageType, T, I, L>
Expand All @@ -71,7 +71,7 @@ where
Storage<StorageType, T, I, L>: mmr_lib::MMRStore<NodeOf<T, I, L>>,
{
/// Create a pointer to an existing MMR with given number of leaves.
pub fn new(leaves: u64) -> Self {
pub fn new(leaves: NodeIndex) -> Self {
let size = NodesUtils::new(leaves).size();
Self { mmr: mmr_lib::MMR::new(size, Default::default()), leaves }
}
Expand All @@ -94,7 +94,7 @@ where

/// Return the internal size of the MMR (number of nodes).
#[cfg(test)]
pub fn size(&self) -> u64 {
pub fn size(&self) -> NodeIndex {
self.mmr.mmr_size()
}
}
Expand All @@ -109,7 +109,7 @@ where
/// Push another item to the MMR.
///
/// Returns element position (index) in the MMR.
pub fn push(&mut self, leaf: L) -> Option<u64> {
pub fn push(&mut self, leaf: L) -> Option<NodeIndex> {
let position =
self.mmr.push(Node::Data(leaf)).map_err(|e| Error::Push.log_error(e)).ok()?;

Expand All @@ -120,7 +120,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<(u64, <T as Config<I>>::Hash), Error> {
pub fn finalize(self) -> Result<(NodeIndex, <T as Config<I>>::Hash), 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 All @@ -140,7 +140,7 @@ where
/// (i.e. you can't run the function in the pruned storage).
pub fn generate_proof(
&self,
leaf_index: u64,
leaf_index: NodeIndex,
) -> Result<(L, primitives::Proof<<T as Config<I>>::Hash>), Error> {
let position = mmr_lib::leaf_index_to_pos(leaf_index);
let store = <Storage<OffchainStorage, T, I, L>>::default();
Expand Down
11 changes: 6 additions & 5 deletions frame/merkle-mountain-range/src/mmr/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ use sp_std::prelude::Vec;

use crate::{
mmr::{Node, NodeOf},
primitives, Config, Nodes, NumberOfLeaves, Pallet,
primitives::{self, NodeIndex},
Config, Nodes, NumberOfLeaves, Pallet,
};

/// A marker type for runtime-specific storage implementation.
Expand Down Expand Up @@ -60,14 +61,14 @@ where
I: 'static,
L: primitives::FullLeaf + codec::Decode,
{
fn get_elem(&self, pos: u64) -> mmr_lib::Result<Option<NodeOf<T, I, L>>> {
fn get_elem(&self, pos: NodeIndex) -> mmr_lib::Result<Option<NodeOf<T, I, L>>> {
let key = Pallet::<T, I>::offchain_key(pos);
// Retrieve the element from Off-chain DB.
Ok(sp_io::offchain::local_storage_get(sp_core::offchain::StorageKind::PERSISTENT, &key)
.and_then(|v| codec::Decode::decode(&mut &*v).ok()))
}

fn append(&mut self, _: u64, _: Vec<NodeOf<T, I, L>>) -> mmr_lib::Result<()> {
fn append(&mut self, _: NodeIndex, _: Vec<NodeOf<T, I, L>>) -> mmr_lib::Result<()> {
panic!("MMR must not be altered in the off-chain context.")
}
}
Expand All @@ -78,11 +79,11 @@ where
I: 'static,
L: primitives::FullLeaf,
{
fn get_elem(&self, pos: u64) -> mmr_lib::Result<Option<NodeOf<T, I, L>>> {
fn get_elem(&self, pos: NodeIndex) -> mmr_lib::Result<Option<NodeOf<T, I, L>>> {
Ok(<Nodes<T, I>>::get(pos).map(Node::Hash))
}

fn append(&mut self, pos: u64, elems: Vec<NodeOf<T, I, L>>) -> mmr_lib::Result<()> {
fn append(&mut self, pos: NodeIndex, elems: Vec<NodeOf<T, I, L>>) -> mmr_lib::Result<()> {
let mut leaves = crate::NumberOfLeaves::<T, I>::get();
let mut size = crate::mmr::utils::NodesUtils::new(leaves).size();
if pos != size {
Expand Down
14 changes: 8 additions & 6 deletions frame/merkle-mountain-range/src/mmr/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,29 +17,31 @@

//! Merkle Mountain Range utilities.

use crate::primitives::NodeIndex;

/// MMR nodes & size -related utilities.
pub struct NodesUtils {
no_of_leaves: u64,
no_of_leaves: NodeIndex,
}

impl NodesUtils {
/// Create new instance of MMR nodes utilities for given number of leaves.
pub fn new(no_of_leaves: u64) -> Self {
pub fn new(no_of_leaves: NodeIndex) -> Self {
Self { no_of_leaves }
}

/// Calculate number of peaks in the MMR.
pub fn number_of_peaks(&self) -> u64 {
self.number_of_leaves().count_ones() as u64
pub fn number_of_peaks(&self) -> NodeIndex {
self.number_of_leaves().count_ones() as NodeIndex
}

/// Return the number of leaves in the MMR.
pub fn number_of_leaves(&self) -> u64 {
pub fn number_of_leaves(&self) -> NodeIndex {
self.no_of_leaves
}

/// Calculate the total size of MMR (number of nodes).
pub fn size(&self) -> u64 {
pub fn size(&self) -> NodeIndex {
2 * self.no_of_leaves - self.number_of_peaks()
}

Expand Down