diff --git a/cumulus/polkadot-omni-node/lib/src/nodes/aura.rs b/cumulus/polkadot-omni-node/lib/src/nodes/aura.rs index cea6bd9fac352..bd3237cc6d3fa 100644 --- a/cumulus/polkadot-omni-node/lib/src/nodes/aura.rs +++ b/cumulus/polkadot-omni-node/lib/src/nodes/aura.rs @@ -78,7 +78,7 @@ use sp_runtime::{ traits::{Block as BlockT, Header as HeaderT, UniqueSaturatedInto}, }; use sp_transaction_storage_proof::runtime_api::TransactionStorageApi; -use std::{marker::PhantomData, sync::Arc, time::Duration}; +use std::{marker::PhantomData, ops::Sub, sync::Arc, time::Duration}; struct Verifier { client: Arc, @@ -414,6 +414,16 @@ where >, > + Send + Sync { + const RELAY_CHAIN_SLOT_DURATION_MILLIS: u64 = 6000; + + // Start 2 hours in the past to avoid timestamps immediately running into the future. + let initial_relay_slot = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .expect("Current time is always after UNIX_EPOCH; qed") + .sub(Duration::from_secs(2 * 60 * 60)) + .as_millis() as u64 / + RELAY_CHAIN_SLOT_DURATION_MILLIS; + move |block: Hash, ()| { let current_para_head = client .header(block) @@ -435,17 +445,23 @@ where let relay_parent_offset = client.runtime_api().relay_parent_offset(block).unwrap_or_default(); - // Standard relay chain slot duration for all relay chain networks. - const RELAY_CHAIN_SLOT_DURATION_MILLIS: u64 = 6000; - let relay_blocks_per_para_block = (slot_duration.as_millis() / RELAY_CHAIN_SLOT_DURATION_MILLIS).max(1) as u32; + // Each para block gets a unique relay slot: initial_relay_slot + + // relay_blocks_per_para_block * block_number + let target_relay_slot = initial_relay_slot + + u64::from(current_block_number) * u64::from(relay_blocks_per_para_block); + + let relay_offset = (target_relay_slot as u32) + .saturating_sub(relay_blocks_per_para_block * current_block_number); + let mocked_parachain = MockValidationDataInherentDataProvider::<()> { current_para_block: current_block_number, para_id, current_para_block_head, relay_blocks_per_para_block, + relay_offset, relay_parent_offset, para_blocks_per_relay_epoch: 10, upgrade_go_ahead: should_send_go_ahead.then(|| { @@ -455,9 +471,9 @@ where ..Default::default() }; - let timestamp_provider = sp_timestamp::InherentDataProvider::new( - (slot_duration.as_millis() * current_block_number as u64).into(), - ); + let timestamp = target_relay_slot * RELAY_CHAIN_SLOT_DURATION_MILLIS; + + let timestamp_provider = sp_timestamp::InherentDataProvider::new(timestamp.into()); futures::future::ready(Ok((timestamp_provider, mocked_parachain))) } diff --git a/prdoc/pr_10807.prdoc b/prdoc/pr_10807.prdoc new file mode 100644 index 0000000000000..7875fca876ceb --- /dev/null +++ b/prdoc/pr_10807.prdoc @@ -0,0 +1,8 @@ +title: 'Omni-node: Move timestamps closer to now' +doc: +- audience: Node Dev + description: |- + Blocks produced with Omni-nodes dev-mode are now closer to the current time. Previously they were starting at `UNIX_EPOCH`. +crates: +- name: polkadot-omni-node-lib + bump: patch