Skip to content

Commit 68ba699

Browse files
authored
Reintroduce msg dispatch status reporting (#2027)
* Use an actual Result inside MessageDispatchResult We need this in order to distinguish between Ok and Err * Revert #1660 * Fixes + simplifications * Implement review suggestions
1 parent d1e852c commit 68ba699

File tree

16 files changed

+309
-131
lines changed

16 files changed

+309
-131
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bin/millau/runtime/src/xcm_config.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ mod tests {
242242
target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch},
243243
LaneId, MessageKey,
244244
};
245-
use bridge_runtime_common::messages_xcm_extension::XcmBlobMessageDispatchResult;
245+
use bridge_runtime_common::messages_xcm_extension::XcmBlobMessageDispatchError;
246246
use codec::Encode;
247247
use pallet_bridge_messages::OutboundLanes;
248248
use xcm_executor::XcmExecutor;
@@ -352,8 +352,8 @@ mod tests {
352352
let dispatch_result =
353353
FromRialtoMessageDispatch::dispatch(&AccountId::from([0u8; 32]), incoming_message);
354354
assert!(matches!(
355-
dispatch_result.dispatch_level_result,
356-
XcmBlobMessageDispatchResult::NotDispatched(_),
355+
dispatch_result.dispatch_result,
356+
Err(XcmBlobMessageDispatchError::NotDispatched(_)),
357357
));
358358
}
359359

@@ -366,8 +366,8 @@ mod tests {
366366
let dispatch_result =
367367
FromRialtoMessageDispatch::dispatch(&AccountId::from([0u8; 32]), incoming_message);
368368
assert!(matches!(
369-
dispatch_result.dispatch_level_result,
370-
XcmBlobMessageDispatchResult::NotDispatched(_),
369+
dispatch_result.dispatch_result,
370+
Err(XcmBlobMessageDispatchError::NotDispatched(_)),
371371
));
372372
}
373373
}

bin/rialto-parachain/runtime/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -853,7 +853,7 @@ mod tests {
853853
LaneId, MessageKey,
854854
};
855855
use bridge_runtime_common::{
856-
integrity::check_additional_signed, messages_xcm_extension::XcmBlobMessageDispatchResult,
856+
integrity::check_additional_signed, messages_xcm_extension::XcmBlobMessageDispatchError,
857857
};
858858
use codec::Encode;
859859
use pallet_bridge_messages::OutboundLanes;
@@ -928,8 +928,8 @@ mod tests {
928928
let dispatch_result =
929929
FromMillauMessageDispatch::dispatch(&AccountId::from([0u8; 32]), incoming_message);
930930
assert!(matches!(
931-
dispatch_result.dispatch_level_result,
932-
XcmBlobMessageDispatchResult::NotDispatched(_),
931+
dispatch_result.dispatch_result,
932+
Err(XcmBlobMessageDispatchError::NotDispatched(_)),
933933
));
934934
});
935935
}

bin/rialto/runtime/src/xcm_config.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ mod tests {
197197
target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch},
198198
LaneId, MessageKey,
199199
};
200-
use bridge_runtime_common::messages_xcm_extension::XcmBlobMessageDispatchResult;
200+
use bridge_runtime_common::messages_xcm_extension::XcmBlobMessageDispatchError;
201201
use codec::Encode;
202202
use pallet_bridge_messages::OutboundLanes;
203203
use xcm_executor::XcmExecutor;
@@ -269,8 +269,8 @@ mod tests {
269269
let dispatch_result =
270270
FromMillauMessageDispatch::dispatch(&AccountId::from([0u8; 32]), incoming_message);
271271
assert!(matches!(
272-
dispatch_result.dispatch_level_result,
273-
XcmBlobMessageDispatchResult::NotDispatched(_),
272+
dispatch_result.dispatch_result,
273+
Err(XcmBlobMessageDispatchError::NotDispatched(_)),
274274
));
275275
}
276276
}

bin/runtime-common/src/integrity.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,10 @@ pub fn check_message_lane_weights<C: Chain, T: frame_system::Config>(
307307
messages::target::maximal_incoming_message_dispatch_weight(C::max_extrinsic_weight()),
308308
);
309309

