mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-19 22:45:40 +00:00
Remove without_storage_info for messages pallet (#1487)
* draft: remove without_storage_info for messages pallet * some cleanup
This commit is contained in:
committed by
Bastian Köcher
parent
60edd0c436
commit
7d97e576d0
@@ -37,6 +37,8 @@
|
||||
// Generated by `decl_event!`
|
||||
#![allow(clippy::unused_unit)]
|
||||
|
||||
pub use inbound_lane::StoredInboundLaneData;
|
||||
pub use outbound_lane::StoredMessageData;
|
||||
pub use weights::WeightInfo;
|
||||
pub use weights_ext::{
|
||||
ensure_able_to_receive_confirmation, ensure_able_to_receive_message,
|
||||
@@ -62,9 +64,9 @@ use bp_messages::{
|
||||
UnrewardedRelayersState,
|
||||
};
|
||||
use bp_runtime::{BasicOperatingMode, ChainId, OwnedBridgeModule, Size};
|
||||
use codec::{Decode, Encode};
|
||||
use codec::{Decode, Encode, MaxEncodedLen};
|
||||
use frame_support::{
|
||||
fail,
|
||||
ensure, fail,
|
||||
traits::Get,
|
||||
weights::{Pays, PostDispatchInfo},
|
||||
};
|
||||
@@ -145,6 +147,9 @@ pub mod pallet {
|
||||
/// these messages are from different lanes.
|
||||
type MaxUnconfirmedMessagesAtInboundLane: Get<MessageNonce>;
|
||||
|
||||
/// Maximal size of the outbound payload.
|
||||
#[pallet::constant]
|
||||
type MaximalOutboundPayloadSize: Get<u32>;
|
||||
/// Payload type of outbound messages. This payload is dispatched on the bridged chain.
|
||||
type OutboundPayload: Parameter + Size;
|
||||
/// Message fee type of outbound messages. This fee is paid on this chain.
|
||||
@@ -154,7 +159,8 @@ pub mod pallet {
|
||||
+ Parameter
|
||||
+ SaturatingAdd
|
||||
+ Zero
|
||||
+ Copy;
|
||||
+ Copy
|
||||
+ MaxEncodedLen;
|
||||
|
||||
/// Payload type of inbound messages. This payload is dispatched on this chain.
|
||||
type InboundPayload: Decode;
|
||||
@@ -162,7 +168,7 @@ pub mod pallet {
|
||||
type InboundMessageFee: Decode + Zero;
|
||||
/// Identifier of relayer that deliver messages to this chain. Relayer reward is paid on the
|
||||
/// bridged chain.
|
||||
type InboundRelayer: Parameter;
|
||||
type InboundRelayer: Parameter + MaxEncodedLen;
|
||||
|
||||
/// A type which can be turned into an AccountId from a 256-bit hash.
|
||||
///
|
||||
@@ -216,7 +222,6 @@ pub mod pallet {
|
||||
|
||||
#[pallet::pallet]
|
||||
#[pallet::generate_store(pub(super) trait Store)]
|
||||
#[pallet::without_storage_info]
|
||||
pub struct Pallet<T, I = ()>(PhantomData<(T, I)>);
|
||||
|
||||
impl<T: Config<I>, I: 'static> OwnedBridgeModule<T> for Pallet<T, I> {
|
||||
@@ -658,6 +663,8 @@ pub mod pallet {
|
||||
pub enum Error<T, I = ()> {
|
||||
/// Pallet is not in Normal operating mode.
|
||||
NotOperatingNormally,
|
||||
/// The message is too large to be sent over the bridge.
|
||||
MessageIsTooLarge,
|
||||
/// Message has been treated as invalid by chain verifier.
|
||||
MessageRejectedByChainVerifier,
|
||||
/// Message has been treated as invalid by lane verifier.
|
||||
@@ -707,7 +714,7 @@ pub mod pallet {
|
||||
/// Map of lane id => inbound lane data.
|
||||
#[pallet::storage]
|
||||
pub type InboundLanes<T: Config<I>, I: 'static = ()> =
|
||||
StorageMap<_, Blake2_128Concat, LaneId, InboundLaneData<T::InboundRelayer>, ValueQuery>;
|
||||
StorageMap<_, Blake2_128Concat, LaneId, StoredInboundLaneData<T, I>, ValueQuery>;
|
||||
|
||||
/// Map of lane id => outbound lane data.
|
||||
#[pallet::storage]
|
||||
@@ -717,7 +724,7 @@ pub mod pallet {
|
||||
/// All queued outbound messages.
|
||||
#[pallet::storage]
|
||||
pub type OutboundMessages<T: Config<I>, I: 'static = ()> =
|
||||
StorageMap<_, Blake2_128Concat, MessageKey, MessageData<T::OutboundMessageFee>>;
|
||||
StorageMap<_, Blake2_128Concat, MessageKey, StoredMessageData<T, I>>;
|
||||
|
||||
#[pallet::genesis_config]
|
||||
pub struct GenesisConfig<T: Config<I>, I: 'static = ()> {
|
||||
@@ -756,7 +763,7 @@ pub mod pallet {
|
||||
lane: LaneId,
|
||||
nonce: MessageNonce,
|
||||
) -> Option<MessageData<T::OutboundMessageFee>> {
|
||||
OutboundMessages::<T, I>::get(MessageKey { lane_id: lane, nonce })
|
||||
OutboundMessages::<T, I>::get(MessageKey { lane_id: lane, nonce }).map(Into::into)
|
||||
}
|
||||
|
||||
/// Prepare data, related to given inbound message.
|
||||
@@ -822,6 +829,12 @@ fn send_message<T: Config<I>, I: 'static>(
|
||||
> {
|
||||
ensure_normal_operating_mode::<T, I>()?;
|
||||
|
||||
// the most lightweigh check is the message size check
|
||||
ensure!(
|
||||
payload.size() < T::MaximalOutboundPayloadSize::get(),
|
||||
Error::<T, I>::MessageIsTooLarge,
|
||||
);
|
||||
|
||||
// initially, actual (post-dispatch) weight is equal to pre-dispatch weight
|
||||
let mut actual_weight = T::WeightInfo::send_message_weight(&payload, T::DbWeight::get());
|
||||
|
||||
@@ -955,7 +968,8 @@ where
|
||||
// this loop is bound by `T::MaxUnconfirmedMessagesAtInboundLane` on the bridged chain
|
||||
let mut relayer_reward = relayers_rewards.entry(entry.relayer).or_default();
|
||||
for nonce in nonce_begin..nonce_end + 1 {
|
||||
let message_data = OutboundMessages::<T, I>::get(MessageKey { lane_id, nonce })
|
||||
let key = MessageKey { lane_id, nonce };
|
||||
let message_data = OutboundMessages::<T, I>::get(key)
|
||||
.expect("message was just confirmed; we never prune unconfirmed messages; qed");
|
||||
relayer_reward.reward = relayer_reward.reward.saturating_add(&message_data.fee);
|
||||
relayer_reward.messages += 1;
|
||||
@@ -1027,7 +1041,8 @@ impl<T: Config<I>, I: 'static> InboundLaneStorage for RuntimeInboundLaneStorage<
|
||||
match self.cached_data.clone().into_inner() {
|
||||
Some(data) => data,
|
||||
None => {
|
||||
let data = InboundLanes::<T, I>::get(&self.lane_id);
|
||||
let data: InboundLaneData<T::InboundRelayer> =
|
||||
InboundLanes::<T, I>::get(&self.lane_id).into();
|
||||
*self.cached_data.try_borrow_mut().expect(
|
||||
"we're in the single-threaded environment;\
|
||||
we have no recursive borrows; qed",
|
||||
@@ -1042,7 +1057,7 @@ impl<T: Config<I>, I: 'static> InboundLaneStorage for RuntimeInboundLaneStorage<
|
||||
"we're in the single-threaded environment;\
|
||||
we have no recursive borrows; qed",
|
||||
) = Some(data.clone());
|
||||
InboundLanes::<T, I>::insert(&self.lane_id, data)
|
||||
InboundLanes::<T, I>::insert(&self.lane_id, StoredInboundLaneData::<T, I>(data))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1070,6 +1085,7 @@ impl<T: Config<I>, I: 'static> OutboundLaneStorage for RuntimeOutboundLaneStorag
|
||||
#[cfg(test)]
|
||||
fn message(&self, nonce: &MessageNonce) -> Option<MessageData<T::OutboundMessageFee>> {
|
||||
OutboundMessages::<T, I>::get(MessageKey { lane_id: self.lane_id, nonce: *nonce })
|
||||
.map(Into::into)
|
||||
}
|
||||
|
||||
fn save_message(
|
||||
@@ -1116,8 +1132,9 @@ mod tests {
|
||||
message, message_payload, run_test, unrewarded_relayer, Event as TestEvent, Origin,
|
||||
TestMessageDeliveryAndDispatchPayment, TestMessagesDeliveryProof, TestMessagesParameter,
|
||||
TestMessagesProof, TestOnDeliveryConfirmed1, TestOnDeliveryConfirmed2,
|
||||
TestOnMessageAccepted, TestRuntime, TokenConversionRate, PAYLOAD_REJECTED_BY_TARGET_CHAIN,
|
||||
REGULAR_PAYLOAD, TEST_LANE_ID, TEST_RELAYER_A, TEST_RELAYER_B,
|
||||
TestOnMessageAccepted, TestRuntime, TokenConversionRate, MAX_OUTBOUND_PAYLOAD_SIZE,
|
||||
PAYLOAD_REJECTED_BY_TARGET_CHAIN, REGULAR_PAYLOAD, TEST_LANE_ID, TEST_RELAYER_A,
|
||||
TEST_RELAYER_B,
|
||||
};
|
||||
use bp_messages::{UnrewardedRelayer, UnrewardedRelayersState};
|
||||
use bp_test_utils::generate_owned_bridge_module_tests;
|
||||
@@ -1137,7 +1154,7 @@ mod tests {
|
||||
fn inbound_unrewarded_relayers_state(
|
||||
lane: bp_messages::LaneId,
|
||||
) -> bp_messages::UnrewardedRelayersState {
|
||||
let inbound_lane_data = InboundLanes::<TestRuntime, ()>::get(&lane);
|
||||
let inbound_lane_data = InboundLanes::<TestRuntime, ()>::get(&lane).0;
|
||||
let last_delivered_nonce = inbound_lane_data.last_delivered_nonce();
|
||||
let relayers = inbound_lane_data.relayers;
|
||||
bp_messages::UnrewardedRelayersState {
|
||||
@@ -1443,6 +1460,27 @@ mod tests {
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn send_message_rejects_too_large_message() {
|
||||
run_test(|| {
|
||||
let mut message_payload = message_payload(1, 0);
|
||||
// the payload isn't simply extra, so it'll definitely overflow
|
||||
// `MAX_OUTBOUND_PAYLOAD_SIZE` if we add `MAX_OUTBOUND_PAYLOAD_SIZE` bytes to extra
|
||||
message_payload
|
||||
.extra
|
||||
.extend_from_slice(&[0u8; MAX_OUTBOUND_PAYLOAD_SIZE as usize]);
|
||||
assert_noop!(
|
||||
Pallet::<TestRuntime>::send_message(
|
||||
Origin::signed(1),
|
||||
TEST_LANE_ID,
|
||||
message_payload,
|
||||
0,
|
||||
),
|
||||
Error::<TestRuntime, ()>::MessageIsTooLarge,
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chain_verifier_rejects_invalid_message_in_send_message() {
|
||||
run_test(|| {
|
||||
@@ -1502,7 +1540,7 @@ mod tests {
|
||||
REGULAR_PAYLOAD.declared_weight,
|
||||
));
|
||||
|
||||
assert_eq!(InboundLanes::<TestRuntime>::get(TEST_LANE_ID).last_delivered_nonce(), 1);
|
||||
assert_eq!(InboundLanes::<TestRuntime>::get(TEST_LANE_ID).0.last_delivered_nonce(), 1);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1547,7 +1585,7 @@ mod tests {
|
||||
));
|
||||
|
||||
assert_eq!(
|
||||
InboundLanes::<TestRuntime>::get(TEST_LANE_ID),
|
||||
InboundLanes::<TestRuntime>::get(TEST_LANE_ID).0,
|
||||
InboundLaneData {
|
||||
last_confirmed_nonce: 9,
|
||||
relayers: vec![
|
||||
@@ -2146,8 +2184,8 @@ mod tests {
|
||||
run_test(|| {
|
||||
let mut small_payload = message_payload(0, 100);
|
||||
let mut large_payload = message_payload(1, 100);
|
||||
small_payload.extra = vec![1; 100];
|
||||
large_payload.extra = vec![2; 16_384];
|
||||
small_payload.extra = vec![1; MAX_OUTBOUND_PAYLOAD_SIZE as usize / 10];
|
||||
large_payload.extra = vec![2; MAX_OUTBOUND_PAYLOAD_SIZE as usize / 5];
|
||||
|
||||
assert_ok!(Pallet::<TestRuntime>::send_message(
|
||||
Origin::signed(1),
|
||||
|
||||
Reference in New Issue
Block a user