mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-14 16:51:03 +00:00
Fix benchmark with new XCM::V3 MAX_INSTRUCTIONS_TO_DECODE (#2514)
* Fix benchmark with new XCM::V3 MAX_INSTRUCTIONS_TO_DECODE * Small refactor * `ClearOrigin` replaced by ExpectPallet * Doc * Spellcheck * Fixes and pr reviews
This commit is contained in:
committed by
Bastian Köcher
parent
9216b781fd
commit
98ee19cb7d
@@ -1036,6 +1036,7 @@ impl_runtime_apis! {
|
|||||||
];
|
];
|
||||||
|
|
||||||
use bridge_runtime_common::messages_benchmarking::{
|
use bridge_runtime_common::messages_benchmarking::{
|
||||||
|
generate_xcm_builder_bridge_message_sample,
|
||||||
prepare_message_delivery_proof_from_grandpa_chain,
|
prepare_message_delivery_proof_from_grandpa_chain,
|
||||||
prepare_message_delivery_proof_from_parachain,
|
prepare_message_delivery_proof_from_parachain,
|
||||||
prepare_message_proof_from_grandpa_chain,
|
prepare_message_proof_from_grandpa_chain,
|
||||||
@@ -1070,7 +1071,7 @@ impl_runtime_apis! {
|
|||||||
Runtime,
|
Runtime,
|
||||||
WithRialtoParachainsInstance,
|
WithRialtoParachainsInstance,
|
||||||
WithRialtoParachainMessageBridge,
|
WithRialtoParachainMessageBridge,
|
||||||
>(params, xcm::v3::Junctions::Here)
|
>(params, generate_xcm_builder_bridge_message_sample(xcm::v3::Junctions::Here))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare_message_delivery_proof(
|
fn prepare_message_delivery_proof(
|
||||||
@@ -1101,7 +1102,7 @@ impl_runtime_apis! {
|
|||||||
Runtime,
|
Runtime,
|
||||||
RialtoGrandpaInstance,
|
RialtoGrandpaInstance,
|
||||||
WithRialtoMessageBridge,
|
WithRialtoMessageBridge,
|
||||||
>(params, xcm::v3::Junctions::Here)
|
>(params, generate_xcm_builder_bridge_message_sample(xcm::v3::Junctions::Here))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare_message_delivery_proof(
|
fn prepare_message_delivery_proof(
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use bp_messages::storage_keys;
|
use bp_messages::{storage_keys, MessagePayload};
|
||||||
use bp_polkadot_core::parachains::ParaHash;
|
use bp_polkadot_core::parachains::ParaHash;
|
||||||
use bp_runtime::{
|
use bp_runtime::{
|
||||||
record_all_trie_keys, Chain, Parachain, RawStorageProof, StorageProofSize, UnderlyingChainOf,
|
record_all_trie_keys, Chain, Parachain, RawStorageProof, StorageProofSize, UnderlyingChainOf,
|
||||||
@@ -45,8 +45,8 @@ use xcm::v3::prelude::*;
|
|||||||
/// Prepare inbound bridge message according to given message proof parameters.
|
/// Prepare inbound bridge message according to given message proof parameters.
|
||||||
fn prepare_inbound_message(
|
fn prepare_inbound_message(
|
||||||
params: &MessageProofParams,
|
params: &MessageProofParams,
|
||||||
destination: InteriorMultiLocation,
|
successful_dispatch_message_generator: impl Fn(usize) -> MessagePayload,
|
||||||
) -> Vec<u8> {
|
) -> MessagePayload {
|
||||||
// we only care about **this** message size when message proof needs to be `Minimal`
|
// we only care about **this** message size when message proof needs to be `Minimal`
|
||||||
let expected_size = match params.size {
|
let expected_size = match params.size {
|
||||||
StorageProofSize::Minimal(size) => size as usize,
|
StorageProofSize::Minimal(size) => size as usize,
|
||||||
@@ -58,20 +58,15 @@ fn prepare_inbound_message(
|
|||||||
return vec![0u8; expected_size]
|
return vec![0u8; expected_size]
|
||||||
}
|
}
|
||||||
|
|
||||||
// else let's prepare successful message. For XCM bridge hubs, it is the message that
|
// else let's prepare successful message.
|
||||||
// will be pushed further to some XCM queue (XCMP/UMP)
|
let msg = successful_dispatch_message_generator(expected_size);
|
||||||
let location = xcm::VersionedInteriorMultiLocation::V3(destination);
|
assert!(
|
||||||
let location_encoded_size = location.encoded_size();
|
msg.len() >= expected_size,
|
||||||
|
"msg.len(): {} does not match expected_size: {}",
|
||||||
// we don't need to be super-precise with `expected_size` here
|
expected_size,
|
||||||
let xcm_size = expected_size.saturating_sub(location_encoded_size);
|
msg.len()
|
||||||
let xcm = xcm::VersionedXcm::<()>::V3(vec![Instruction::ClearOrigin; xcm_size].into());
|
);
|
||||||
|
msg
|
||||||
// this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor
|
|
||||||
// or public fields, so just tuple
|
|
||||||
// (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed
|
|
||||||
// to the storage)
|
|
||||||
(location, xcm).encode().encode()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Prepare proof of messages for the `receive_messages_proof` call.
|
/// Prepare proof of messages for the `receive_messages_proof` call.
|
||||||
@@ -84,7 +79,7 @@ fn prepare_inbound_message(
|
|||||||
/// function.
|
/// function.
|
||||||
pub fn prepare_message_proof_from_grandpa_chain<R, FI, B>(
|
pub fn prepare_message_proof_from_grandpa_chain<R, FI, B>(
|
||||||
params: MessageProofParams,
|
params: MessageProofParams,
|
||||||
message_destination: InteriorMultiLocation,
|
message_generator: impl Fn(usize) -> MessagePayload,
|
||||||
) -> (FromBridgedChainMessagesProof<HashOf<BridgedChain<B>>>, Weight)
|
) -> (FromBridgedChainMessagesProof<HashOf<BridgedChain<B>>>, Weight)
|
||||||
where
|
where
|
||||||
R: pallet_bridge_grandpa::Config<FI, BridgedChain = UnderlyingChainOf<BridgedChain<B>>>,
|
R: pallet_bridge_grandpa::Config<FI, BridgedChain = UnderlyingChainOf<BridgedChain<B>>>,
|
||||||
@@ -97,7 +92,7 @@ where
|
|||||||
params.message_nonces.clone(),
|
params.message_nonces.clone(),
|
||||||
params.outbound_lane_data.clone(),
|
params.outbound_lane_data.clone(),
|
||||||
params.size,
|
params.size,
|
||||||
prepare_inbound_message(¶ms, message_destination),
|
prepare_inbound_message(¶ms, message_generator),
|
||||||
encode_all_messages,
|
encode_all_messages,
|
||||||
encode_lane_data,
|
encode_lane_data,
|
||||||
);
|
);
|
||||||
@@ -127,7 +122,7 @@ where
|
|||||||
/// `prepare_message_proof_from_grandpa_chain` function.
|
/// `prepare_message_proof_from_grandpa_chain` function.
|
||||||
pub fn prepare_message_proof_from_parachain<R, PI, B>(
|
pub fn prepare_message_proof_from_parachain<R, PI, B>(
|
||||||
params: MessageProofParams,
|
params: MessageProofParams,
|
||||||
message_destination: InteriorMultiLocation,
|
message_generator: impl Fn(usize) -> MessagePayload,
|
||||||
) -> (FromBridgedChainMessagesProof<HashOf<BridgedChain<B>>>, Weight)
|
) -> (FromBridgedChainMessagesProof<HashOf<BridgedChain<B>>>, Weight)
|
||||||
where
|
where
|
||||||
R: pallet_bridge_parachains::Config<PI>,
|
R: pallet_bridge_parachains::Config<PI>,
|
||||||
@@ -141,7 +136,7 @@ where
|
|||||||
params.message_nonces.clone(),
|
params.message_nonces.clone(),
|
||||||
params.outbound_lane_data.clone(),
|
params.outbound_lane_data.clone(),
|
||||||
params.size,
|
params.size,
|
||||||
prepare_inbound_message(¶ms, message_destination),
|
prepare_inbound_message(¶ms, message_generator),
|
||||||
encode_all_messages,
|
encode_all_messages,
|
||||||
encode_lane_data,
|
encode_lane_data,
|
||||||
);
|
);
|
||||||
@@ -291,3 +286,53 @@ where
|
|||||||
pallet_bridge_parachains::initialize_for_benchmarks::<R, PI, PC>(bridged_header);
|
pallet_bridge_parachains::initialize_for_benchmarks::<R, PI, PC>(bridged_header);
|
||||||
(bridged_block_number, bridged_header_hash)
|
(bridged_block_number, bridged_header_hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns callback which generates `BridgeMessage` from Polkadot XCM builder based on
|
||||||
|
/// `expected_message_size` for benchmark.
|
||||||
|
pub fn generate_xcm_builder_bridge_message_sample(
|
||||||
|
destination: InteriorMultiLocation,
|
||||||
|
) -> impl Fn(usize) -> MessagePayload {
|
||||||
|
move |expected_message_size| -> MessagePayload {
|
||||||
|
// For XCM bridge hubs, it is the message that
|
||||||
|
// will be pushed further to some XCM queue (XCMP/UMP)
|
||||||
|
let location = xcm::VersionedInteriorMultiLocation::V3(destination);
|
||||||
|
let location_encoded_size = location.encoded_size();
|
||||||
|
|
||||||
|
// we don't need to be super-precise with `expected_size` here
|
||||||
|
let xcm_size = expected_message_size.saturating_sub(location_encoded_size);
|
||||||
|
let xcm_data_size = xcm_size.saturating_sub(
|
||||||
|
// minus empty instruction size
|
||||||
|
xcm::v3::Instruction::<()>::ExpectPallet {
|
||||||
|
index: 0,
|
||||||
|
name: vec![],
|
||||||
|
module_name: vec![],
|
||||||
|
crate_major: 0,
|
||||||
|
min_crate_minor: 0,
|
||||||
|
}
|
||||||
|
.encoded_size(),
|
||||||
|
);
|
||||||
|
|
||||||
|
log::trace!(
|
||||||
|
target: "runtime::bridge-benchmarks",
|
||||||
|
"generate_xcm_builder_bridge_message_sample with expected_message_size: {}, location_encoded_size: {}, xcm_size: {}, xcm_data_size: {}",
|
||||||
|
expected_message_size, location_encoded_size, xcm_size, xcm_data_size,
|
||||||
|
);
|
||||||
|
|
||||||
|
let xcm = xcm::VersionedXcm::<()>::V3(
|
||||||
|
vec![xcm::v3::Instruction::<()>::ExpectPallet {
|
||||||
|
index: 0,
|
||||||
|
name: vec![42; xcm_data_size],
|
||||||
|
module_name: vec![],
|
||||||
|
crate_major: 0,
|
||||||
|
min_crate_minor: 0,
|
||||||
|
}]
|
||||||
|
.into(),
|
||||||
|
);
|
||||||
|
|
||||||
|
// this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor
|
||||||
|
// or public fields, so just tuple
|
||||||
|
// (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed
|
||||||
|
// to the storage)
|
||||||
|
(location, xcm).encode().encode()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ pub const EXPECTED_DEFAULT_MESSAGE_LENGTH: u32 = 128;
|
|||||||
/// calls we're checking here would fit 1KB.
|
/// calls we're checking here would fit 1KB.
|
||||||
const SIGNED_EXTENSIONS_SIZE: u32 = 1024;
|
const SIGNED_EXTENSIONS_SIZE: u32 = 1024;
|
||||||
|
|
||||||
/// Number of extra bytes (excluding size of storage value itself) of storage proof, built at
|
/// Number of extra bytes (excluding size of storage value itself) of storage proof.
|
||||||
/// Rialto chain. This mostly depends on number of entries (and their density) in the storage trie.
|
/// This mostly depends on number of entries (and their density) in the storage trie.
|
||||||
/// Some reserve is reserved to account future chain growth.
|
/// Some reserve is reserved to account future chain growth.
|
||||||
pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024;
|
pub const EXTRA_STORAGE_PROOF_SIZE: u32 = 1024;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user