Skip to content
  1. Nov 02, 2023
    • Oliver Tale-Yazdi's avatar
      Use `Message Queue` as DMP and XCMP dispatch queue (#1246) · e1c033eb
      Oliver Tale-Yazdi authored
      (imported from https://github.com/paritytech/cumulus/pull/2157)
      
      ## Changes
      
      This MR refactores the XCMP, Parachains System and DMP pallets to use
      the [MessageQueue](https://github.com/paritytech/substrate/pull/12485)
      for delayed execution of incoming messages. The DMP pallet is entirely
      replaced by the MQ and thereby removed. This allows for PoV-bounded
      execution and resolves a number of issues that stem from the current
      work-around.
      
      All System Parachains adopt this change.  
      The most important changes are in `primitives/core/src/lib.rs`,
      `parachains/common/src/process_xcm_message.rs`,
      `pallets/parachain-system/src/lib.rs`, `pallets/xcmp-queue/src/lib.rs`
      and the runtime configs.
      
      ### DMP Queue Pallet
      
      The pallet got removed and its logic refactored into parachain-system.
      Overweight message management can be done directly through the MQ
      pallet.
      
      Final undeployment migrations are provided by
      `cumulus_pallet_dmp_queue::UndeployDmpQueue` and `DeleteDmpQueue` that
      can be configured with an aux config trait like:
      
      ```rust
      parameter_types! {
      	pub const DmpQueuePalletName: &'static str = \"DmpQueue\" < CHANGE ME;
      	pub const RelayOrigin: AggregateMessageOrigin = AggregateMessageOrigin::Parent;
      }
      
      impl cumulus_pallet_dmp_queue::MigrationConfig for Runtime {
      	type PalletName = DmpQueuePalletName;
      	type DmpHandler = frame_support::traits::EnqueueWithOrigin<MessageQueue, RelayOrigin>;
      	type DbWeight = <Runtime as frame_system::Config>::DbWeight;
      }
      
      // And adding them to your Migrations tuple:
      pub type Migrations = (
      	...
      	cumulus_pallet_dmp_queue::UndeployDmpQueue<Runtime>,
      	cumulus_pallet_dmp_queue::DeleteDmpQueue<Runtime>,
      );
      ```
      
      ### XCMP Queue pallet
      
      Removed all dispatch queue functionality. Incoming XCMP messages are now
      either: Immediately handled if they are Signals, enqueued into the MQ
      pallet otherwise.
      
      New config items for the XCMP queue pallet:
      ```rust
      /// The actual queue implementation that retains the messages for later processing.
      type XcmpQueue: EnqueueMessage<ParaId>;
      
      /// How a XCM over HRMP from a sibling parachain should be processed.
      type XcmpProcessor: ProcessMessage<Origin = ParaId>;
      
      /// The maximal number of suspended XCMP channels at the same time.
      #[pallet::constant]
      type MaxInboundSuspended: Get<u32>;
      ```
      
      How to configure those:
      
      ```rust
      // Use the MessageQueue pallet to store messages for later processing. The `TransformOrigin` is needed since
      // the MQ pallet itself operators on `AggregateMessageOrigin` but we want to enqueue `ParaId`s.
      type XcmpQueue = TransformOrigin<MessageQueue, AggregateMessageOrigin, ParaId, ParaIdToSibling>;
      
      // Process XCMP messages from siblings. This is type-safe to only accept `ParaId`s. They will be dispatched
      // with origin `Junction::Sibling(…)`.
      type XcmpProcessor = ProcessFromSibling<
      	ProcessXcmMessage<
      		AggregateMessageOrigin,
      		xcm_executor::XcmExecutor<xcm_config::XcmConfig>,
      		RuntimeCall,
      	>,
      >;
      
      // Not really important what to choose here. Just something larger than the maximal number of channels.
      type MaxInboundSuspended = sp_core::ConstU32<1_000>;
      ```
      
      The `InboundXcmpStatus` storage item was replaced by
      `InboundXcmpSuspended` since it now only tracks inbound queue suspension
      and no message indices anymore.
      
      Now only sends the most recent channel `Signals`, as all prio ones are
      out-dated anyway.
      
      ### Parachain System pallet
      
      For `DMP` messages instead of forwarding them to the `DMP` pallet, it
      now pushes them to the configured `DmpQueue`. The message processing
      which was triggered in `set_validation_data` is now being done by the MQ
      pallet `on_initialize`.
      
      XCMP messages are still handed off to the `XcmpMessageHandler`
      (XCMP-Queue pallet) - no change here.
      
      New config items for the parachain system pallet:
      ```rust
      /// Queues inbound downward messages for delayed processing. 
      ///
      /// Analogous to the `XcmpQueue` of the XCMP queue pallet.
      type DmpQueue: EnqueueMessage<AggregateMessageOrigin>;
      ``` 
      
      How to configure:
      ```rust
      /// Use the MQ pallet to store DMP messages for delayed processing.
      type DmpQueue = MessageQueue;
      ``` 
      
      ## Message Flow
      
      The flow of messages on the parachain side. Messages come in from the
      left via the `Validation Data` and finally end up at the `Xcm Executor`
      on the right.
      
      ![Untitled
      (1)](https://github.com/paritytech/cumulus/assets/10380170/6cf8b377-88c9-4aed-96df-baace266e04d)
      
      ## Further changes
      
      - Bumped the default suspension, drop and resume thresholds in
      `QueueConfigData::default()`.
      - `XcmpQueue::{suspend_xcm_execution, resume_xcm_execution}` errors when
      they would be a noop.
      - Properly validate the `QueueConfigData` before setting it.
      - Marked weight files as auto-generated so they wont auto-expand in the
      MR files view.
      - Move the `hypothetical` asserts to `frame_support` under the name
      `experimental_hypothetically`
      
      Questions:
      - [ ] What about the ugly `#[cfg(feature = \"runtime-benchmarks\")]` in
      the runtimes? Not sure how to best fix. Just having them like this makes
      tests fail that rely on the real message processor when the feature is
      enabled.
      - [ ] Need a good weight for `MessageQueueServiceWeight`. The scheduler
      already takes 80% so I put it to 10% but that is quite low.
      
      TODO:
      - [x] Remove c&p code after
      https://github.com/paritytech/polkadot/pull/6271
      - [x] Use `HandleMessage` once it is public in Substrate
      - [x] fix `runtime-benchmarks` feature
      https://github.com/paritytech/polkadot/pull/6966
      
      
      - [x] Benchmarks
      - [x] Tests
      - [ ] Migrate `InboundXcmpStatus` to `InboundXcmpSuspended`
      - [x] Possibly cleanup Migrations (DMP+XCMP)
      - [x] optional: create `TransformProcessMessageOrigin` in Substrate and
      replace `ProcessFromSibling`
      - [ ] Rerun weights on ref HW
      
      ---------
      
      Signed-off-by: default avatarOliver Tale-Yazdi <[email protected]>
      Co-authored-by: default avatarLiam Aharon <[email protected]>
      Co-authored-by: default avatarjoe petrowski <[email protected]>
      Co-authored-by: default avatarKian Paimani <[email protected]>
      Co-authored-by: command-bot <>
      e1c033eb
  2. Oct 11, 2023
    • Branislav Kontur's avatar
      Xcm emulator nits (#1649) · cfb29254
      Branislav Kontur authored
      # Desription
      
      ## Summary 
      
      This PR introduces several nits and tweaks to xcm emulator tests for
      system parachains.
      
      ## Explanation
      
      **Deduplicate `XcmPallet::send(` with root origin code**
      - Introduced `send_transact_to_parachain` which could be easily reuse
      for scenarios like _governance call from relay chain to parachain_.
      
      **Refactor `send_transact_sudo_from_relay_to_system_para_works`**
      - Test covered just one use-case which was moved to the
      `do_force_create_asset_from_relay_to_system_para`, so now we can extend
      this test with more _governance-like_ senarios.
      - Renamed to
      `send_transact_as_superuser_from_relay_to_system_para_works`.
      
      **Remove `send_transact_native_from_relay_to_system_para_fails` test**
      - This test and/or description is kind of misleading, because system
      paras support Native from relay chain by `RelayChainAsNative` with
      correct xcm origin.
      - It tested only sending on relay chain which should go directly to the
      relay chain unit-tests (does not even need to be in xcm emulator level).
      
      ## Future directions
      
      Check restructure parachains integration tests
      [issue](https://github.com/paritytech/polkadot-sdk/issues/1389) and [PR
      with more TODOs](https://github.com/paritytech/polkadot-sdk/pull/1693
      
      ).
      
      ---------
      
      Co-authored-by: default avatarIgnacio Palacios <[email protected]>
      cfb29254
  3. Oct 10, 2023
  4. Sep 29, 2023
  5. Sep 05, 2023
    • joe petrowski's avatar
      Move Relay-Specific Shared Code to One Place (#1193) · a1469180
      joe petrowski authored
      * add common libs
      
      * asset hubs
      
      * add westend
      
      * bridge hubs
      
      * collectives
      
      * contracts
      
      * emulated tests
      
      * parachain bin
      
      * delete collectives constants and update docs
      
      * integration tests should have apache license (some missing, some needed changing)
      
      * propagate features
      
      * fmt
      a1469180
  6. Sep 01, 2023
    • Ignacio Palacios's avatar
      [xcm-emulator] Improve hygiene and clean up (#1301) · 241601b1
      Ignacio Palacios authored
      * improve hygiene & clean up
      
      * improve hygiene & clean up - xcm-emulator
      
      * improve hygiene & clean up - common
      
      * improve hygiene & clean up - tests
      
      * improve hygiene & clean up - tests 2
      
      * last hygiene bits
      
      * ".git/.scripts/commands/fmt/fmt.sh"
      
      ---------
      
      Co-authored-by: command-bot <>
      241601b1
  7. Aug 30, 2023
  8. Aug 10, 2023
    • Ignacio Palacios's avatar
      Replicate `e2e` integration test as `emulated` (#2958) · eadfbca3
      Ignacio Palacios authored
      
      
      * Allow functions to work over both parachains and relay chains
      
      * additional references
      
      * import
      
      * backup
      
      * refactoring para and relay traits
      
      * use runtime crates to build types
      
      * decouple ProcessMessage
      
      * decouple ProcessMessage 2
      
      * dmp and xcmp handlers decouple
      
      * backup
      
      * refactor done
      
      * common int values working
      
      * added global ext with mutex
      
      * works for two mutex
      
      * single mutex and remove condvar
      
      * global test ext done
      
      * failing moving test_ext because relay block num
      
      * relay_block_number issue fixed
      
      * backup
      
      * Test working with assertions
      
      * assertions get Test as arg
      
      * DispatchArgs as generic
      
      * clean up
      
      * backup
      
      * teleports for asset-hub-kusama done
      
      * improve assert_expected_events macro
      
      * rename Test generics
      
      * check assertions for tuples
      
      * test assertions redone
      
      * reserve_transfer_assets done
      
      * send transact done
      
      * hrmp test for paras
      
      * hrmp channels test done
      
      * hrmp channels test done 2
      
      * before modifying test dispatch
      
      * reserve tests done & Test dispatch fixed
      
      * reserve transfer local asset
      
      * force_create_and_mint_asset
      
      * force create and mint done
      
      * tests done
      
      * fix imports in common
      
      * common events refactored
      
      * add option to events attributes
      
      * asset-hub-polkadot tests done
      
      * asset-hub-westend half done
      
      * relay chain events move to common
      
      * remove failing send tests for asset-hub-westend
      
      * added events to bridge-hub-rococo
      
      * added events to collectives-polkadot
      
      * cargo clean up
      
      * fix asset-hub-westend tests
      
      * ".git/.scripts/commands/fmt/fmt.sh"
      
      * fix clippy
      
      * ".git/.scripts/commands/fmt/fmt.sh"
      
      * Removed unnecessary deps
      
      * Extracted some commonality for Kusama/Polkadot (which will be reused also for BridgeHubs) (#2971)
      
      * Extracted some commonality for Kusama/Polkadot (which will be reused also for BridgeHubs)
      
      * AssetHubRococo should better use AssetHubKusama runtime
      
      * add fund_account
      
      ---------
      
      Co-authored-by: default avatarNachoPal <[email protected]>
      
      * address comments
      
      * rename event assertion helpers
      
      * clean comments
      
      * address comments 2
      
      * ".git/.scripts/commands/fmt/fmt.sh"
      
      ---------
      
      Co-authored-by: default avatarGiles Cope <[email protected]>
      Co-authored-by: command-bot <>
      Co-authored-by: default avatarBranislav Kontur <[email protected]>
      eadfbca3
  9. Jul 05, 2023
    • Ignacio Palacios's avatar
      Add Bridges to `xcm-emulator` (#2812) · f6b33fe9
      Ignacio Palacios authored
      
      
      * rename bridge hub + BridgeMessages type
      
      * bridge base
      
      * bridge string approach
      
      * add decl_test_bridges macro
      
      * outbound lanes on the way
      
      * get & dispatch mock bridge done
      
      * fix bridge errors + log::debug for messages
      
      * clean up
      
      * update source OutboundLaneData
      
      * rococo & wococo added
      
      * sender_receiver_accounts_parameter_types macro
      
      * sender_receiver_accounts_parameter_types macro 2
      
      * fixed multi parachain + example on the way
      
      * working but router error
      
      * bridge working
      
      * refactor NetworkComponent
      
      * make it generic
      
      * working as generic
      
      * clean up
      
      * last bit
      
      * ".git/.scripts/commands/fmt/fmt.sh"
      
      * fix bridge hub handler name
      
      * ".git/.scripts/commands/fmt/fmt.sh"
      
      * add AssetConversion back for AssetHubWestend
      
      * Update xcm/xcm-emulator/src/lib.rs
      
      Co-authored-by: default avatarSquirrel <[email protected]>
      
      * add LaneId wrapper
      
      * update substrate
      
      * fix wrapper conversion
      
      * remove duplicate in workspace
      
      * Revert "update substrate"
      
      This reverts commit 92e8f201ae433aed3f70b998ebd4c23d9168d0ee.
      
      * ".git/.scripts/commands/fmt/fmt.sh"
      
      ---------
      
      Co-authored-by: command-bot <>
      Co-authored-by: default avatarSquirrel <[email protected]>
      f6b33fe9