Files
pezkuwi-subxt/cumulus/polkadot-parachain/Cargo.toml
T
Oliver Tale-Yazdi e1c033ebe1 Use Message Queue as DMP and XCMP dispatch queue (#1246)
(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: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
Co-authored-by: Liam Aharon <liam.aharon@hotmail.com>
Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>
Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
Co-authored-by: command-bot <>
2023-11-02 15:31:38 +01:00

153 lines
7.2 KiB
TOML

[package]
name = "polkadot-parachain-bin"
version = "1.1.0"
authors.workspace = true
build = "build.rs"
edition.workspace = true
description = "Runs a polkadot parachain node which could be a collator."
license = "Apache-2.0"
[[bin]]
name = "polkadot-parachain"
path = "src/main.rs"
[dependencies]
async-trait = "0.1.73"
clap = { version = "4.4.6", features = ["derive"] }
codec = { package = "parity-scale-codec", version = "3.0.0" }
futures = "0.3.28"
hex-literal = "0.4.1"
log = "0.4.20"
serde = { version = "1.0.188", features = ["derive"] }
serde_json = "1.0.107"
# Local
rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" }
shell-runtime = { path = "../parachains/runtimes/starters/shell" }
glutton-runtime = { path = "../parachains/runtimes/glutton/glutton-kusama" }
seedling-runtime = { path = "../parachains/runtimes/starters/seedling" }
asset-hub-polkadot-runtime = { path = "../parachains/runtimes/assets/asset-hub-polkadot" }
asset-hub-kusama-runtime = { path = "../parachains/runtimes/assets/asset-hub-kusama" }
asset-hub-rococo-runtime = { path = "../parachains/runtimes/assets/asset-hub-rococo" }
asset-hub-westend-runtime = { path = "../parachains/runtimes/assets/asset-hub-westend" }
collectives-polkadot-runtime = { path = "../parachains/runtimes/collectives/collectives-polkadot" }
contracts-rococo-runtime = { path = "../parachains/runtimes/contracts/contracts-rococo" }
bridge-hub-rococo-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-rococo" }
bridge-hub-kusama-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-kusama" }
bridge-hub-polkadot-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-polkadot" }
bridge-hub-westend-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-westend" }
penpal-runtime = { path = "../parachains/runtimes/testing/penpal" }
jsonrpsee = { version = "0.16.2", features = ["server"] }
parachains-common = { path = "../parachains/common" }
# Substrate
frame-benchmarking = { path = "../../substrate/frame/benchmarking" }
frame-benchmarking-cli = { path = "../../substrate/utils/frame/benchmarking-cli" }
sp-runtime = { path = "../../substrate/primitives/runtime", default-features = false}
sp-io = { path = "../../substrate/primitives/io" }
sp-core = { path = "../../substrate/primitives/core" }
sp-session = { path = "../../substrate/primitives/session" }
sc-consensus = { path = "../../substrate/client/consensus/common" }
sc-cli = { path = "../../substrate/client/cli" }
sc-client-api = { path = "../../substrate/client/api" }
sc-executor = { path = "../../substrate/client/executor" }
sc-service = { path = "../../substrate/client/service" }
sc-telemetry = { path = "../../substrate/client/telemetry" }
sc-transaction-pool = { path = "../../substrate/client/transaction-pool" }
sp-transaction-pool = { path = "../../substrate/primitives/transaction-pool" }
sc-network = { path = "../../substrate/client/network" }
sc-network-sync = { path = "../../substrate/client/network/sync" }
sc-basic-authorship = { path = "../../substrate/client/basic-authorship" }
sp-timestamp = { path = "../../substrate/primitives/timestamp" }
sp-blockchain = { path = "../../substrate/primitives/blockchain" }
sp-block-builder = { path = "../../substrate/primitives/block-builder" }
sp-keystore = { path = "../../substrate/primitives/keystore" }
sc-chain-spec = { path = "../../substrate/client/chain-spec" }
sc-rpc = { path = "../../substrate/client/rpc" }
sc-tracing = { path = "../../substrate/client/tracing" }
sp-offchain = { path = "../../substrate/primitives/offchain" }
sp-api = { path = "../../substrate/primitives/api" }
sp-consensus-aura = { path = "../../substrate/primitives/consensus/aura" }
sc-sysinfo = { path = "../../substrate/client/sysinfo" }
substrate-prometheus-endpoint = { path = "../../substrate/utils/prometheus" }
sc-transaction-pool-api = { path = "../../substrate/client/transaction-pool/api" }
frame-rpc-system = { package = "substrate-frame-rpc-system", path = "../../substrate/utils/frame/rpc/system" }
pallet-transaction-payment-rpc = { path = "../../substrate/frame/transaction-payment/rpc" }
substrate-state-trie-migration-rpc = { path = "../../substrate/utils/frame/rpc/state-trie-migration-rpc" }
# Polkadot
# Use rococo-native as this is currently the default "local" relay chain
polkadot-cli = { path = "../../polkadot/cli", features = ["rococo-native"] }
polkadot-primitives = { path = "../../polkadot/primitives" }
polkadot-service = { path = "../../polkadot/node/service" }
xcm = { package = "staging-xcm", path = "../../polkadot/xcm" }
# Cumulus
cumulus-client-cli = { path = "../client/cli" }
cumulus-client-collator = { path = "../client/collator" }
cumulus-client-consensus-aura = { path = "../client/consensus/aura" }
cumulus-client-consensus-relay-chain = { path = "../client/consensus/relay-chain" }
cumulus-client-consensus-common = { path = "../client/consensus/common" }
cumulus-client-consensus-proposer = { path = "../client/consensus/proposer" }
cumulus-client-service = { path = "../client/service" }
cumulus-primitives-aura = { path = "../primitives/aura" }
cumulus-primitives-core = { path = "../primitives/core" }
cumulus-primitives-parachain-inherent = { path = "../primitives/parachain-inherent" }
cumulus-relay-chain-interface = { path = "../client/relay-chain-interface" }
color-print = "0.3.4"
[build-dependencies]
substrate-build-script-utils = { path = "../../substrate/utils/build-script-utils" }
[dev-dependencies]
assert_cmd = "2.0"
nix = { version = "0.26.1", features = ["signal"] }
tempfile = "3.8.0"
tokio = { version = "1.32.0", features = ["macros", "time", "parking_lot"] }
wait-timeout = "0.2"
[features]
default = []
runtime-benchmarks = [
"asset-hub-kusama-runtime/runtime-benchmarks",
"asset-hub-polkadot-runtime/runtime-benchmarks",
"asset-hub-rococo-runtime/runtime-benchmarks",
"asset-hub-westend-runtime/runtime-benchmarks",
"bridge-hub-kusama-runtime/runtime-benchmarks",
"bridge-hub-polkadot-runtime/runtime-benchmarks",
"bridge-hub-rococo-runtime/runtime-benchmarks",
"bridge-hub-westend-runtime/runtime-benchmarks",
"collectives-polkadot-runtime/runtime-benchmarks",
"contracts-rococo-runtime/runtime-benchmarks",
"cumulus-primitives-core/runtime-benchmarks",
"frame-benchmarking-cli/runtime-benchmarks",
"frame-benchmarking/runtime-benchmarks",
"glutton-runtime/runtime-benchmarks",
"parachains-common/runtime-benchmarks",
"penpal-runtime/runtime-benchmarks",
"polkadot-cli/runtime-benchmarks",
"polkadot-primitives/runtime-benchmarks",
"polkadot-service/runtime-benchmarks",
"rococo-parachain-runtime/runtime-benchmarks",
"sc-service/runtime-benchmarks",
"sp-runtime/runtime-benchmarks",
]
try-runtime = [
"asset-hub-kusama-runtime/try-runtime",
"asset-hub-polkadot-runtime/try-runtime",
"asset-hub-rococo-runtime/try-runtime",
"asset-hub-westend-runtime/try-runtime",
"bridge-hub-kusama-runtime/try-runtime",
"bridge-hub-polkadot-runtime/try-runtime",
"bridge-hub-rococo-runtime/try-runtime",
"bridge-hub-westend-runtime/try-runtime",
"collectives-polkadot-runtime/try-runtime",
"contracts-rococo-runtime/try-runtime",
"glutton-runtime/try-runtime",
"penpal-runtime/try-runtime",
"polkadot-cli/try-runtime",
"polkadot-service/try-runtime",
"shell-runtime/try-runtime",
"sp-runtime/try-runtime",
]