310-
let max_incoming_inbound_lane_data_proof_size =
311-
InboundLaneData::<()>::encoded_size_hint_u32(this_chain_max_unrewarded_relayers as _);
310+
let max_incoming_inbound_lane_data_proof_size = InboundLaneData::<()>::encoded_size_hint_u32(
311+
this_chain_max_unrewarded_relayers as _,
312+
this_chain_max_unconfirmed_messages as _,
313+
);
312314
pallet_bridge_messages::ensure_able_to_receive_confirmation::<Weights<T>>(
313315
C::max_extrinsic_size(),
314316
C::max_extrinsic_weight(),

bin/runtime-common/src/messages_xcm_extension.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ pub type XcmAsPlainPayload = sp_std::prelude::Vec<u8>;
3939

4040
/// Message dispatch result type for single message
4141
#[derive(CloneNoBound, EqNoBound, PartialEqNoBound, Encode, Decode, Debug, TypeInfo)]
42-
pub enum XcmBlobMessageDispatchResult {
42+
pub enum XcmBlobMessageDispatchError {
4343
InvalidPayload,
44-
Dispatched,
4544
NotDispatched(#[codec(skip)] Option<DispatchBlobError>),
4645
}
4746

@@ -65,7 +64,7 @@ impl<
6564
for XcmBlobMessageDispatch<SourceBridgeHubChain, TargetBridgeHubChain, BlobDispatcher, Weights>
6665
{
6766
type DispatchPayload = XcmAsPlainPayload;
68-
type DispatchLevelResult = XcmBlobMessageDispatchResult;
67+
type DispatchError = XcmBlobMessageDispatchError;
6968

7069
fn dispatch_weight(message: &mut DispatchMessage<Self::DispatchPayload>) -> Weight {
7170
match message.data.payload {
@@ -80,7 +79,7 @@ impl<
8079
fn dispatch(
8180
_relayer_account: &AccountIdOf<SourceBridgeHubChain>,
8281
message: DispatchMessage<Self::DispatchPayload>,
83-
) -> MessageDispatchResult<Self::DispatchLevelResult> {
82+
) -> MessageDispatchResult<Self::DispatchError> {
8483
let payload = match message.data.payload {
8584
Ok(payload) => payload,
8685
Err(e) => {
@@ -92,7 +91,7 @@ impl<
9291
);
9392
return MessageDispatchResult {
9493
unspent_weight: Weight::zero(),
95-
dispatch_level_result: XcmBlobMessageDispatchResult::InvalidPayload,
94+
dispatch_result: Err(XcmBlobMessageDispatchError::InvalidPayload),
9695
}
9796
},
9897
};
@@ -103,18 +102,21 @@ impl<
103102
"[XcmBlobMessageDispatch] DispatchBlob::dispatch_blob was ok - message_nonce: {:?}",
104103
message.key.nonce
105104
);
106-
XcmBlobMessageDispatchResult::Dispatched
105+
Ok(())
107106
},
108107
Err(e) => {
109108
log::error!(
110109
target: crate::LOG_TARGET_BRIDGE_DISPATCH,
111110
"[XcmBlobMessageDispatch] DispatchBlob::dispatch_blob failed, error: {:?} - message_nonce: {:?}",
112111
e, message.key.nonce
113112
);
114-
XcmBlobMessageDispatchResult::NotDispatched(Some(e))
113+
Err(XcmBlobMessageDispatchError::NotDispatched(Some(e)))
115114
},
116115
};
117-
MessageDispatchResult { unspent_weight: Weight::zero(), dispatch_level_result }
116+
MessageDispatchResult {
117+
unspent_weight: Weight::zero(),
118+
dispatch_result: dispatch_level_result,
119+
}
118120
}
119121
}
120122

modules/messages/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ edition = "2021"
77
license = "GPL-3.0-or-later WITH Classpath-exception-2.0"
88

99
[dependencies]
10+
bitvec = { version = "1", default-features = false, features = ["alloc"] }
1011
codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false }
1112
log = { version = "0.4.17", default-features = false }
1213
num-traits = { version = "0.2", default-features = false }

