--- a/Cargo.lock +++ b/Cargo.lock @@ -6450,6 +6450,7 @@ "cumulus-pallet-parachain-system", "cumulus-pallet-xcm", "cumulus-pallet-xcmp-queue", + "cumulus-primitives-aura", "cumulus-primitives-core", "cumulus-primitives-timestamp", "cumulus-primitives-utility", @@ -8109,12 +8110,14 @@ "pallet-evm-coder-substrate", "pallet-nonfungible", "pallet-refungible", + "pallet-structure", "parity-scale-codec", "scale-info", "sp-core", "sp-io", "sp-runtime", "sp-std", + "up-common", "up-data-structs", ] @@ -14732,6 +14735,7 @@ "cumulus-client-consensus-proposer", "cumulus-client-network", "cumulus-client-service", + "cumulus-primitives-aura", "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", "cumulus-relay-chain-inprocess-interface", --- a/Cargo.toml +++ b/Cargo.toml @@ -100,6 +100,7 @@ cumulus-pallet-parachain-system = { default-features = false, git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.1.0" } cumulus-pallet-xcm = { default-features = false, git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.1.0" } cumulus-pallet-xcmp-queue = { default-features = false, git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.1.0" } +cumulus-primitives-aura = { default-features = false, git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.1.0" } cumulus-primitives-core = { default-features = false, git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.1.0" } cumulus-primitives-parachain-inherent = { default-features = false, git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.1.0" } cumulus-primitives-timestamp = { default-features = false, git = "https://github.com/paritytech/polkadot-sdk", branch = "release-polkadot-v1.1.0" } --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -36,6 +36,7 @@ cumulus-client-consensus-proposer = { workspace = true } cumulus-client-network = { workspace = true } cumulus-client-service = { workspace = true } +cumulus-primitives-aura = { workspace = true } cumulus-primitives-core = { workspace = true } cumulus-primitives-parachain-inherent = { features = ["std"], workspace = true } cumulus-relay-chain-inprocess-interface = { workspace = true } @@ -113,7 +114,9 @@ 'quartz-runtime?/gov-test-timings', 'unique-runtime?/gov-test-timings', ] -lookahead = [] +lookahead = [ + 'opal-runtime/lookahead' +] pov-estimate = [ 'opal-runtime/pov-estimate', 'quartz-runtime?/pov-estimate', --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -221,6 +221,14 @@ { } ); +#[cfg(not(feature = "lookahead"))] +ez_bounds!( + pub trait LookaheadApiDep {} +); +#[cfg(feature = "lookahead")] +ez_bounds!( + pub trait LookaheadApiDep: cumulus_primitives_aura::AuraUnincludedSegmentApi {} +); /// Starts a `ServiceBuilder` for a full service. /// @@ -358,6 +366,7 @@ + Sync + 'static, RuntimeApi::RuntimeApi: RuntimeApiDep + 'static, + RuntimeApi::RuntimeApi: LookaheadApiDep, Runtime: RuntimeInstance, ExecutorDispatch: NativeExecutionDispatch + 'static, { @@ -687,6 +696,8 @@ announce_block: Arc>) + Send + Sync>, } +// Clones ignored for optional lookahead collator +#[allow(clippy::redundant_clone)] pub fn start_consensus( client: Arc>, transaction_pool: Arc< @@ -701,6 +712,7 @@ + Sync + 'static, RuntimeApi::RuntimeApi: RuntimeApiDep + 'static, + RuntimeApi::RuntimeApi: LookaheadApiDep, Runtime: RuntimeInstance, { let StartConsensusParameters { @@ -735,12 +747,12 @@ client.clone(), ); - let block_import = ParachainBlockImport::new(client.clone(), backend); + let block_import = ParachainBlockImport::new(client.clone(), backend.clone()); let params = BuildAuraConsensusParams { create_inherent_data_providers: move |_, ()| async move { Ok(()) }, block_import, - para_client: client, + para_client: client.clone(), #[cfg(feature = "lookahead")] para_backend: backend, para_id, @@ -751,10 +763,19 @@ proposer, collator_service, // With async-baking, we allowed to be both slower (longer authoring) and faster (multiple para blocks per relay block) + #[cfg(not(feature = "lookahead"))] authoring_duration: Duration::from_millis(500), + #[cfg(feature = "lookahead")] + authoring_duration: Duration::from_millis(1500), overseer_handle, #[cfg(feature = "lookahead")] - code_hash_provider: || {}, + code_hash_provider: move |block_hash| { + client + .code_at(block_hash) + .ok() + .map(cumulus_primitives_core::relay_chain::ValidationCode) + .map(|c| c.hash()) + }, collator_key, relay_chain_slot_duration, }; @@ -762,7 +783,10 @@ task_manager.spawn_essential_handle().spawn( "aura", None, + #[cfg(not(feature = "lookahead"))] run_aura::<_, AuraAuthorityPair, _, _, _, _, _, _, _>(params), + #[cfg(feature = "lookahead")] + run_aura::<_, AuraAuthorityPair, _, _, _, _, _, _, _, _, _>(params), ); Ok(()) } --- a/runtime/common/runtime_apis.rs +++ b/runtime/common/runtime_apis.rs @@ -679,6 +679,17 @@ } } + #[cfg(feature = "lookahead")] + impl cumulus_primitives_aura::AuraUnincludedSegmentApi for Runtime { + fn can_build_upon( + _included_hash: ::Hash, + _slot: cumulus_primitives_aura::Slot, + ) -> bool { + // FIXME: Limit velocity + true + } + } + /// Should never be used, yet still required because of https://github.com/paritytech/polkadot-sdk/issues/27 /// Not allowed to panic, because rpc may be called using native runtime, thus causing thread panic. impl fp_rpc::ConvertTransactionRuntimeApi for Runtime { --- a/runtime/opal/Cargo.toml +++ b/runtime/opal/Cargo.toml @@ -69,6 +69,7 @@ 'cumulus-pallet-parachain-system/std', 'cumulus-pallet-xcm/std', 'cumulus-pallet-xcmp-queue/std', + 'cumulus-primitives-aura/std', 'cumulus-primitives-core/std', 'cumulus-primitives-utility/std', 'frame-executive/std', @@ -230,6 +231,7 @@ preimage = [] refungible = [] session-test-timings = [] +lookahead = [] ################################################################################ # local dependencies @@ -240,6 +242,7 @@ cumulus-pallet-parachain-system = { workspace = true } cumulus-pallet-xcm = { workspace = true } cumulus-pallet-xcmp-queue = { workspace = true } +cumulus-primitives-aura = { workspace = true } cumulus-primitives-core = { workspace = true } cumulus-primitives-timestamp = { workspace = true } cumulus-primitives-utility = { workspace = true }