Skip to content

Commit d17acab

Browse files
authored
Cosmetics (paritytech#2124)
* Cosmetics * Address PR comment
1 parent f18b07e commit d17acab

4 files changed

Lines changed: 61 additions & 76 deletions

File tree

modules/messages/src/lib.rs

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ use bp_messages::{
5959
DeliveryPayments, DispatchMessage, MessageDispatch, ProvedLaneMessages, ProvedMessages,
6060
SourceHeaderChain,
6161
},
62-
total_unrewarded_messages, DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId,
63-
MessageKey, MessageNonce, MessagePayload, MessagesOperatingMode, OutboundLaneData,
64-
OutboundMessageDetails, UnrewardedRelayersState, VerificationError,
62+
DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId, MessageKey, MessageNonce,
63+
MessagePayload, MessagesOperatingMode, OutboundLaneData, OutboundMessageDetails,
64+
UnrewardedRelayersState, VerificationError,
6565
};
6666
use bp_runtime::{BasicOperatingMode, ChainId, OwnedBridgeModule, PreComputedSize, Size};
6767
use codec::{Decode, Encode, MaxEncodedLen};
@@ -437,21 +437,8 @@ pub mod pallet {
437437

438438
Error::<T, I>::InvalidMessagesDeliveryProof
439439
})?;
440-
441-
// verify that the relayer has declared correct `lane_data::relayers` state
442-
// (we only care about total number of entries and messages, because this affects call
443-
// weight)
444-
ensure!(
445-
total_unrewarded_messages(&lane_data.relayers).unwrap_or(MessageNonce::MAX) ==
446-
relayers_state.total_messages &&
447-
lane_data.relayers.len() as MessageNonce ==
448-
relayers_state.unrewarded_relayer_entries,
449-
Error::<T, I>::InvalidUnrewardedRelayersState
450-
);
451-
// the `last_delivered_nonce` field may also be used by the signed extension. Even
452-
// though providing wrong value isn't critical, let's also check it here.
453440
ensure!(
454-
lane_data.last_delivered_nonce() == relayers_state.last_delivered_nonce,
441+
relayers_state.is_valid(&lane_data),
455442
Error::<T, I>::InvalidUnrewardedRelayersState
456443
);
457444

@@ -975,9 +962,9 @@ mod tests {
975962
))),
976963
UnrewardedRelayersState {
977964
unrewarded_relayer_entries: 1,
965+
messages_in_oldest_entry: 1,
978966
total_messages: 1,
979967
last_delivered_nonce: 1,
980-
..Default::default()
981968
},
982969
));
983970

@@ -1341,9 +1328,9 @@ mod tests {
13411328
single_message_delivery_proof,
13421329
UnrewardedRelayersState {
13431330
unrewarded_relayer_entries: 1,
1331+
messages_in_oldest_entry: 1,
13441332
total_messages: 1,
13451333
last_delivered_nonce: 1,
1346-
..Default::default()
13471334
},
13481335
);
13491336
assert_ok!(result);
@@ -1381,9 +1368,9 @@ mod tests {
13811368
two_messages_delivery_proof,
13821369
UnrewardedRelayersState {
13831370
unrewarded_relayer_entries: 2,
1371+
messages_in_oldest_entry: 1,
13841372
total_messages: 2,
13851373
last_delivered_nonce: 2,
1386-
..Default::default()
13871374
},
13881375
);
13891376
assert_ok!(result);
@@ -1746,9 +1733,9 @@ mod tests {
17461733
TestMessagesDeliveryProof(messages_1_and_2_proof),
17471734
UnrewardedRelayersState {
17481735
unrewarded_relayer_entries: 1,
1736+
messages_in_oldest_entry: 2,
17491737
total_messages: 2,
17501738
last_delivered_nonce: 2,
1751-
..Default::default()
17521739
},
17531740
));
17541741
// second tx with message 3
@@ -1757,9 +1744,9 @@ mod tests {
17571744
TestMessagesDeliveryProof(messages_3_proof),
17581745
UnrewardedRelayersState {
17591746
unrewarded_relayer_entries: 1,
1747+
messages_in_oldest_entry: 1,
17601748
total_messages: 1,
17611749
last_delivered_nonce: 3,
1762-
..Default::default()
17631750
},
17641751
));
17651752
});

