Skip to content

Commit bd1527b

Browse files
authored
Remove some expect() statements (paritytech#2123)
* Return error on save_message() Prevent unexpected failures. * Remove RefCell * Fix spellcheck * CI fixes
1 parent ae06c73 commit bd1527b

4 files changed

Lines changed: 92 additions & 91 deletions

File tree

bridges/modules/messages/src/benchmarking.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
//! Messages pallet benchmarking.
1818
1919
use crate::{
20-
inbound_lane::InboundLaneStorage, inbound_lane_storage, outbound_lane,
21-
weights_ext::EXPECTED_DEFAULT_MESSAGE_LENGTH, Call, OutboundLanes,
20+
inbound_lane::InboundLaneStorage, outbound_lane, weights_ext::EXPECTED_DEFAULT_MESSAGE_LENGTH,
21+
Call, OutboundLanes, RuntimeInboundLaneStorage,
2222
};
2323

2424
use bp_messages::{
@@ -443,11 +443,12 @@ benchmarks_instance_pallet! {
443443

444444
fn send_regular_message<T: Config<I>, I: 'static>() {
445445
let mut outbound_lane = outbound_lane::<T, I>(T::bench_lane_id());
446-
outbound_lane.send_message(vec![]);
446+
outbound_lane.send_message(vec![]).expect("We craft valid messages");
447447
}
448448

449449
fn receive_messages<T: Config<I>, I: 'static>(nonce: MessageNonce) {
450-
let mut inbound_lane_storage = inbound_lane_storage::<T, I>(T::bench_lane_id());
450+
let mut inbound_lane_storage =
451+
RuntimeInboundLaneStorage::<T, I>::from_lane_id(T::bench_lane_id());
451452
inbound_lane_storage.set_data(InboundLaneData {
452453
relayers: vec![UnrewardedRelayer {
453454
relayer: T::bridged_relayer_id(),

bridges/modules/messages/src/inbound_lane.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub trait InboundLaneStorage {
4040
/// Return maximal number of unconfirmed messages in inbound lane.
4141
fn max_unconfirmed_messages(&self) -> MessageNonce;
4242
/// Get lane data from the storage.
43-
fn data(&self) -> InboundLaneData<Self::Relayer>;
43+
fn get_or_init_data(&mut self) -> InboundLaneData<Self::Relayer>;
4444
/// Update lane data in the storage.
4545
fn set_data(&mut self, data: InboundLaneData<Self::Relayer>);
4646
}
@@ -117,17 +117,17 @@ impl<S: InboundLaneStorage> InboundLane<S> {
117117
InboundLane { storage }
118118
}
119119

120-
/// Returns storage reference.
121-
pub fn storage(&self) -> &S {
122-
&self.storage
120+
/// Returns `mut` storage reference.
121+
pub fn storage_mut(&mut self) -> &mut S {
122+
&mut self.storage
123123
}
124124

125125
/// Receive state of the corresponding outbound lane.
126126
pub fn receive_state_update(
127127
&mut self,
128128
outbound_lane_data: OutboundLaneData,
129129
) -> Option<MessageNonce> {
130-
let mut data = self.storage.data();
130+
let mut data = self.storage.get_or_init_data();
131131
let last_delivered_nonce = data.last_delivered_nonce();
132132

133133
if outbound_lane_data.latest_received_nonce > last_delivered_nonce {
@@ -170,7 +170,7 @@ impl<S: InboundLaneStorage> InboundLane<S> {
170170
nonce: MessageNonce,
171171
message_data: DispatchMessageData<Dispatch::DispatchPayload>,
172172
) -> ReceivalResult<Dispatch::DispatchLevelResult> {
173-
let mut data = self.storage.data();
173+
let mut data = self.storage.get_or_init_data();
174174
let is_correct_message = nonce == data.last_delivered_nonce() + 1;
175175
if !is_correct_message {
176176
return ReceivalResult::InvalidNonce
@@ -252,7 +252,7 @@ mod tests {
252252
None,
253253
);
254254

255-
assert_eq!(lane.storage.data().last_confirmed_nonce, 0);
255+
assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 0);
256256
});
257257
}
258258

@@ -270,7 +270,7 @@ mod tests {
270270
}),
271271
Some(3),
272272
);
273-
assert_eq!(lane.storage.data().last_confirmed_nonce, 3);
273+
assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 3);
274274

275275
assert_eq!(
276276
lane.receive_state_update(OutboundLaneData {
@@ -279,7 +279,7 @@ mod tests {
279279
}),
280280
None,
281281
);
282-
assert_eq!(lane.storage.data().last_confirmed_nonce, 3);
282+
assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 3);
283283
});
284284
}
285285

@@ -290,9 +290,9 @@ mod tests {
290290
receive_regular_message(&mut lane, 1);
291291
receive_regular_message(&mut lane, 2);
292292
receive_regular_message(&mut lane, 3);
293-
assert_eq!(lane.storage.data().last_confirmed_nonce, 0);
293+
assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 0);
294294
assert_eq!(
295-
lane.storage.data().relayers,
295+
lane.storage.get_or_init_data().relayers,
296296
vec![unrewarded_relayer(1, 3, TEST_RELAYER_A)]
297297
);
298298

@@ -303,9 +303,9 @@ mod tests {
303303
}),
304304
Some(2),
305305
);
306-
assert_eq!(lane.storage.data().last_confirmed_nonce, 2);
306+
assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 2);
307307
assert_eq!(
308-
lane.storage.data().relayers,
308+
lane.storage.get_or_init_data().relayers,
309309
vec![unrewarded_relayer(3, 3, TEST_RELAYER_A)]
310310
);
311311