modules/messages/src/benchmarking.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ benchmarks_instance_pallet! {
301301
inbound_lane_data: InboundLaneData {
302302
relayers: vec![UnrewardedRelayer {
303303
relayer: relayer_id.clone(),
304-
messages: DeliveredMessages::new(1),
304+
messages: DeliveredMessages::new(1, true),
305305
}].into_iter().collect(),
306306
last_confirmed_nonce: 0,
307307
},
@@ -333,8 +333,8 @@ benchmarks_instance_pallet! {
333333
total_messages: 2,
334334
last_delivered_nonce: 2,
335335
};
336-
let mut delivered_messages = DeliveredMessages::new(1);
337-
delivered_messages.note_dispatched_message();
336+
let mut delivered_messages = DeliveredMessages::new(1, true);
337+
delivered_messages.note_dispatched_message(true);
338338
let proof = T::prepare_message_delivery_proof(MessageDeliveryProofParams {
339339
lane: T::bench_lane_id(),
340340
inbound_lane_data: InboundLaneData {
@@ -379,11 +379,11 @@ benchmarks_instance_pallet! {
379379
relayers: vec![
380380
UnrewardedRelayer {
381381
relayer: relayer1_id.clone(),
382-
messages: DeliveredMessages::new(1),
382+
messages: DeliveredMessages::new(1, true),
383383
},
384384
UnrewardedRelayer {
385385
relayer: relayer2_id.clone(),
386-
messages: DeliveredMessages::new(2),
386+
messages: DeliveredMessages::new(2, true),
387387
},
388388
].into_iter().collect(),
389389
last_confirmed_nonce: 0,
@@ -451,7 +451,7 @@ fn receive_messages<T: Config<I>, I: 'static>(nonce: MessageNonce) {
451451
inbound_lane_storage.set_data(InboundLaneData {
452452
relayers: vec![UnrewardedRelayer {
453453
relayer: T::bridged_relayer_id(),
454-
messages: DeliveredMessages::new(nonce),
454+
messages: DeliveredMessages::new(nonce, true),
455455
}]
456456
.into_iter()
457457
.collect(),

modules/messages/src/inbound_lane.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ impl<T: Config<I>, I: 'static> MaxEncodedLen for StoredInboundLaneData<T, I> {
101101
fn max_encoded_len() -> usize {
102102
InboundLaneData::<T::InboundRelayer>::encoded_size_hint(
103103
T::MaxUnrewardedRelayerEntriesAtInboundLane::get() as usize,
104+
T::MaxUnconfirmedMessagesAtInboundLane::get() as usize,
104105
)
105106
.unwrap_or(usize::MAX)
106107
}
@@ -154,6 +155,9 @@ impl<S: InboundLaneStorage> InboundLane<S> {
154155
// overlap.
155156
match data.relayers.front_mut() {
156157
Some(entry) if entry.messages.begin < new_confirmed_nonce => {
158+
entry.messages.dispatch_results = entry.messages.dispatch_results
159+
[(new_confirmed_nonce + 1 - entry.messages.begin) as usize..]
160+
.to_bitvec();
157161
entry.messages.begin = new_confirmed_nonce + 1;
158162
},
159163
_ => {},
@@ -170,7 +174,7 @@ impl<S: InboundLaneStorage> InboundLane<S> {
170174
relayer_at_this_chain: &AccountId,
171175
nonce: MessageNonce,
172176
message_data: DispatchMessageData<Dispatch::DispatchPayload>,
173-
) -> ReceivalResult<Dispatch::DispatchLevelResult> {
177+
) -> ReceivalResult<Dispatch::DispatchError> {
174178
let mut data = self.storage.data();
175179
let is_correct_message = nonce == data.last_delivered_nonce() + 1;
176180
if !is_correct_message {
@@ -198,19 +202,20 @@ impl<S: InboundLaneStorage> InboundLane<S> {
198202
);
199203

200204
// now let's update inbound lane storage
201-
let push_new = match data.relayers.back_mut() {
205+
match data.relayers.back_mut() {
202206
Some(entry) if entry.relayer == *relayer_at_bridged_chain => {
203-
entry.messages.note_dispatched_message();
204-
false
207+
entry.messages.note_dispatched_message(dispatch_result.dispatch_result.is_ok());
208+
},
209+
_ => {
210+
data.relayers.push_back(UnrewardedRelayer {
211+
relayer: relayer_at_bridged_chain.clone(),
212+
messages: DeliveredMessages::new(
213+
nonce,
214+
dispatch_result.dispatch_result.is_ok(),
215+
),
216+
});
205217
},
206-
_ => true,
207218
};
208-
if push_new {
209-
data.relayers.push_back(UnrewardedRelayer {
210-
relayer: (*relayer_at_bridged_chain).clone(),
211-
messages: DeliveredMessages::new(nonce),
212-
});
213-
}
214219
self.storage.set_data(data);
215220

216221
ReceivalResult::Dispatched(dispatch_result)

0 commit comments

Comments
 (0)