primitives/messages/src/lib.rs

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,17 @@ impl<RelayerId> InboundLaneData<RelayerId> {
191191
.map(|entry| entry.messages.end)
192192
.unwrap_or(self.last_confirmed_nonce)
193193
}
194+
195+
/// Returns the total number of messages in the `relayers` vector,
196+
/// saturating in case of underflow or overflow.
197+
pub fn total_unrewarded_messages(&self) -> MessageNonce {
198+
let relayers = &self.relayers;
199+
match (relayers.front(), relayers.back()) {
200+
(Some(front), Some(back)) =>
201+
(front.messages.begin..=back.messages.end).saturating_len(),
202+
_ => 0,
203+
}
204+
}
194205
}
195206

196207
/// Outbound message details, returned by runtime APIs.
@@ -287,7 +298,7 @@ impl DeliveredMessages {
287298

288299
/// Return total count of delivered messages.
289300
pub fn total_messages(&self) -> MessageNonce {
290-
(self.begin..=self.end).checked_len().unwrap_or(0)
301+
(self.begin..=self.end).saturating_len()
291302
}
292303

293304
/// Note new dispatched message.
@@ -318,16 +329,23 @@ pub struct UnrewardedRelayersState {
318329
pub last_delivered_nonce: MessageNonce,
319330
}
320331

332+
impl UnrewardedRelayersState {
333+
// Verify that the relayers state corresponds with the `InboundLaneData`.
334+
pub fn is_valid<RelayerId>(&self, lane_data: &InboundLaneData<RelayerId>) -> bool {
335+
self == &lane_data.into()
336+
}
337+
}
338+
321339
impl<RelayerId> From<&InboundLaneData<RelayerId>> for UnrewardedRelayersState {
322340
fn from(lane: &InboundLaneData<RelayerId>) -> UnrewardedRelayersState {
323341
UnrewardedRelayersState {
324342
unrewarded_relayer_entries: lane.relayers.len() as _,
325343
messages_in_oldest_entry: lane
326344
.relayers
327345
.front()
328-
.and_then(|entry| (entry.messages.begin..=entry.messages.end).checked_len())
346+
.map(|entry| entry.messages.total_messages())
329347
.unwrap_or(0),
330-
total_messages: total_unrewarded_messages(&lane.relayers).unwrap_or(MessageNonce::MAX),
348+
total_messages: lane.total_unrewarded_messages(),
331349
last_delivered_nonce: lane.last_delivered_nonce(),
332350
}
333351
}
@@ -357,24 +375,6 @@ impl Default for OutboundLaneData {
357375
}
358376
}
359377

360-
/// Returns total number of messages in the `InboundLaneData::relayers` vector.
361-
///
362-
/// Returns `None` if there are more messages that `MessageNonce` may fit (i.e. `MessageNonce + 1`).
363-
pub fn total_unrewarded_messages<RelayerId>(
364-
relayers: &VecDeque<UnrewardedRelayer<RelayerId>>,
365-
) -> Option<MessageNonce> {
366-
match (relayers.front(), relayers.back()) {
367-
(Some(front), Some(back)) => {
368-
if let Some(difference) = back.messages.end.checked_sub(front.messages.begin) {
369-
difference.checked_add(1)
370-
} else {
371-
Some(0)
372-
}
373-
},
374-
_ => Some(0),
375-
}
376-
}
377-
378378
/// Calculate the number of messages that the relayers have delivered.
379379
pub fn calc_relayers_rewards<AccountId>(
380380
messages_relayers: VecDeque<UnrewardedRelayer<AccountId>>,
@@ -447,20 +447,19 @@ mod tests {
447447

448448
#[test]
449449
fn total_unrewarded_messages_does_not_overflow() {
450-
assert_eq!(
451-
total_unrewarded_messages(
452-
&vec![
453-
UnrewardedRelayer { relayer: 1, messages: DeliveredMessages::new(0) },
454-
UnrewardedRelayer {
455-
relayer: 2,
456-
messages: DeliveredMessages::new(MessageNonce::MAX)
457-
},
458-
]
459-
.into_iter()
460-
.collect()
461-
),
462-
None,
463-
);
450+
let lane_data = InboundLaneData {
451+
relayers: vec![
452+
UnrewardedRelayer { relayer: 1, messages: DeliveredMessages::new(0) },
453+
UnrewardedRelayer {
454+
relayer: 2,
455+
messages: DeliveredMessages::new(MessageNonce::MAX),
456+
},
457+
]
458+
.into_iter()
459+
.collect(),
460+
last_confirmed_nonce: 0,
461+
};
462+
assert_eq!(lane_data.total_unrewarded_messages(), MessageNonce::MAX);
464463
}
465464

466465
#[test]

primitives/runtime/src/lib.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub use chain::{
3535
UnderlyingChainProvider,
3636
};
3737
pub use frame_support::storage::storage_prefix as storage_value_final_key;
38-
use num_traits::{CheckedAdd, CheckedSub, One};
38+
use num_traits::{CheckedAdd, CheckedSub, One, SaturatingAdd, Zero};
3939
pub use storage_proof::{
4040
record_all_keys as record_all_trie_keys, Error as StorageProofError,
4141
ProofSize as StorageProofSize, RawStorageProof, StorageProofChecker,
@@ -527,17 +527,27 @@ impl<T> Debug for StrippableError<T> {
527527
pub trait RangeInclusiveExt<Idx> {
528528
/// Computes the length of the `RangeInclusive`, checking for underflow and overflow.
529529
fn checked_len(&self) -> Option<Idx>;
530+
/// Computes the length of the `RangeInclusive`, saturating in case of underflow or overflow.
531+
fn saturating_len(&self) -> Idx;
530532
}
531533

532534
impl<Idx> RangeInclusiveExt<Idx> for RangeInclusive<Idx>
533535
where
534-
Idx: CheckedSub + CheckedAdd + One,
536+
Idx: CheckedSub + CheckedAdd + SaturatingAdd + One + Zero,
535537
{
536538
fn checked_len(&self) -> Option<Idx> {
537539
self.end()
538540
.checked_sub(self.start())
539541
.and_then(|len| len.checked_add(&Idx::one()))
540542
}
543+
544+
fn saturating_len(&self) -> Idx {
545+
let len = match self.end().checked_sub(self.start()) {
546+
Some(len) => len,
547+
None => return Idx::zero(),
548+
};
549+
len.saturating_add(&Idx::one())
550+
}
541551
}
542552

543553
#[cfg(test)]

relays/lib-substrate-relay/src/messages_target.rs

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ use crate::{
3131
use async_std::sync::Arc;
3232
use async_trait::async_trait;
3333
use bp_messages::{
34-
storage_keys::inbound_lane_data_key, total_unrewarded_messages, InboundLaneData, LaneId,
35-
MessageNonce, UnrewardedRelayersState,
34+
storage_keys::inbound_lane_data_key, InboundLaneData, LaneId, MessageNonce,
35+
UnrewardedRelayersState,
3636
};
3737
use bridge_runtime_common::messages::source::FromBridgedChainMessagesDeliveryProof;
3838
use messages_relay::{
@@ -45,7 +45,7 @@ use relay_substrate_client::{
4545
};
4646
use relay_utils::relay_loop::Client as RelayClient;
4747
use sp_core::Pair;
48-
use std::{collections::VecDeque, convert::TryFrom, ops::RangeInclusive};
48+
use std::{convert::TryFrom, ops::RangeInclusive};
4949

5050
/// Message receiving proof returned by the target Substrate node.
5151
pub type SubstrateMessagesDeliveryProof<C> =
@@ -197,20 +197,9 @@ where
197197
id: TargetHeaderIdOf<MessageLaneAdapter<P>>,
198198
) -> Result<(TargetHeaderIdOf<MessageLaneAdapter<P>>, UnrewardedRelayersState), SubstrateError>
199199
{
200-
let inbound_lane_data = self.inbound_lane_data(id).await?;
201-
let last_delivered_nonce =
202-
inbound_lane_data.as_ref().map(|data| data.last_delivered_nonce()).unwrap_or(0);
203-
let relayers = inbound_lane_data.map(|data| data.relayers).unwrap_or_else(VecDeque::new);
204-
let unrewarded_relayers_state = bp_messages::UnrewardedRelayersState {
205-
unrewarded_relayer_entries: relayers.len() as _,
206-
messages_in_oldest_entry: relayers
207-
.front()
208-
.map(|entry| 1 + entry.messages.end - entry.messages.begin)
209-
.unwrap_or(0),
210-
total_messages: total_unrewarded_messages(&relayers).unwrap_or(MessageNonce::MAX),
211-
last_delivered_nonce,
212-
};
213-
Ok((id, unrewarded_relayers_state))
200+
let inbound_lane_data =
201+
self.inbound_lane_data(id).await?.unwrap_or(InboundLaneData::default());
202+
Ok((id, (&inbound_lane_data).into()))
214203
}
215204

216205
async fn prove_messages_receiving(

0 commit comments

Comments
 (0)