@@ -316,16 +316,16 @@ mod tests {
316316
}),
317317
Some(3),
318318
);
319-
assert_eq!(lane.storage.data().last_confirmed_nonce, 3);
320-
assert_eq!(lane.storage.data().relayers, vec![]);
319+
assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 3);
320+
assert_eq!(lane.storage.get_or_init_data().relayers, vec![]);
321321
});
322322
}
323323

324324
#[test]
325325
fn receive_status_update_works_with_batches_from_relayers() {
326326
run_test(|| {
327327
let mut lane = inbound_lane::<TestRuntime, _>(TEST_LANE_ID);
328-
let mut seed_storage_data = lane.storage.data();
328+
let mut seed_storage_data = lane.storage.get_or_init_data();
329329
// Prepare data
330330
seed_storage_data.last_confirmed_nonce = 0;
331331
seed_storage_data.relayers.push_back(unrewarded_relayer(1, 1, TEST_RELAYER_A));
@@ -341,9 +341,9 @@ mod tests {
341341
}),
342342
Some(3),
343343
);
344-
assert_eq!(lane.storage.data().last_confirmed_nonce, 3);
344+
assert_eq!(lane.storage.get_or_init_data().last_confirmed_nonce, 3);
345345
assert_eq!(
346-
lane.storage.data().relayers,
346+
lane.storage.get_or_init_data().relayers,
347347
vec![
348348
unrewarded_relayer(4, 4, TEST_RELAYER_B),
349349
unrewarded_relayer(5, 5, TEST_RELAYER_C)
@@ -364,7 +364,7 @@ mod tests {
364364
),
365365
ReceivalResult::InvalidNonce
366366
);
367-
assert_eq!(lane.storage.data().last_delivered_nonce(), 0);
367+
assert_eq!(lane.storage.get_or_init_data().last_delivered_nonce(), 0);
368368
});
369369
}
370370

