From 695c70dc4a1b3731505b5675c690feae96eece52 Mon Sep 17 00:00:00 2001 From: alindima Date: Wed, 12 Nov 2025 11:36:49 +0200 Subject: [PATCH 1/7] fix genesis eth block builder number again --- substrate/frame/revive/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/substrate/frame/revive/src/lib.rs b/substrate/frame/revive/src/lib.rs index e8c9c638bc59c..1210c391b3345 100644 --- a/substrate/frame/revive/src/lib.rs +++ b/substrate/frame/revive/src/lib.rs @@ -829,7 +829,9 @@ pub mod pallet { } // Build genesis block - block_storage::on_finalize_build_eth_block::(0u32.into()); + block_storage::on_finalize_build_eth_block::( + frame_system::Pallet::::block_number().into(), + ); // Set debug settings. if let Some(settings) = self.debug_settings.as_ref() { From c4bbfb9da9c7fdd99ea1baa3693142879e60c29a Mon Sep 17 00:00:00 2001 From: alindima Date: Wed, 12 Nov 2025 11:40:27 +0200 Subject: [PATCH 2/7] fix and add comment --- substrate/frame/revive/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/substrate/frame/revive/src/lib.rs b/substrate/frame/revive/src/lib.rs index 1210c391b3345..3b6f884711f7a 100644 --- a/substrate/frame/revive/src/lib.rs +++ b/substrate/frame/revive/src/lib.rs @@ -830,7 +830,9 @@ pub mod pallet { // Build genesis block block_storage::on_finalize_build_eth_block::( - frame_system::Pallet::::block_number().into(), + // Make sure to use the block number from storage instead of the hardcoded 0. + // This enables testing tools like anvil to customise the genesis block number. + frame_system::Pallet::::block_number(), ); // Set debug settings. From 1dc1276e382692d2251e234268be44369634cb2b Mon Sep 17 00:00:00 2001 From: alindima Date: Wed, 12 Nov 2025 12:35:35 +0200 Subject: [PATCH 3/7] add unit test to prevent regression --- Cargo.lock | 1 + substrate/frame/revive/Cargo.toml | 1 + substrate/frame/revive/src/tests.rs | 15 ++++++++++-- .../frame/revive/src/tests/block_hash.rs | 23 ++++++++++++++++++- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3956b012f64d4..ae446c1f38fdd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13320,6 +13320,7 @@ dependencies = [ "sp-io", "sp-keystore", "sp-runtime", + "sp-state-machine", "sp-tracing 16.0.0", "sp-version", "substrate-bn", diff --git a/substrate/frame/revive/Cargo.toml b/substrate/frame/revive/Cargo.toml index 3c655612e490c..800431ab10faa 100644 --- a/substrate/frame/revive/Cargo.toml +++ b/substrate/frame/revive/Cargo.toml @@ -83,6 +83,7 @@ pallet-utility = { workspace = true, default-features = true } proptest = { workspace = true } sp-keystore = { workspace = true, default-features = true } sp-tracing = { workspace = true, default-features = true } +sp-state-machine = { workspace = true } [features] default = ["std"] diff --git a/substrate/frame/revive/src/tests.rs b/substrate/frame/revive/src/tests.rs index f09afd070789a..6b992919600f0 100644 --- a/substrate/frame/revive/src/tests.rs +++ b/substrate/frame/revive/src/tests.rs @@ -50,7 +50,7 @@ use sp_keystore::{testing::MemoryKeystore, KeystoreExt}; use sp_runtime::{ generic::Header, traits::{BlakeTwo256, Convert, IdentityLookup, One}, - AccountId32, BuildStorage, MultiAddress, MultiSignature, Perbill, + AccountId32, BuildStorage, MultiAddress, MultiSignature, Perbill, Storage, }; pub type Address = MultiAddress; @@ -439,6 +439,7 @@ pub struct ExtBuilder { storage_version: Option, code_hashes: Vec, genesis_config: Option>, + genesis_state_overrides: Option, } impl Default for ExtBuilder { @@ -448,6 +449,7 @@ impl Default for ExtBuilder { storage_version: None, code_hashes: vec![], genesis_config: Some(crate::GenesisConfig::::default()), + genesis_state_overrides: None, } } } @@ -469,10 +471,19 @@ impl ExtBuilder { pub fn set_associated_consts(&self) { EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = self.existential_deposit); } + pub fn with_genesis_state_overrides(mut self, storage: Storage) -> Self { + self.genesis_state_overrides = Some(storage); + self + } pub fn build(self) -> sp_io::TestExternalities { sp_tracing::try_init_simple(); self.set_associated_consts(); - let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + let mut t = self.genesis_state_overrides.unwrap_or_default(); + + frame_system::GenesisConfig::::default() + .assimilate_storage(&mut t) + .unwrap(); + let checking_account = Pallet::::checking_account(); pallet_balances::GenesisConfig:: { diff --git a/substrate/frame/revive/src/tests/block_hash.rs b/substrate/frame/revive/src/tests/block_hash.rs index 68685481c6b5e..d83b55916e9be 100644 --- a/substrate/frame/revive/src/tests/block_hash.rs +++ b/substrate/frame/revive/src/tests/block_hash.rs @@ -20,7 +20,7 @@ use crate::{ evm::{block_hash::EthereumBlockBuilder, fees::InfoT, Block, TransactionSigned}, test_utils::{builder::Contract, deposit_limit, ALICE}, - tests::{assert_ok, builder, Contracts, ExtBuilder, RuntimeOrigin, Test}, + tests::{assert_ok, builder, Contracts, ExtBuilder, RuntimeOrigin, System, Test, Timestamp}, BalanceWithDust, Code, Config, EthBlock, EthBlockBuilderFirstValues, EthBlockBuilderIR, EthereumBlock, Pallet, ReceiptGasInfo, ReceiptInfoData, }; @@ -31,6 +31,7 @@ use frame_support::traits::{ Hooks, }; use pallet_revive_fixtures::compile_module; +use sp_state_machine::BasicExternalities; #[test] fn on_initialize_clears_storage() { @@ -52,6 +53,26 @@ fn on_initialize_clears_storage() { }); } +#[test] +fn genesis_block_number_and_timestamp_fetched_from_storage() { + let mut ext = BasicExternalities::new_empty(); + ext.execute_with(|| { + System::set_block_number(10); + Timestamp::set_timestamp(10000000); + }); + let storage = ext.into_storages(); + + ExtBuilder::default() + .with_genesis_state_overrides(storage) + .build() + .execute_with(|| { + let block = EthereumBlock::::get(); + // The timestamp is divided by 1000 (converted to seconds) + assert_eq!(block.timestamp, 10000.into()); + assert_eq!(block.number, 10.into()); + }); +} + #[test] fn transactions_are_captured() { let (binary, _) = compile_module("dummy").unwrap(); From 7fc83982660e65d950569ff2996805cf4b254064 Mon Sep 17 00:00:00 2001 From: alindima Date: Wed, 12 Nov 2025 12:39:00 +0200 Subject: [PATCH 4/7] add prdoc --- prdoc/prdoc_10297.prdoc | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 prdoc/prdoc_10297.prdoc diff --git a/prdoc/prdoc_10297.prdoc b/prdoc/prdoc_10297.prdoc new file mode 100644 index 0000000000000..18f5206493f5d --- /dev/null +++ b/prdoc/prdoc_10297.prdoc @@ -0,0 +1,10 @@ +title: "pallet_revive: use real storage for block number when building the eth genesis block" +doc: +- audience: Runtime Dev + description: |- + When building the eth genesis block, query the real storage item that stores the block number instead of using zero. + If the chainspec does not customise it, it will remain zeroed. Was previously fixed in https://github.com/paritytech/polkadot-sdk/pull/10225 + and regression introduced in https://github.com/paritytech/polkadot-sdk/pull/10271. Adds a unit test and comment to prevent further regressions. +crates: +- name: pallet-revive + bump: patch From 4a47c0ccb2e03a53824f98b3330552b1aa831e8f Mon Sep 17 00:00:00 2001 From: alindima Date: Wed, 12 Nov 2025 12:41:04 +0200 Subject: [PATCH 5/7] fix prdoc name --- prdoc/{prdoc_10297.prdoc => pr_10297.prdoc} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename prdoc/{prdoc_10297.prdoc => pr_10297.prdoc} (100%) diff --git a/prdoc/prdoc_10297.prdoc b/prdoc/pr_10297.prdoc similarity index 100% rename from prdoc/prdoc_10297.prdoc rename to prdoc/pr_10297.prdoc From 786fbd0d2f795e8eb0f9aae4caea5c4394d579e4 Mon Sep 17 00:00:00 2001 From: alindima Date: Wed, 12 Nov 2025 12:45:57 +0200 Subject: [PATCH 6/7] fix cargo toml format --- substrate/frame/revive/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/frame/revive/Cargo.toml b/substrate/frame/revive/Cargo.toml index 800431ab10faa..8e1bff57ae4c2 100644 --- a/substrate/frame/revive/Cargo.toml +++ b/substrate/frame/revive/Cargo.toml @@ -82,8 +82,8 @@ pallet-timestamp = { workspace = true, default-features = true } pallet-utility = { workspace = true, default-features = true } proptest = { workspace = true } sp-keystore = { workspace = true, default-features = true } -sp-tracing = { workspace = true, default-features = true } sp-state-machine = { workspace = true } +sp-tracing = { workspace = true, default-features = true } [features] default = ["std"] From 68927d08980595d9e58c7345cc1078a67ded76ec Mon Sep 17 00:00:00 2001 From: alindima Date: Wed, 12 Nov 2025 12:47:25 +0200 Subject: [PATCH 7/7] fix feature propagation --- substrate/frame/revive/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/substrate/frame/revive/Cargo.toml b/substrate/frame/revive/Cargo.toml index 8e1bff57ae4c2..d51d6db753546 100644 --- a/substrate/frame/revive/Cargo.toml +++ b/substrate/frame/revive/Cargo.toml @@ -128,6 +128,7 @@ std = [ "sp-io/std", "sp-keystore/std", "sp-runtime/std", + "sp-state-machine/std", "sp-version/std", "subxt-signer", ]