From 2fb5e4c746de44ca481d7383da1ce0743582cbfa Mon Sep 17 00:00:00 2001 From: vedhavyas Date: Thu, 11 Apr 2024 16:00:20 +0530 Subject: [PATCH 1/3] define block hash provider and default impl using frame_system --- polkadot/runtime/rococo/src/lib.rs | 1 + polkadot/runtime/westend/src/lib.rs | 1 + substrate/bin/node/runtime/src/lib.rs | 1 + .../frame/merkle-mountain-range/src/lib.rs | 19 +++++++++++++++++++ .../merkle-mountain-range/src/mmr/storage.rs | 4 ++-- .../frame/merkle-mountain-range/src/mock.rs | 1 + 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 894d7fac2f0a4..2e84014691092 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -1190,6 +1190,7 @@ impl pallet_mmr::Config for Runtime { type OnNewRoot = pallet_beefy_mmr::DepositBeefyDigest; type WeightInfo = (); type LeafData = pallet_beefy_mmr::Pallet; + type BlockHashProvider = pallet_mmr::DefaultBlockHashProvider; } parameter_types! { diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 4930610c1d80a..3f59b89263c86 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -333,6 +333,7 @@ impl pallet_mmr::Config for Runtime { type OnNewRoot = pallet_beefy_mmr::DepositBeefyDigest; type WeightInfo = (); type LeafData = pallet_beefy_mmr::Pallet; + type BlockHashProvider = pallet_mmr::DefaultBlockHashProvider; } /// MMR helper types. diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 65d3ba0ed6eea..e3e4ae107718f 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1602,6 +1602,7 @@ impl pallet_mmr::Config for Runtime { type Hashing = Keccak256; type LeafData = pallet_mmr::ParentNumberAndHash; type OnNewRoot = pallet_beefy_mmr::DepositBeefyDigest; + type BlockHashProvider = pallet_mmr::DefaultBlockHashProvider; type WeightInfo = (); } diff --git a/substrate/frame/merkle-mountain-range/src/lib.rs b/substrate/frame/merkle-mountain-range/src/lib.rs index 7b6edb37b7f7b..7d3e2f826cbbb 100644 --- a/substrate/frame/merkle-mountain-range/src/lib.rs +++ b/substrate/frame/merkle-mountain-range/src/lib.rs @@ -103,6 +103,22 @@ impl LeafDataProvider for ParentNumberAndHash { } } +/// Block hash provider for a given block number. +pub trait BlockHashProvider{ + fn block_hash_for(block_number: BlockNumber) -> BlockHash; +} + +/// Default implementation of BlockHashProvider using frame_system. +pub struct DefaultBlockHashProvider{ + _phantom: sp_std::marker::PhantomData, +} + +impl BlockHashProvider, T::Hash> for DefaultBlockHashProvider { + fn block_hash_for(block_number: BlockNumberFor) -> T::Hash { + frame_system::Pallet::::block_hash(block_number) + } +} + pub trait WeightInfo { fn on_initialize(peaks: NodeIndex) -> Weight; } @@ -177,6 +193,9 @@ pub mod pallet { /// Clients. Hook complexity should be `O(1)`. type OnNewRoot: primitives::OnNewRoot>; + /// Block hash provider for a given block number. + type BlockHashProvider: BlockHashProvider, ::Hash>; + /// Weights for this pallet. type WeightInfo: WeightInfo; } diff --git a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs index 96a20c3445eed..26b584fa293ff 100644 --- a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs +++ b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs @@ -29,7 +29,7 @@ use sp_std::prelude::*; use crate::{ mmr::{Node, NodeOf}, primitives::{self, NodeIndex}, - Config, Nodes, NumberOfLeaves, Pallet, + Config, Nodes, NumberOfLeaves, Pallet, BlockHashProvider }; /// A marker type for runtime-specific storage implementation. @@ -87,7 +87,7 @@ where // Fall through to searching node using fork-specific key. let ancestor_parent_block_num = Pallet::::leaf_index_to_parent_block_num(ancestor_leaf_idx, leaves); - let ancestor_parent_hash = >::block_hash(ancestor_parent_block_num); + let ancestor_parent_hash = T::BlockHashProvider::block_hash_for(ancestor_parent_block_num); let temp_key = Pallet::::node_temp_offchain_key(pos, ancestor_parent_hash); debug!( target: "runtime::mmr::offchain", diff --git a/substrate/frame/merkle-mountain-range/src/mock.rs b/substrate/frame/merkle-mountain-range/src/mock.rs index 212012a052a02..8318b20e83074 100644 --- a/substrate/frame/merkle-mountain-range/src/mock.rs +++ b/substrate/frame/merkle-mountain-range/src/mock.rs @@ -44,6 +44,7 @@ impl Config for Test { type Hashing = Keccak256; type LeafData = Compact, LeafData)>; type OnNewRoot = (); + type BlockHashProvider = DefaultBlockHashProvider; type WeightInfo = (); } From bb88cde12d1b9c3a617e835a1133b30edb941fad Mon Sep 17 00:00:00 2001 From: vedhavyas Date: Thu, 11 Apr 2024 16:41:01 +0530 Subject: [PATCH 2/3] update pallet_mmr config in beefy mock and cargo fmt --- substrate/frame/beefy-mmr/src/mock.rs | 2 ++ substrate/frame/merkle-mountain-range/src/lib.rs | 13 +++++++++---- .../frame/merkle-mountain-range/src/mmr/storage.rs | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/substrate/frame/beefy-mmr/src/mock.rs b/substrate/frame/beefy-mmr/src/mock.rs index 9d1ece7a1d8ec..d59c219d3e71e 100644 --- a/substrate/frame/beefy-mmr/src/mock.rs +++ b/substrate/frame/beefy-mmr/src/mock.rs @@ -90,6 +90,8 @@ impl pallet_mmr::Config for Test { type OnNewRoot = pallet_beefy_mmr::DepositBeefyDigest; + type BlockHashProvider = pallet_mmr::DefaultBlockHashProvider; + type WeightInfo = (); } diff --git a/substrate/frame/merkle-mountain-range/src/lib.rs b/substrate/frame/merkle-mountain-range/src/lib.rs index 7d3e2f826cbbb..0493cfc23636a 100644 --- a/substrate/frame/merkle-mountain-range/src/lib.rs +++ b/substrate/frame/merkle-mountain-range/src/lib.rs @@ -104,16 +104,18 @@ impl LeafDataProvider for ParentNumberAndHash { } /// Block hash provider for a given block number. -pub trait BlockHashProvider{ +pub trait BlockHashProvider { fn block_hash_for(block_number: BlockNumber) -> BlockHash; } /// Default implementation of BlockHashProvider using frame_system. -pub struct DefaultBlockHashProvider{ +pub struct DefaultBlockHashProvider { _phantom: sp_std::marker::PhantomData, } -impl BlockHashProvider, T::Hash> for DefaultBlockHashProvider { +impl BlockHashProvider, T::Hash> + for DefaultBlockHashProvider +{ fn block_hash_for(block_number: BlockNumberFor) -> T::Hash { frame_system::Pallet::::block_hash(block_number) } @@ -194,7 +196,10 @@ pub mod pallet { type OnNewRoot: primitives::OnNewRoot>; /// Block hash provider for a given block number. - type BlockHashProvider: BlockHashProvider, ::Hash>; + type BlockHashProvider: BlockHashProvider< + BlockNumberFor, + ::Hash, + >; /// Weights for this pallet. type WeightInfo: WeightInfo; diff --git a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs index 26b584fa293ff..417352f87765a 100644 --- a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs +++ b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs @@ -29,7 +29,7 @@ use sp_std::prelude::*; use crate::{ mmr::{Node, NodeOf}, primitives::{self, NodeIndex}, - Config, Nodes, NumberOfLeaves, Pallet, BlockHashProvider + BlockHashProvider, Config, Nodes, NumberOfLeaves, Pallet, }; /// A marker type for runtime-specific storage implementation. From 1311af9fb9dc4e7c422be5e434771c36b153776c Mon Sep 17 00:00:00 2001 From: vedhavyas Date: Thu, 11 Apr 2024 17:46:52 +0530 Subject: [PATCH 3/3] rename trait func --- substrate/frame/merkle-mountain-range/src/lib.rs | 4 ++-- substrate/frame/merkle-mountain-range/src/mmr/storage.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/substrate/frame/merkle-mountain-range/src/lib.rs b/substrate/frame/merkle-mountain-range/src/lib.rs index 0493cfc23636a..e2b40974579e8 100644 --- a/substrate/frame/merkle-mountain-range/src/lib.rs +++ b/substrate/frame/merkle-mountain-range/src/lib.rs @@ -105,7 +105,7 @@ impl LeafDataProvider for ParentNumberAndHash { /// Block hash provider for a given block number. pub trait BlockHashProvider { - fn block_hash_for(block_number: BlockNumber) -> BlockHash; + fn block_hash(block_number: BlockNumber) -> BlockHash; } /// Default implementation of BlockHashProvider using frame_system. @@ -116,7 +116,7 @@ pub struct DefaultBlockHashProvider { impl BlockHashProvider, T::Hash> for DefaultBlockHashProvider { - fn block_hash_for(block_number: BlockNumberFor) -> T::Hash { + fn block_hash(block_number: BlockNumberFor) -> T::Hash { frame_system::Pallet::::block_hash(block_number) } } diff --git a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs index 417352f87765a..f2acc35a137ff 100644 --- a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs +++ b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs @@ -87,7 +87,7 @@ where // Fall through to searching node using fork-specific key. let ancestor_parent_block_num = Pallet::::leaf_index_to_parent_block_num(ancestor_leaf_idx, leaves); - let ancestor_parent_hash = T::BlockHashProvider::block_hash_for(ancestor_parent_block_num); + let ancestor_parent_hash = T::BlockHashProvider::block_hash(ancestor_parent_block_num); let temp_key = Pallet::::node_temp_offchain_key(pos, ancestor_parent_hash); debug!( target: "runtime::mmr::offchain",