Companion to #14183: FRAME: Allow message ID to be mutated in ProcessMessage (#7262)

* Work with new ProcessMessage ID API

* Enable new ProcessMessage API

* Formatting

* Fixes

* Bump

* cargo update -p sp-io

Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>

---------

Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
This commit is contained in:
Gavin Wood
2023-05-22 00:47:16 +01:00
committed by GitHub
parent 43ef617bb8
commit 0d3f4837e8
12 changed files with 240 additions and 213 deletions
+200 -187
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -210,6 +210,8 @@ runtime-metrics = [ "polkadot-cli/runtime-metrics" ]
pyroscope = ["polkadot-cli/pyroscope"] pyroscope = ["polkadot-cli/pyroscope"]
jemalloc-allocator = ["polkadot-node-core-pvf-worker/jemalloc-allocator", "polkadot-overseer/jemalloc-allocator"] jemalloc-allocator = ["polkadot-node-core-pvf-worker/jemalloc-allocator", "polkadot-overseer/jemalloc-allocator"]
# Configuration for building a .deb package - for use with `cargo-deb` # Configuration for building a .deb package - for use with `cargo-deb`
[package.metadata.deb] [package.metadata.deb]
name = "polkadot" name = "polkadot"
+2 -1
View File
@@ -1127,6 +1127,7 @@ impl ProcessMessage for MessageProcessor {
message: &[u8], message: &[u8],
origin: Self::Origin, origin: Self::Origin,
meter: &mut WeightMeter, meter: &mut WeightMeter,
id: &mut [u8; 32],
) -> Result<bool, ProcessMessageError> { ) -> Result<bool, ProcessMessageError> {
let para = match origin { let para = match origin {
AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para, AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para,
@@ -1135,7 +1136,7 @@ impl ProcessMessage for MessageProcessor {
Junction, Junction,
xcm_executor::XcmExecutor<xcm_config::XcmConfig>, xcm_executor::XcmExecutor<xcm_config::XcmConfig>,
RuntimeCall, RuntimeCall,
>::process_message(message, Junction::Parachain(para.into()), meter) >::process_message(message, Junction::Parachain(para.into()), meter, id)
} }
} }
+1
View File
@@ -432,6 +432,7 @@ impl ProcessMessage for TestProcessMessage {
message: &[u8], message: &[u8],
origin: AggregateMessageOrigin, origin: AggregateMessageOrigin,
meter: &mut WeightMeter, meter: &mut WeightMeter,
_id: &mut [u8; 32],
) -> Result<bool, ProcessMessageError> { ) -> Result<bool, ProcessMessageError> {
let para = match origin { let para = match origin {
AggregateMessageOrigin::Ump(UmpQueueId::Para(p)) => p, AggregateMessageOrigin::Ump(UmpQueueId::Para(p)) => p,
+9 -8
View File
@@ -32,7 +32,8 @@ use frame_support::{
}; };
use primitives::v4::{well_known_keys, Id as ParaId, UpwardMessage}; use primitives::v4::{well_known_keys, Id as ParaId, UpwardMessage};
use sp_core::twox_64; use sp_core::twox_64;
use sp_runtime::traits::{Bounded, Hash}; use sp_io::hashing::blake2_256;
use sp_runtime::traits::Bounded;
use sp_std::prelude::*; use sp_std::prelude::*;
pub(super) struct GenesisConfigBuilder { pub(super) struct GenesisConfigBuilder {
@@ -516,27 +517,27 @@ fn overweight_queue_works() {
queue_upward_msg(para_a, a_msg_3.clone()); queue_upward_msg(para_a, a_msg_3.clone());
MessageQueue::service_queues(Weight::from_parts(500, 500)); MessageQueue::service_queues(Weight::from_parts(500, 500));
let hash_1 = <<Test as frame_system::Config>::Hashing as Hash>::hash(&a_msg_1[..]); let hash_1 = blake2_256(&a_msg_1[..]);
let hash_2 = <<Test as frame_system::Config>::Hashing as Hash>::hash(&a_msg_2[..]); let hash_2 = blake2_256(&a_msg_2[..]);
let hash_3 = <<Test as frame_system::Config>::Hashing as Hash>::hash(&a_msg_3[..]); let hash_3 = blake2_256(&a_msg_3[..]);
assert_last_events( assert_last_events(
[ [
pallet_message_queue::Event::<Test>::Processed { pallet_message_queue::Event::<Test>::Processed {
hash: hash_1.clone(), id: hash_1.clone(),
origin: Ump(UmpQueueId::Para(para_a)), origin: Ump(UmpQueueId::Para(para_a)),
weight_used: Weight::from_parts(301, 301), weight_used: Weight::from_parts(301, 301),
success: true, success: true,
} }
.into(), .into(),
pallet_message_queue::Event::<Test>::OverweightEnqueued { pallet_message_queue::Event::<Test>::OverweightEnqueued {
hash: hash_2.clone(), id: hash_2.clone(),
origin: Ump(UmpQueueId::Para(para_a)), origin: Ump(UmpQueueId::Para(para_a)),
page_index: 0, page_index: 0,
message_index: 1, message_index: 1,
} }
.into(), .into(),
pallet_message_queue::Event::<Test>::OverweightEnqueued { pallet_message_queue::Event::<Test>::OverweightEnqueued {
hash: hash_3.clone(), id: hash_3.clone(),
origin: Ump(UmpQueueId::Para(para_a)), origin: Ump(UmpQueueId::Para(para_a)),
page_index: 0, page_index: 0,
message_index: 2, message_index: 2,
@@ -564,7 +565,7 @@ fn overweight_queue_works() {
)); ));
assert_last_event( assert_last_event(
pallet_message_queue::Event::<Test>::Processed { pallet_message_queue::Event::<Test>::Processed {
hash: hash_3, id: hash_3,
origin: Ump(UmpQueueId::Para(para_a)), origin: Ump(UmpQueueId::Para(para_a)),
weight_used: Weight::from_parts(501, 501), weight_used: Weight::from_parts(501, 501),
success: true, success: true,
+2 -1
View File
@@ -1137,6 +1137,7 @@ impl ProcessMessage for MessageProcessor {
message: &[u8], message: &[u8],
origin: Self::Origin, origin: Self::Origin,
meter: &mut WeightMeter, meter: &mut WeightMeter,
id: &mut [u8; 32],
) -> Result<bool, ProcessMessageError> { ) -> Result<bool, ProcessMessageError> {
let para = match origin { let para = match origin {
AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para, AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para,
@@ -1145,7 +1146,7 @@ impl ProcessMessage for MessageProcessor {
Junction, Junction,
xcm_executor::XcmExecutor<xcm_config::XcmConfig>, xcm_executor::XcmExecutor<xcm_config::XcmConfig>,
RuntimeCall, RuntimeCall,
>::process_message(message, Junction::Parachain(para.into()), meter) >::process_message(message, Junction::Parachain(para.into()), meter, id)
} }
} }
+2 -1
View File
@@ -1064,6 +1064,7 @@ impl ProcessMessage for MessageProcessor {
message: &[u8], message: &[u8],
origin: Self::Origin, origin: Self::Origin,
meter: &mut WeightMeter, meter: &mut WeightMeter,
id: &mut [u8; 32],
) -> Result<bool, ProcessMessageError> { ) -> Result<bool, ProcessMessageError> {
let para = match origin { let para = match origin {
AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para, AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para,
@@ -1072,7 +1073,7 @@ impl ProcessMessage for MessageProcessor {
Junction, Junction,
xcm_executor::XcmExecutor<xcm_config::XcmConfig>, xcm_executor::XcmExecutor<xcm_config::XcmConfig>,
RuntimeCall, RuntimeCall,
>::process_message(message, Junction::Parachain(para.into()), meter) >::process_message(message, Junction::Parachain(para.into()), meter, id)
} }
} }
+2 -1
View File
@@ -937,6 +937,7 @@ impl ProcessMessage for MessageProcessor {
message: &[u8], message: &[u8],
origin: Self::Origin, origin: Self::Origin,
meter: &mut WeightMeter, meter: &mut WeightMeter,
id: &mut [u8; 32],
) -> Result<bool, ProcessMessageError> { ) -> Result<bool, ProcessMessageError> {
let para = match origin { let para = match origin {
AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para, AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para,
@@ -945,7 +946,7 @@ impl ProcessMessage for MessageProcessor {
Junction, Junction,
xcm_executor::XcmExecutor<xcm_config::XcmConfig>, xcm_executor::XcmExecutor<xcm_config::XcmConfig>,
RuntimeCall, RuntimeCall,
>::process_message(message, Junction::Parachain(para.into()), meter) >::process_message(message, Junction::Parachain(para.into()), meter, id)
} }
} }
@@ -22,7 +22,6 @@ use frame_support::{
}; };
use parity_scale_codec::{Decode, FullCodec, MaxEncodedLen}; use parity_scale_codec::{Decode, FullCodec, MaxEncodedLen};
use scale_info::TypeInfo; use scale_info::TypeInfo;
use sp_io::hashing::blake2_256;
use sp_std::{fmt::Debug, marker::PhantomData}; use sp_std::{fmt::Debug, marker::PhantomData};
use sp_weights::{Weight, WeightMeter}; use sp_weights::{Weight, WeightMeter};
use xcm::prelude::*; use xcm::prelude::*;
@@ -44,8 +43,8 @@ impl<
message: &[u8], message: &[u8],
origin: Self::Origin, origin: Self::Origin,
meter: &mut WeightMeter, meter: &mut WeightMeter,
id: &mut XcmHash,
) -> Result<bool, ProcessMessageError> { ) -> Result<bool, ProcessMessageError> {
let hash = blake2_256(message);
let versioned_message = VersionedXcm::<Call>::decode(&mut &message[..]) let versioned_message = VersionedXcm::<Call>::decode(&mut &message[..])
.map_err(|_| ProcessMessageError::Corrupt)?; .map_err(|_| ProcessMessageError::Corrupt)?;
let message = Xcm::<Call>::try_from(versioned_message) let message = Xcm::<Call>::try_from(versioned_message)
@@ -54,8 +53,8 @@ impl<
let required = pre.weight_of(); let required = pre.weight_of();
ensure!(meter.can_accrue(required), ProcessMessageError::Overweight(required)); ensure!(meter.can_accrue(required), ProcessMessageError::Overweight(required));
let (consumed, result) = let (consumed, result) = match XcmExecutor::execute(origin.into(), pre, *id, Weight::zero())
match XcmExecutor::execute(origin.into(), pre, hash, Weight::zero()) { {
Outcome::Complete(w) => (w, Ok(true)), Outcome::Complete(w) => (w, Ok(true)),
Outcome::Incomplete(w, _) => (w, Ok(false)), Outcome::Incomplete(w, _) => (w, Ok(false)),
// In the error-case we assume the worst case and consume all possible weight. // In the error-case we assume the worst case and consume all possible weight.
@@ -112,8 +111,9 @@ mod tests {
// Errors if we stay below a weight limit of 1000. // Errors if we stay below a weight limit of 1000.
for i in 0..10 { for i in 0..10 {
let meter = &mut WeightMeter::from_limit((i * 10).into()); let meter = &mut WeightMeter::from_limit((i * 10).into());
let mut id = [0; 32];
assert_err!( assert_err!(
Processor::process_message(msg, ORIGIN, meter), Processor::process_message(msg, ORIGIN, meter, &mut id),
Overweight(1000.into()) Overweight(1000.into())
); );
assert_eq!(meter.consumed, 0.into()); assert_eq!(meter.consumed, 0.into());
@@ -121,7 +121,8 @@ mod tests {
// Works with a limit of 1000. // Works with a limit of 1000.
let meter = &mut WeightMeter::from_limit(1000.into()); let meter = &mut WeightMeter::from_limit(1000.into());
assert_ok!(Processor::process_message(msg, ORIGIN, meter)); let mut id = [0; 32];
assert_ok!(Processor::process_message(msg, ORIGIN, meter, &mut id));
assert_eq!(meter.consumed, 1000.into()); assert_eq!(meter.consumed, 1000.into());
} }
} }
@@ -149,6 +150,6 @@ mod tests {
} }
fn process_raw(raw: &[u8]) -> Result<bool, ProcessMessageError> { fn process_raw(raw: &[u8]) -> Result<bool, ProcessMessageError> {
Processor::process_message(raw, ORIGIN, &mut WeightMeter::max_limit()) Processor::process_message(raw, ORIGIN, &mut WeightMeter::max_limit(), &mut [0; 32])
} }
} }
@@ -257,6 +257,7 @@ impl ProcessMessage for MessageProcessor {
message: &[u8], message: &[u8],
origin: Self::Origin, origin: Self::Origin,
meter: &mut WeightMeter, meter: &mut WeightMeter,
id: &mut [u8; 32],
) -> Result<bool, ProcessMessageError> { ) -> Result<bool, ProcessMessageError> {
let para = match origin { let para = match origin {
AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para, AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para,
@@ -265,7 +266,7 @@ impl ProcessMessage for MessageProcessor {
Junction, Junction,
xcm_executor::XcmExecutor<XcmConfig>, xcm_executor::XcmExecutor<XcmConfig>,
RuntimeCall, RuntimeCall,
>::process_message(message, Junction::Parachain(para.into()), meter) >::process_message(message, Junction::Parachain(para.into()), meter, id)
} }
} }
@@ -221,6 +221,7 @@ impl ProcessMessage for MessageProcessor {
message: &[u8], message: &[u8],
origin: Self::Origin, origin: Self::Origin,
meter: &mut WeightMeter, meter: &mut WeightMeter,
id: &mut [u8; 32],
) -> Result<bool, ProcessMessageError> { ) -> Result<bool, ProcessMessageError> {
let para = match origin { let para = match origin {
AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para, AggregateMessageOrigin::Ump(UmpQueueId::Para(para)) => para,
@@ -229,7 +230,7 @@ impl ProcessMessage for MessageProcessor {
Junction, Junction,
xcm_executor::XcmExecutor<XcmConfig>, xcm_executor::XcmExecutor<XcmConfig>,
RuntimeCall, RuntimeCall,
>::process_message(message, Junction::Parachain(para.into()), meter) >::process_message(message, Junction::Parachain(para.into()), meter, id)
} }
} }
+3
View File
@@ -123,6 +123,7 @@ macro_rules! decl_test_relay_chain {
msg: &[u8], msg: &[u8],
para: Self::Origin, para: Self::Origin,
meter: &mut $crate::WeightMeter, meter: &mut $crate::WeightMeter,
id: &mut [u8; 32],
) -> Result<bool, $crate::ProcessMessageError> { ) -> Result<bool, $crate::ProcessMessageError> {
use $crate::{Weight, AggregateMessageOrigin, UmpQueueId, ServiceQueues, EnqueueMessage}; use $crate::{Weight, AggregateMessageOrigin, UmpQueueId, ServiceQueues, EnqueueMessage};
use $mq as message_queue; use $mq as message_queue;
@@ -320,9 +321,11 @@ macro_rules! decl_test_network {
match destination.interior() { match destination.interior() {
$crate::Junctions::Here if destination.parent_count() == 1 => { $crate::Junctions::Here if destination.parent_count() == 1 => {
let encoded = $crate::encode_xcm(message, $crate::MessageKind::Ump); let encoded = $crate::encode_xcm(message, $crate::MessageKind::Ump);
let mut _id = [0; 32];
let r = <$relay_chain>::process_message( let r = <$relay_chain>::process_message(
encoded.as_slice(), para_id, encoded.as_slice(), para_id,
&mut $crate::WeightMeter::max_limit(), &mut $crate::WeightMeter::max_limit(),
&mut _id,
); );
match r { match r {
Err($crate::ProcessMessageError::Overweight(required)) => Err($crate::ProcessMessageError::Overweight(required)) =>