Skip to content

Commit 9163e46

Browse files
authored
xcm: Improve debuggability (#2799)
Adds more logging to the XCM execution for better debugging.
1 parent df0f61a commit 9163e46

File tree

5 files changed

+279
-178
lines changed

5 files changed

+279
-178
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ license.workspace = true
1010
workspace = true
1111

1212
[dependencies]
13+
array-bytes = "6.1"
1314
bounded-collections = { version = "0.1.9", default-features = false, features = ["serde"] }
1415
derivative = { version = "2.2.0", default-features = false, features = ["use_core"] }
1516
impl-trait-for-tuples = "0.2.2"

src/double_encoded.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl<T> Eq for DoubleEncoded<T> {}
4747

4848
impl<T> core::fmt::Debug for DoubleEncoded<T> {
4949
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
50-
self.encoded.fmt(f)
50+
array_bytes::bytes2hex("0x", &self.encoded).fmt(f)
5151
}
5252
}
5353

xcm-builder/src/process_xcm_message.rs

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,15 @@
1616

1717
//! Implementation of `ProcessMessage` for an `ExecuteXcm` implementation.
1818
19-
use frame_support::{
20-
ensure,
21-
traits::{ProcessMessage, ProcessMessageError},
22-
};
19+
use frame_support::traits::{ProcessMessage, ProcessMessageError};
2320
use parity_scale_codec::{Decode, FullCodec, MaxEncodedLen};
2421
use scale_info::TypeInfo;
2522
use sp_std::{fmt::Debug, marker::PhantomData};
2623
use sp_weights::{Weight, WeightMeter};
2724
use xcm::prelude::*;
2825

26+
const LOG_TARGET: &str = "xcm::process-message";
27+
2928
/// A message processor that delegates execution to an `XcmExecutor`.
3029
pub struct ProcessXcmMessage<MessageOrigin, XcmExecutor, Call>(
3130
PhantomData<(MessageOrigin, XcmExecutor, Call)>,
@@ -45,21 +44,68 @@ impl<
4544
meter: &mut WeightMeter,
4645
id: &mut XcmHash,
4746
) -> Result<bool, ProcessMessageError> {
48-
let versioned_message = VersionedXcm::<Call>::decode(&mut &message[..])
49-
.map_err(|_| ProcessMessageError::Corrupt)?;
50-
let message = Xcm::<Call>::try_from(versioned_message)
51-
.map_err(|_| ProcessMessageError::Unsupported)?;
52-
let pre = XcmExecutor::prepare(message).map_err(|_| ProcessMessageError::Unsupported)?;
47+
let versioned_message = VersionedXcm::<Call>::decode(&mut &message[..]).map_err(|e| {
48+
log::trace!(
49+
target: LOG_TARGET,
50+
"`VersionedXcm` failed to decode: {e:?}",
51+
);
52+
53+
ProcessMessageError::Corrupt
54+
})?;
55+
let message = Xcm::<Call>::try_from(versioned_message).map_err(|_| {
56+
log::trace!(
57+
target: LOG_TARGET,
58+
"Failed to convert `VersionedXcm` into `XcmV3`.",
59+
);
60+
61+
ProcessMessageError::Unsupported
62+
})?;
63+
let pre = XcmExecutor::prepare(message).map_err(|_| {
64+
log::trace!(
65+
target: LOG_TARGET,
66+
"Failed to prepare message.",
67+
);
68+
69+
ProcessMessageError::Unsupported
70+
})?;
5371
// The worst-case weight:
5472
let required = pre.weight_of();
55-
ensure!(meter.can_consume(required), ProcessMessageError::Overweight(required));
73+
if !meter.can_consume(required) {
74+
log::trace!(
75+
target: LOG_TARGET,
76+
"Xcm required {required} more than remaining {}",
77+
meter.remaining(),
78+
);
79+
80+
return Err(ProcessMessageError::Overweight(required))
81+
}
5682

5783
let (consumed, result) = match XcmExecutor::execute(origin.into(), pre, id, Weight::zero())
5884
{
59-
Outcome::Complete(w) => (w, Ok(true)),
60-
Outcome::Incomplete(w, _) => (w, Ok(false)),
85+
Outcome::Complete(w) => {
86+
log::trace!(
87+
target: LOG_TARGET,
88+
"XCM message execution complete, used weight: {w}",
89+
);
90+
(w, Ok(true))
91+
},
92+
Outcome::Incomplete(w, e) => {
93+
log::trace!(
94+
target: LOG_TARGET,
95+
"XCM message execution incomplete, used weight: {w}, error: {e:?}",
96+
);
97+
98+
(w, Ok(false))
99+
},
61100
// In the error-case we assume the worst case and consume all possible weight.
62-
Outcome::Error(_) => (required, Err(ProcessMessageError::Unsupported)),
101+
Outcome::Error(e) => {
102+
log::trace!(
103+
target: LOG_TARGET,
104+
"XCM message execution error: {e:?}",
105+
);
106+
107+
(required, Err(ProcessMessageError::Unsupported))
108+
},
63109
};
64110
meter.consume(consumed);
65111
result

xcm-builder/src/tests/mock.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ pub use xcm_executor::{
4848
Assets, Config,
4949
};
5050

51+
#[derive(Debug)]
5152
pub enum TestOrigin {
5253
Root,
5354
Relay,

0 commit comments

Comments
 (0)