@@ -470,7 +470,7 @@ mod tests {
470470
ReceivalResult::Dispatched(dispatch_result(0))
471471
);
472472
assert_eq!(
473-
lane.storage.data().relayers,
473+
lane.storage.get_or_init_data().relayers,
474474
vec![
475475
unrewarded_relayer(1, 1, TEST_RELAYER_A),
476476
unrewarded_relayer(2, 2, TEST_RELAYER_B),
@@ -508,7 +508,7 @@ mod tests {
508508
run_test(|| {
509509
let mut lane = inbound_lane::<TestRuntime, _>(TEST_LANE_ID);
510510
receive_regular_message(&mut lane, 1);
511-
assert_eq!(lane.storage.data().last_delivered_nonce(), 1);
511+
assert_eq!(lane.storage.get_or_init_data().last_delivered_nonce(), 1);
512512
});
513513
}
514514

bridges/modules/messages/src/lib.rs

Lines changed: 37 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ use bp_runtime::{BasicOperatingMode, ChainId, OwnedBridgeModule, PreComputedSize
6767
use codec::{Decode, Encode, MaxEncodedLen};
6868
use frame_support::{dispatch::PostDispatchInfo, ensure, fail, traits::Get};
6969
use sp_runtime::traits::UniqueSaturatedFrom;
70-
use sp_std::{cell::RefCell, marker::PhantomData, prelude::*};
70+
use sp_std::{marker::PhantomData, prelude::*};
7171

7272
mod inbound_lane;
7373
mod outbound_lane;
@@ -319,7 +319,7 @@ pub mod pallet {
319319

320320
// subtract extra storage proof bytes from the actual PoV size - there may be
321321
// less unrewarded relayers than the maximal configured value
322-
let lane_extra_proof_size_bytes = lane.storage().extra_proof_size_bytes();
322+
let lane_extra_proof_size_bytes = lane.storage_mut().extra_proof_size_bytes();
323323
actual_weight = actual_weight.set_proof_size(
324324
actual_weight.proof_size().saturating_sub(lane_extra_proof_size_bytes),
325325
);
@@ -332,7 +332,7 @@ pub mod pallet {
332332
"Received lane {:?} state update: latest_confirmed_nonce={}. Unrewarded relayers: {:?}",
333333
lane_id,
334334
updated_latest_confirmed_nonce,
335-
UnrewardedRelayersState::from(&lane.storage().data()),
335+
UnrewardedRelayersState::from(&lane.storage_mut().get_or_init_data()),
336336
);
337337
}
338338
}
@@ -531,12 +531,12 @@ pub mod pallet {
531531
NotOperatingNormally,
532532
/// The outbound lane is inactive.
533533
InactiveOutboundLane,
534-
/// The message is too large to be sent over the bridge.
535-
MessageIsTooLarge,
536534
/// Message has been treated as invalid by chain verifier.
537535
MessageRejectedByChainVerifier(VerificationError),
538536
/// Message has been treated as invalid by lane verifier.
539537
MessageRejectedByLaneVerifier(VerificationError),
538+
/// Message has been treated as invalid by the pallet logic.
539+
MessageRejectedByPallet(VerificationError),
540540
/// Submitter has failed to pay fee for delivering and dispatching messages.
541541
FailedToWithdrawMessageFee,
542542
/// The transaction brings too many messages.
@@ -727,11 +727,9 @@ fn send_message<T: Config<I>, I: 'static>(
727727
// finally, save message in outbound storage and emit event
728728
let encoded_payload = payload.encode();
729729
let encoded_payload_len = encoded_payload.len();
730-
ensure!(
731-
encoded_payload_len <= T::MaximalOutboundPayloadSize::get() as usize,
732-
Error::<T, I>::MessageIsTooLarge
733-
);
734-
let nonce = lane.send_message(encoded_payload);
730+
let nonce = lane
731+
.send_message(encoded_payload)
732+
.map_err(Error::<T, I>::MessageRejectedByPallet)?;
735733

736734
log::trace!(
737735
target: LOG_TARGET,
@@ -761,18 +759,7 @@ fn ensure_normal_operating_mode<T: Config<I>, I: 'static>() -> Result<(), Error<
761759
fn inbound_lane<T: Config<I>, I: 'static>(
762760
lane_id: LaneId,
763761
) -> InboundLane<RuntimeInboundLaneStorage<T, I>> {
764-
InboundLane::new(inbound_lane_storage::<T, I>(lane_id))
765-
}
766-
767-
/// Creates new runtime inbound lane storage.
768-
fn inbound_lane_storage<T: Config<I>, I: 'static>(
769-
lane_id: LaneId,
770-
) -> RuntimeInboundLaneStorage<T, I> {
771-
RuntimeInboundLaneStorage {
772-
lane_id,
773-
cached_data: RefCell::new(None),
774-
_phantom: Default::default(),
775-
}
762+
InboundLane::new(RuntimeInboundLaneStorage::from_lane_id(lane_id))
776763
}
777764

778765
/// Creates new outbound lane object, backed by runtime storage.
@@ -785,10 +772,17 @@ fn outbound_lane<T: Config<I>, I: 'static>(
785772
/// Runtime inbound lane storage.
786773
struct RuntimeInboundLaneStorage<T: Config<I>, I: 'static = ()> {
787774
lane_id: LaneId,
788-
cached_data: RefCell<Option<InboundLaneData<T::InboundRelayer>>>,
775+
cached_data: Option<InboundLaneData<T::InboundRelayer>>,
789776
_phantom: PhantomData<I>,
790777
}
791778

779+
impl<T: Config<I>, I: 'static> RuntimeInboundLaneStorage<T, I> {
780+
/// Creates new runtime inbound lane storage.
781+
fn from_lane_id(lane_id: LaneId) -> RuntimeInboundLaneStorage<T, I> {
782+
RuntimeInboundLaneStorage { lane_id, cached_data: None, _phantom: Default::default() }
783+
}
784+
}
785+
792786
impl<T: Config<I>, I: 'static> RuntimeInboundLaneStorage<T, I> {
793787
/// Returns number of bytes that may be subtracted from the PoV component of
794788
/// `receive_messages_proof` call, because the actual inbound lane state is smaller than the
@@ -798,9 +792,9 @@ impl<T: Config<I>, I: 'static> RuntimeInboundLaneStorage<T, I> {
798792
/// `MaxUnrewardedRelayerEntriesAtInboundLane` constant from the pallet configuration. The PoV
799793
/// of the call includes the maximal size of inbound lane state. If the actual size is smaller,
800794
/// we may subtract extra bytes from this component.
801-
pub fn extra_proof_size_bytes(&self) -> u64 {
795+
pub fn extra_proof_size_bytes(&mut self) -> u64 {
802796
let max_encoded_len = StoredInboundLaneData::<T, I>::max_encoded_len();
803-
let relayers_count = self.data().relayers.len();
797+
let relayers_count = self.get_or_init_data().relayers.len();
804798
let actual_encoded_len =
805799
InboundLaneData::<T::InboundRelayer>::encoded_size_hint(relayers_count)
806800
.unwrap_or(usize::MAX);
@@ -823,26 +817,20 @@ impl<T: Config<I>, I: 'static> InboundLaneStorage for RuntimeInboundLaneStorage<
823817
T::MaxUnconfirmedMessagesAtInboundLane::get()
824818
}
825819

826-
fn data(&self) -> InboundLaneData<T::InboundRelayer> {
827-
match self.cached_data.clone().into_inner() {
828-
Some(data) => data,
820+
fn get_or_init_data(&mut self) -> InboundLaneData<T::InboundRelayer> {
821+
match self.cached_data {
822+
Some(ref data) => data.clone(),
829823
None => {
830824
let data: InboundLaneData<T::InboundRelayer> =
831825
InboundLanes::<T, I>::get(self.lane_id).into();
832-
*self.cached_data.try_borrow_mut().expect(
833-
"we're in the single-threaded environment;\
834-
we have no recursive borrows; qed",
835-
) = Some(data.clone());
826+
self.cached_data = Some(data.clone());
836827
data
837828
},
838829
}
839830
}
840831

841832
fn set_data(&mut self, data: InboundLaneData<T::InboundRelayer>) {
842-
*self.cached_data.try_borrow_mut().expect(
843-
"we're in the single-threaded environment;\
844-
we have no recursive borrows; qed",
845-
) = Some(data.clone());
833+
self.cached_data = Some(data.clone());
846834
InboundLanes::<T, I>::insert(self.lane_id, StoredInboundLaneData::<T, I>(data))
847835
}
848836
}
@@ -872,15 +860,17 @@ impl<T: Config<I>, I: 'static> OutboundLaneStorage for RuntimeOutboundLaneStorag
872860
.map(Into::into)
873861
}
874862

875-
fn save_message(&mut self, nonce: MessageNonce, message_payload: MessagePayload) {
863+
fn save_message(
864+
&mut self,
865+
nonce: MessageNonce,
866+
message_payload: MessagePayload,
867+
) -> Result<(), VerificationError> {
876868
OutboundMessages::<T, I>::insert(
877869
MessageKey { lane_id: self.lane_id, nonce },
878-
StoredMessagePayload::<T, I>::try_from(message_payload).expect(
879-
"save_message is called after all checks in send_message; \
880-
send_message checks message size; \
881-
qed",
882-
),
870+
StoredMessagePayload::<T, I>::try_from(message_payload)
871+
.map_err(|_| VerificationError::MessageTooLarge)?,
883872
);
873+
Ok(())
884874
}
885875

886876
fn remove_message(&mut self, nonce: &MessageNonce) {
@@ -1128,7 +1118,9 @@ mod tests {
11281118
TEST_LANE_ID,
11291119
message_payload.clone(),
11301120
),
1131-
Error::<TestRuntime, ()>::MessageIsTooLarge,
1121+
Error::<TestRuntime, ()>::MessageRejectedByPallet(
1122+
VerificationError::MessageTooLarge
1123+
),
11321124
);
11331125

11341126
// let's check that we're able to send `MAX_OUTBOUND_PAYLOAD_SIZE` messages
@@ -2097,10 +2089,10 @@ mod tests {
20972089
fn storage(relayer_entries: usize) -> RuntimeInboundLaneStorage<TestRuntime, ()> {
20982090
RuntimeInboundLaneStorage {
20992091
lane_id: Default::default(),
2100-
cached_data: RefCell::new(Some(InboundLaneData {
2092+
cached_data: Some(InboundLaneData {
21012093
relayers: vec![relayer_entry(); relayer_entries].into_iter().collect(),
21022094
last_confirmed_nonce: 0,
2103-
})),
2095+
}),
21042096
_phantom: Default::default(),
21052097
}
21062098
}

0 commit comments

Comments
 (0)