Skip to content

Commit 0019562

Browse files
authored
Functions to benchmark messages pallet with linked to parachain (#1817)
* functions to benchmark messages pallet with linked to parachain * unused imports * fmt
1 parent e9b0a1c commit 0019562

4 files changed

Lines changed: 186 additions & 48 deletions

File tree

bin/millau/runtime/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,7 @@ impl_runtime_apis! {
983983
let mut batches = Vec::<BenchmarkBatch>::new();
984984
let params = (&config, &whitelist);
985985

986-
use bridge_runtime_common::messages_benchmarking::{prepare_message_delivery_proof, prepare_message_proof};
986+
use bridge_runtime_common::messages_benchmarking::{prepare_message_delivery_proof_from_grandpa_chain, prepare_message_proof_from_grandpa_chain};
987987
use pallet_bridge_messages::benchmarking::{
988988
Pallet as MessagesBench,
989989
Config as MessagesConfig,
@@ -1004,15 +1004,15 @@ impl_runtime_apis! {
10041004
fn prepare_message_proof(
10051005
params: MessageProofParams,
10061006
) -> (rialto_messages::FromRialtoMessagesProof, Weight) {
1007-
prepare_message_proof::<Runtime, (), (), WithRialtoMessageBridge, bp_rialto::Header, bp_rialto::Hasher>(
1007+
prepare_message_proof_from_grandpa_chain::<Runtime, RialtoGrandpaInstance, WithRialtoMessageBridge>(
10081008
params,
10091009
)
10101010
}
10111011

10121012
fn prepare_message_delivery_proof(
10131013
params: MessageDeliveryProofParams<Self::AccountId>,
10141014
) -> rialto_messages::ToRialtoMessagesDeliveryProof {
1015-
prepare_message_delivery_proof::<Runtime, (), WithRialtoMessageBridge, bp_rialto::Header, bp_rialto::Hasher>(
1015+
prepare_message_delivery_proof_from_grandpa_chain::<Runtime, RialtoGrandpaInstance, WithRialtoMessageBridge>(
10161016
params,
10171017
)
10181018
}

bin/runtime-common/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ std = [
8282
runtime-benchmarks = [
8383
"pallet-bridge-grandpa/runtime-benchmarks",
8484
"pallet-bridge-messages/runtime-benchmarks",
85+
"pallet-bridge-parachains/runtime-benchmarks",
8586
"xcm-builder/runtime-benchmarks",
8687
]
8788
integrity-test = [

bin/runtime-common/src/messages_benchmarking.rs

Lines changed: 156 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -22,60 +22,54 @@
2222
use crate::{
2323
messages::{
2424
source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof,
25-
AccountIdOf, BalanceOf, BridgedChain, CallOf, HashOf, MessageBridge, ThisChain,
25+
AccountIdOf, BridgedChain, HashOf, HasherOf, MessageBridge, RawStorageProof, ThisChain,
2626
},
2727
messages_generation::{
2828
encode_all_messages, encode_lane_data, grow_trie, prepare_messages_storage_proof,
2929
},
3030
};
3131

3232
use bp_messages::storage_keys;
33-
use bp_runtime::{record_all_trie_keys, StorageProofSize};
33+
use bp_polkadot_core::parachains::ParaHash;
34+
use bp_runtime::{record_all_trie_keys, Chain, Parachain, StorageProofSize, UnderlyingChainOf};
3435
use codec::Encode;
35-
use frame_support::{dispatch::GetDispatchInfo, weights::Weight};
36+
use frame_support::weights::Weight;
3637
use pallet_bridge_messages::benchmarking::{MessageDeliveryProofParams, MessageProofParams};
37-
use sp_core::Hasher;
38-
use sp_runtime::traits::{Header, MaybeSerializeDeserialize, Zero};
39-
use sp_std::{fmt::Debug, prelude::*};
38+
use sp_runtime::traits::{Header, Zero};
39+
use sp_std::prelude::*;
4040
use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, Recorder, TrieMut};
4141

4242
/// Prepare proof of messages for the `receive_messages_proof` call.
4343
///
4444
/// In addition to returning valid messages proof, environment is prepared to verify this message
4545
/// proof.
46-
pub fn prepare_message_proof<R, BI, FI, B, BH, BHH>(
46+
///
47+
/// This method is intended to be used when benchmarking pallet, linked to the chain that
48+
/// uses GRANDPA finality. For parachains, please use the `prepare_message_proof_from_parachain`
49+
/// function.
50+
pub fn prepare_message_proof_from_grandpa_chain<R, FI, B>(
4751
params: MessageProofParams,
4852
) -> (FromBridgedChainMessagesProof<HashOf<BridgedChain<B>>>, Weight)
4953
where
50-
R: frame_system::Config<AccountId = AccountIdOf<ThisChain<B>>>
51-
+ pallet_bridge_grandpa::Config<FI>,
52-
R::BridgedChain: bp_runtime::Chain<Hash = HashOf<BridgedChain<B>>, Header = BH>,
53-
B: MessageBridge,
54-
BI: 'static,
54+
R: pallet_bridge_grandpa::Config<FI, BridgedChain = UnderlyingChainOf<BridgedChain<B>>>,
5555
FI: 'static,
56-
BH: Header<Hash = HashOf<BridgedChain<B>>>,
57-
BHH: Hasher<Out = HashOf<BridgedChain<B>>>,
58-
AccountIdOf<ThisChain<B>>: PartialEq + sp_std::fmt::Debug,
59-
AccountIdOf<BridgedChain<B>>: From<[u8; 32]>,
60-
BalanceOf<ThisChain<B>>: Debug + MaybeSerializeDeserialize,
61-
CallOf<ThisChain<B>>: From<frame_system::Call<R>> + GetDispatchInfo,
62-
HashOf<BridgedChain<B>>: Copy + Default,
56+
B: MessageBridge,
6357
{
64-
let message_payload = match params.size {
65-
StorageProofSize::Minimal(ref size) => vec![0u8; *size as _],
66-
_ => vec![],
67-
};
68-
69-
// finally - prepare storage proof and update environment
58+
// prepare storage proof
7059
let (state_root, storage_proof) = prepare_messages_storage_proof::<B>(
7160
params.lane,
7261
params.message_nonces.clone(),
7362
params.outbound_lane_data,
7463
params.size,
75-
message_payload,
64+
match params.size {
65+
StorageProofSize::Minimal(ref size) => vec![0u8; *size as _],
66+
_ => vec![],
67+
},
7668
encode_all_messages,
7769
encode_lane_data,
7870
);
71+
72+
// update runtime storage
7973
let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::<R, FI>(state_root);
8074

8175
(
@@ -90,47 +84,142 @@ where
9084
)
9185
}
9286

87+
/// Prepare proof of messages for the `receive_messages_proof` call.
88+
///
89+
/// In addition to returning valid messages proof, environment is prepared to verify this message
90+
/// proof.
91+
///
92+
/// This method is intended to be used when benchmarking pallet, linked to the chain that
93+
/// uses parachain finality. For GRANDPA chains, please use the
94+
/// `prepare_message_proof_from_grandpa_chain` function.
95+
pub fn prepare_message_proof_from_parachain<R, PI, B>(
96+
params: MessageProofParams,
97+
) -> (FromBridgedChainMessagesProof<HashOf<BridgedChain<B>>>, Weight)
98+
where
99+
R: pallet_bridge_parachains::Config<PI>,
100+
PI: 'static,
101+
B: MessageBridge,
102+
UnderlyingChainOf<BridgedChain<B>>: Chain<Hash = ParaHash> + Parachain,
103+
{
104+
// prepare storage proof
105+
let (state_root, storage_proof) = prepare_messages_storage_proof::<B>(
106+
params.lane,
107+
params.message_nonces.clone(),
108+
params.outbound_lane_data,
109+
params.size,
110+
match params.size {
111+
StorageProofSize::Minimal(ref size) => vec![0u8; *size as _],
112+
_ => vec![],
113+
},
114+
encode_all_messages,
115+
encode_lane_data,
116+
);
117+
118+
// update runtime storage
119+
let (_, bridged_header_hash) =
120+
insert_header_to_parachains_pallet::<R, PI, UnderlyingChainOf<BridgedChain<B>>>(state_root);
121+
122+
(
123+
FromBridgedChainMessagesProof {
124+
bridged_header_hash,
125+
storage_proof,
126+
lane: params.lane,
127+
nonces_start: *params.message_nonces.start(),
128+
nonces_end: *params.message_nonces.end(),
129+
},
130+
Weight::zero(),
131+
)
132+
}
133+
93134
/// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call.
94-
pub fn prepare_message_delivery_proof<R, FI, B, BH, BHH>(
135+
///
136+
/// This method is intended to be used when benchmarking pallet, linked to the chain that
137+
/// uses GRANDPA finality. For parachains, please use the
138+
/// `prepare_message_delivery_proof_from_parachain` function.
139+
pub fn prepare_message_delivery_proof_from_grandpa_chain<R, FI, B>(
95140
params: MessageDeliveryProofParams<AccountIdOf<ThisChain<B>>>,
96141
) -> FromBridgedChainMessagesDeliveryProof<HashOf<BridgedChain<B>>>
97142
where
98-
R: pallet_bridge_grandpa::Config<FI>,
99-
R::BridgedChain: bp_runtime::Chain<Hash = HashOf<BridgedChain<B>>, Header = BH>,
143+
R: pallet_bridge_grandpa::Config<FI, BridgedChain = UnderlyingChainOf<BridgedChain<B>>>,
100144
FI: 'static,
101145
B: MessageBridge,
102-
BH: Header<Hash = HashOf<BridgedChain<B>>>,
103-
BHH: Hasher<Out = HashOf<BridgedChain<B>>>,
104-
HashOf<BridgedChain<B>>: Copy + Default,
146+
{
147+
// prepare storage proof
148+
let lane = params.lane;
149+
let (state_root, storage_proof) = prepare_message_delivery_proof::<B>(params);
150+
151+
// update runtime storage
152+
let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::<R, FI>(state_root);
153+
154+
FromBridgedChainMessagesDeliveryProof {
155+
bridged_header_hash: bridged_header_hash.into(),
156+
storage_proof,
157+
lane,
158+
}
159+
}
160+
161+
/// Prepare proof of messages delivery for the `receive_messages_delivery_proof` call.
162+
///
163+
/// This method is intended to be used when benchmarking pallet, linked to the chain that
164+
/// uses parachain finality. For GRANDPA chains, please use the
165+
/// `prepare_message_delivery_proof_from_grandpa_chain` function.
166+
pub fn prepare_message_delivery_proof_from_parachain<R, PI, B>(
167+
params: MessageDeliveryProofParams<AccountIdOf<ThisChain<B>>>,
168+
) -> FromBridgedChainMessagesDeliveryProof<HashOf<BridgedChain<B>>>
169+
where
170+
R: pallet_bridge_parachains::Config<PI>,
171+
PI: 'static,
172+
B: MessageBridge,
173+
UnderlyingChainOf<BridgedChain<B>>: Chain<Hash = ParaHash> + Parachain,
174+
{
175+
// prepare storage proof
176+
let lane = params.lane;
177+
let (state_root, storage_proof) = prepare_message_delivery_proof::<B>(params);
178+
179+
// update runtime storage
180+
let (_, bridged_header_hash) =
181+
insert_header_to_parachains_pallet::<R, PI, UnderlyingChainOf<BridgedChain<B>>>(state_root);
182+
183+
FromBridgedChainMessagesDeliveryProof {
184+
bridged_header_hash: bridged_header_hash.into(),
185+
storage_proof,
186+
lane,
187+
}
188+
}
189+
190+
/// Prepare in-memory message delivery proof, without inserting anything to the runtime storage.
191+
fn prepare_message_delivery_proof<B>(
192+
params: MessageDeliveryProofParams<AccountIdOf<ThisChain<B>>>,
193+
) -> (HashOf<BridgedChain<B>>, RawStorageProof)
194+
where
195+
B: MessageBridge,
105196
{
106197
// prepare Bridged chain storage with inbound lane state
107198
let storage_key =
108199
storage_keys::inbound_lane_data_key(B::BRIDGED_MESSAGES_PALLET_NAME, &params.lane).0;
109200
let mut root = Default::default();
110201
let mut mdb = MemoryDB::default();
111202
{
112-
let mut trie = TrieDBMutBuilderV1::<BHH>::new(&mut mdb, &mut root).build();
203+
let mut trie =
204+
TrieDBMutBuilderV1::<HasherOf<BridgedChain<B>>>::new(&mut mdb, &mut root).build();
113205
trie.insert(&storage_key, &params.inbound_lane_data.encode())
114206
.map_err(|_| "TrieMut::insert has failed")
115207
.expect("TrieMut::insert should not fail in benchmarks");
116208
}
117209
root = grow_trie(root, &mut mdb, params.size);
118210

119211
// generate storage proof to be delivered to This chain
120-
let mut proof_recorder = Recorder::<LayoutV1<BHH>>::new();
121-
record_all_trie_keys::<LayoutV1<BHH>, _>(&mdb, &root, &mut proof_recorder)
122-
.map_err(|_| "record_all_trie_keys has failed")
123-
.expect("record_all_trie_keys should not fail in benchmarks");
212+
let mut proof_recorder = Recorder::<LayoutV1<HasherOf<BridgedChain<B>>>>::new();
213+
record_all_trie_keys::<LayoutV1<HasherOf<BridgedChain<B>>>, _>(
214+
&mdb,
215+
&root,
216+
&mut proof_recorder,
217+
)
218+
.map_err(|_| "record_all_trie_keys has failed")
219+
.expect("record_all_trie_keys should not fail in benchmarks");
124220
let storage_proof = proof_recorder.drain().into_iter().map(|n| n.data.to_vec()).collect();
125221

126-
// finally insert header with given state root to our storage
127-
let (_, bridged_header_hash) = insert_header_to_grandpa_pallet::<R, FI>(root);
128-
129-
FromBridgedChainMessagesDeliveryProof {
130-
bridged_header_hash: bridged_header_hash.into(),
131-
storage_proof,
132-
lane: params.lane,
133-
}
222+
(root, storage_proof)
134223
}
135224

136225
/// Insert header to the bridge GRANDPA pallet.
@@ -154,3 +243,25 @@ where
154243
pallet_bridge_grandpa::initialize_for_benchmarks::<R, GI>(bridged_header);
155244
(bridged_block_number, bridged_header_hash)
156245
}
246+
247+
/// Insert header to the bridge parachains pallet.
248+
pub(crate) fn insert_header_to_parachains_pallet<R, PI, PC>(
249+
state_root: bp_runtime::HashOf<PC>,
250+
) -> (bp_runtime::BlockNumberOf<PC>, bp_runtime::HashOf<PC>)
251+
where
252+
R: pallet_bridge_parachains::Config<PI>,
253+
PI: 'static,
254+
PC: Chain<Hash = ParaHash> + Parachain,
255+
{
256+
let bridged_block_number = Zero::zero();
257+
let bridged_header = bp_runtime::HeaderOf::<PC>::new(
258+
bridged_block_number,
259+
Default::default(),
260+
state_root,
261+
Default::default(),
262+
Default::default(),
263+
);
264+
let bridged_header_hash = bridged_header.hash();
265+
pallet_bridge_parachains::initialize_for_benchmarks::<R, PI, PC>(bridged_header);
266+
(bridged_block_number, bridged_header_hash)
267+
}

modules/parachains/src/lib.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ use bp_runtime::{Chain, HashOf, HeaderId, HeaderIdOf, Parachain, StorageProofErr
3333
use frame_support::dispatch::PostDispatchInfo;
3434
use sp_std::{marker::PhantomData, vec::Vec};
3535

36+
#[cfg(feature = "runtime-benchmarks")]
37+
use bp_parachains::ParaStoredHeaderDataBuilder;
38+
#[cfg(feature = "runtime-benchmarks")]
39+
use bp_runtime::HeaderOf;
40+
#[cfg(feature = "runtime-benchmarks")]
41+
use codec::Encode;
42+
3643
// Re-export in crate namespace for `construct_runtime!`.
3744
pub use pallet::*;
3845

@@ -654,6 +661,25 @@ impl<T: Config<I>, I: 'static, C: Parachain<Hash = ParaHash>> HeaderChain<C>
654661
}
655662
}
656663

664+
/// (Re)initialize pallet with given header for using it in `pallet-bridge-messages` benchmarks.
665+
#[cfg(feature = "runtime-benchmarks")]
666+
pub fn initialize_for_benchmarks<T: Config<I>, I: 'static, PC: Parachain<Hash = ParaHash>>(
667+
header: HeaderOf<PC>,
668+
) {
669+
let parachain = ParaId(PC::PARACHAIN_ID);
670+
let parachain_head = ParaHead(header.encode());
671+
let updated_head_data = T::ParaStoredHeaderDataBuilder::try_build(parachain, &parachain_head)
672+
.expect("failed to build stored parachain head in benchmarks");
673+
Pallet::<T, I>::update_parachain_head(
674+
parachain,
675+
None,
676+
0,
677+
updated_head_data,
678+
parachain_head.hash(),
679+
)
680+
.expect("failed to insert parachain head in benchmarks");
681+
}
682+
657683
#[cfg(test)]
658684
mod tests {
659685
use super::*;

0 commit comments

Comments
 (0)