mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-11 23:31:07 +00:00
Added receive_single_message_proof_with_dispatch benchmark (#1990)
* added receive_single_message_proof_with_dispatch benchmark * clippy
This commit is contained in:
committed by
Bastian Köcher
parent
a75c28d5b2
commit
830afff353
@@ -40,6 +40,39 @@ use pallet_bridge_messages::benchmarking::{MessageDeliveryProofParams, MessagePr
|
||||
use sp_runtime::traits::{Header, Zero};
|
||||
use sp_std::prelude::*;
|
||||
use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut};
|
||||
use xcm::v3::prelude::*;
|
||||
|
||||
/// Prepare inbound bridge message according to given message proof parameters.
|
||||
fn prepare_inbound_message(
|
||||
params: &MessageProofParams,
|
||||
destination: InteriorMultiLocation,
|
||||
) -> Vec<u8> {
|
||||
// we only care about **this** message size when message proof needs to be `Minimal`
|
||||
let expected_size = match params.size {
|
||||
StorageProofSize::Minimal(size) => size as usize,
|
||||
_ => 0,
|
||||
};
|
||||
|
||||
// if we don't need a correct message, then we may just return some random blob
|
||||
if !params.is_successful_dispatch_expected {
|
||||
return vec![0u8; expected_size]
|
||||
}
|
||||
|
||||
// else let's prepare successful message. 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_size.saturating_sub(location_encoded_size);
|
||||
let xcm = xcm::VersionedXcm::<()>::V3(vec![Instruction::ClearOrigin; xcm_size].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()
|
||||
}
|
||||
|
||||
/// Prepare proof of messages for the `receive_messages_proof` call.
|
||||
///
|
||||
@@ -51,6 +84,7 @@ use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut};
|
||||
/// function.
|
||||
pub fn prepare_message_proof_from_grandpa_chain<R, FI, B>(
|
||||
params: MessageProofParams,
|
||||
message_destination: InteriorMultiLocation,
|
||||
) -> (FromBridgedChainMessagesProof<HashOf<BridgedChain<B>>>, Weight)
|
||||
where
|
||||
R: pallet_bridge_grandpa::Config<FI, BridgedChain = UnderlyingChainOf<BridgedChain<B>>>,
|
||||
@@ -61,12 +95,9 @@ where
|
||||
let (state_root, storage_proof) = prepare_messages_storage_proof::<B>(
|
||||
params.lane,
|
||||
params.message_nonces.clone(),
|
||||
params.outbound_lane_data,
|
||||
params.outbound_lane_data.clone(),
|
||||
params.size,
|
||||
match params.size {
|
||||
StorageProofSize::Minimal(ref size) => vec![0u8; *size as _],
|
||||
_ => vec![],
|
||||
},
|
||||
prepare_inbound_message(¶ms, message_destination),
|
||||
encode_all_messages,
|
||||
encode_lane_data,
|
||||
);
|
||||
@@ -82,7 +113,7 @@ where
|
||||
nonces_start: *params.message_nonces.start(),
|
||||
nonces_end: *params.message_nonces.end(),
|
||||
},
|
||||
Weight::zero(),
|
||||
Weight::MAX / 1000,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -96,6 +127,7 @@ where
|
||||
/// `prepare_message_proof_from_grandpa_chain` function.
|
||||
pub fn prepare_message_proof_from_parachain<R, PI, B>(
|
||||
params: MessageProofParams,
|
||||
message_destination: InteriorMultiLocation,
|
||||
) -> (FromBridgedChainMessagesProof<HashOf<BridgedChain<B>>>, Weight)
|
||||
where
|
||||
R: pallet_bridge_parachains::Config<PI>,
|
||||
@@ -107,12 +139,9 @@ where
|
||||
let (state_root, storage_proof) = prepare_messages_storage_proof::<B>(
|
||||
params.lane,
|
||||
params.message_nonces.clone(),
|
||||
params.outbound_lane_data,
|
||||
params.outbound_lane_data.clone(),
|
||||
params.size,
|
||||
match params.size {
|
||||
StorageProofSize::Minimal(ref size) => vec![0u8; *size as _],
|
||||
_ => vec![],
|
||||
},
|
||||
prepare_inbound_message(¶ms, message_destination),
|
||||
encode_all_messages,
|
||||
encode_lane_data,
|
||||
);
|
||||
@@ -129,7 +158,7 @@ where
|
||||
nonces_start: *params.message_nonces.start(),
|
||||
nonces_end: *params.message_nonces.end(),
|
||||
},
|
||||
Weight::zero(),
|
||||
Weight::MAX / 1000,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -28,43 +28,15 @@ use bp_messages::{
|
||||
};
|
||||
use bp_runtime::{messages::MessageDispatchResult, AccountIdOf, Chain};
|
||||
use codec::{Decode, Encode};
|
||||
use frame_support::{
|
||||
dispatch::Weight, traits::Get, weights::RuntimeDbWeight, CloneNoBound, EqNoBound,
|
||||
PartialEqNoBound,
|
||||
};
|
||||
use frame_support::{dispatch::Weight, CloneNoBound, EqNoBound, PartialEqNoBound};
|
||||
use pallet_bridge_messages::WeightInfoExt as MessagesPalletWeights;
|
||||
use scale_info::TypeInfo;
|
||||
use sp_std::marker::PhantomData;
|
||||
use sp_runtime::SaturatedConversion;
|
||||
use xcm_builder::{DispatchBlob, DispatchBlobError, HaulBlob, HaulBlobError};
|
||||
|
||||
/// Plain "XCM" payload, which we transfer through bridge
|
||||
pub type XcmAsPlainPayload = sp_std::prelude::Vec<u8>;
|
||||
|
||||
// TODO: below are just rough estimations. Other things also happen there (including hashing and so
|
||||
// on). Shall we do some benchmarking??? TODO: add proof_size component here
|
||||
// https://github.com/paritytech/parity-bridges-common/issues/1986
|
||||
|
||||
/// Simple weigher for incoming XCM dispatch at **bridge hubs** to use with
|
||||
/// `XcmBlobMessageDispatch`.
|
||||
///
|
||||
/// By our design, message at bridge hub is simply pushed to some other queue. This implementation
|
||||
/// is for this case only. If your runtime performs some other actions with incoming XCM messages,
|
||||
/// you shall use your own implementation.
|
||||
///
|
||||
/// If message is redirected to the relay chain, then `ParentAsUmp` is used and it roughly does
|
||||
/// 1 db read and 1 db write (in its `send_upward_message` method).
|
||||
///
|
||||
/// If message is redirected to some sibling parachain, then `XcmpQueue` is used and
|
||||
/// it roughly does 2 db reads and 2 db writes (in its `SendXcm` implementation).
|
||||
///
|
||||
/// The difference is not that big, so let's choose maximal.
|
||||
pub struct XcmRouterWeigher<T>(PhantomData<T>);
|
||||
|
||||
impl<T: Get<RuntimeDbWeight>> Get<Weight> for XcmRouterWeigher<T> {
|
||||
fn get() -> Weight {
|
||||
T::get().reads_writes(2, 2)
|
||||
}
|
||||
}
|
||||
|
||||
/// Message dispatch result type for single message
|
||||
#[derive(CloneNoBound, EqNoBound, PartialEqNoBound, Encode, Decode, Debug, TypeInfo)]
|
||||
pub enum XcmBlobMessageDispatchResult {
|
||||
@@ -74,17 +46,13 @@ pub enum XcmBlobMessageDispatchResult {
|
||||
}
|
||||
|
||||
/// [`XcmBlobMessageDispatch`] is responsible for dispatching received messages
|
||||
pub struct XcmBlobMessageDispatch<
|
||||
SourceBridgeHubChain,
|
||||
TargetBridgeHubChain,
|
||||
DispatchBlob,
|
||||
DispatchBlobWeigher,
|
||||
> {
|
||||
pub struct XcmBlobMessageDispatch<SourceBridgeHubChain, TargetBridgeHubChain, DispatchBlob, Weights>
|
||||
{
|
||||
_marker: sp_std::marker::PhantomData<(
|
||||
SourceBridgeHubChain,
|
||||
TargetBridgeHubChain,
|
||||
DispatchBlob,
|
||||
DispatchBlobWeigher,
|
||||
Weights,
|
||||
)>,
|
||||
}
|
||||
|
||||
@@ -92,20 +60,21 @@ impl<
|
||||
SourceBridgeHubChain: Chain,
|
||||
TargetBridgeHubChain: Chain,
|
||||
BlobDispatcher: DispatchBlob,
|
||||
DispatchBlobWeigher: Get<Weight>,
|
||||
Weights: MessagesPalletWeights,
|
||||
> MessageDispatch<AccountIdOf<SourceBridgeHubChain>>
|
||||
for XcmBlobMessageDispatch<
|
||||
SourceBridgeHubChain,
|
||||
TargetBridgeHubChain,
|
||||
BlobDispatcher,
|
||||
DispatchBlobWeigher,
|
||||
>
|
||||
for XcmBlobMessageDispatch<SourceBridgeHubChain, TargetBridgeHubChain, BlobDispatcher, Weights>
|
||||
{
|
||||
type DispatchPayload = XcmAsPlainPayload;
|
||||
type DispatchLevelResult = XcmBlobMessageDispatchResult;
|
||||
|
||||
fn dispatch_weight(_message: &mut DispatchMessage<Self::DispatchPayload>) -> Weight {
|
||||
DispatchBlobWeigher::get()
|
||||
fn dispatch_weight(message: &mut DispatchMessage<Self::DispatchPayload>) -> Weight {
|
||||
match message.data.payload {
|
||||
Ok(ref payload) => {
|
||||
let payload_size = payload.encoded_size().saturated_into();
|
||||
Weights::message_dispatch_weight(payload_size)
|
||||
},
|
||||
Err(_) => Weight::zero(),
|
||||
}
|
||||
}
|
||||
|
||||
fn dispatch(
|
||||
@@ -122,7 +91,6 @@ impl<
|
||||
message.key.nonce
|
||||
);
|
||||
return MessageDispatchResult {
|
||||
// TODO:check-parameter - setup uspent_weight? https://github.com/paritytech/polkadot/issues/6629
|
||||
unspent_weight: Weight::zero(),
|
||||
dispatch_level_result: XcmBlobMessageDispatchResult::InvalidPayload,
|
||||
}
|
||||
@@ -158,11 +126,7 @@ impl<
|
||||
XcmBlobMessageDispatchResult::NotDispatched(e)
|
||||
},
|
||||
};
|
||||
MessageDispatchResult {
|
||||
// TODO:check-parameter - setup uspent_weight? https://github.com/paritytech/polkadot/issues/6629
|
||||
unspent_weight: Weight::zero(),
|
||||
dispatch_level_result,
|
||||
}
|
||||
MessageDispatchResult { unspent_weight: Weight::zero(), dispatch_level_result }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user