From 0f0665a35eacba6dd953d7ff7f1a565c1b383b63 Mon Sep 17 00:00:00 2001 From: pgherveou Date: Wed, 12 Nov 2025 14:52:55 +0100 Subject: [PATCH 1/4] Fix prestate diff tracing --- .../src/evm/tracing/prestate_tracing.rs | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs b/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs index ec98539f470c5..738252d4fef72 100644 --- a/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs +++ b/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs @@ -144,6 +144,22 @@ where } } +/// Get the appropriate trace entry (pre or post) based on whether +/// the address was created. +/// Returns early if the address is created and diff_mode is false. +macro_rules! get_entry { + ($self:expr, $addr:expr) => { + if $self.created_addrs.contains(&$addr) { + if !$self.config.diff_mode { + return + } + $self.trace.1.entry($addr) + } else { + $self.trace.0.entry($addr) + } + }; +} + impl PrestateTracer where T::Nonce: Into, @@ -174,13 +190,9 @@ where } /// Record a read - fn read_account_prestate(&mut self, addr: H160) { - if self.created_addrs.contains(&addr) { - return - } - + fn read_account(&mut self, addr: H160) { let include_code = !self.config.disable_code; - self.trace.0.entry(addr).or_insert_with_key(|addr| { + get_entry!(self, addr).or_insert_with_key(|addr| { Self::prestate_info( addr, Pallet::::evm_balance(addr), @@ -228,8 +240,8 @@ where if self.create_code.take().is_some() { self.created_addrs.insert(to); } - self.read_account_prestate(from); - self.read_account_prestate(to); + self.read_account(from); + self.read_account(to); } fn exit_child_span_with_error(&mut self, _error: crate::DispatchError, _gas_used: Weight) { @@ -253,15 +265,9 @@ where fn storage_write(&mut self, key: &Key, old_value: Option>, new_value: Option<&[u8]>) { let current_addr = self.current_addr(); - if self.created_addrs.contains(¤t_addr) { - return - } let key = Bytes::from(key.unhashed().to_vec()); - let old_value = self - .trace - .0 - .entry(current_addr) + let old_value = get_entry!(self, current_addr) .or_default() .storage .entry(key.clone()) @@ -285,13 +291,8 @@ where fn storage_read(&mut self, key: &Key, value: Option<&[u8]>) { let current_addr = self.current_addr(); - if self.created_addrs.contains(¤t_addr) { - return - } - self.trace - .0 - .entry(current_addr) + get_entry!(self, current_addr) .or_default() .storage .entry(key.unhashed().to_vec().into()) @@ -299,12 +300,8 @@ where } fn balance_read(&mut self, addr: &H160, value: U256) { - if self.created_addrs.contains(&addr) { - return - } - let include_code = !self.config.disable_code; - self.trace.0.entry(*addr).or_insert_with_key(|addr| { + get_entry!(self, *addr).or_insert_with_key(|addr| { Self::prestate_info(addr, value, include_code.then(|| Self::bytecode(addr)).flatten()) }); } From 21777c2747e5ceaa8f8039493367b836c7d531c0 Mon Sep 17 00:00:00 2001 From: pgherveou Date: Wed, 12 Nov 2025 14:54:27 +0100 Subject: [PATCH 2/4] fix test --- substrate/frame/revive/src/tests/sol.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/substrate/frame/revive/src/tests/sol.rs b/substrate/frame/revive/src/tests/sol.rs index 4565d6ee796d8..93de26d0ee9d5 100644 --- a/substrate/frame/revive/src/tests/sol.rs +++ b/substrate/frame/revive/src/tests/sol.rs @@ -380,12 +380,19 @@ fn prestate_diff_mode_tracing_works() { "{{CONTRACT_ADDR}}": { "balance": "0x0", "nonce": 2, - "code": "{{CONTRACT_CODE}}" + "code": "{{CONTRACT_CODE}}", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "{{CHILD_ADDR_PADDED}}", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000007" + } }, "{{CHILD_ADDR}}": { "balance": "0x0", "nonce": 1, - "code": "{{CHILD_CODE}}" + "code": "{{CHILD_CODE}}", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000000000000000000000000000000000000000000a" + } } } }"#, From 97ddfc5767f8b9848e034ac83939704a1a6aa045 Mon Sep 17 00:00:00 2001 From: pgherveou Date: Wed, 12 Nov 2025 15:03:52 +0100 Subject: [PATCH 3/4] update test-evm --- .github/workflows/tests-evm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests-evm.yml b/.github/workflows/tests-evm.yml index a98e4ee631937..bcc95f3bcf44c 100644 --- a/.github/workflows/tests-evm.yml +++ b/.github/workflows/tests-evm.yml @@ -120,7 +120,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: paritytech/evm-test-suite - ref: 372e9b48d375a63297d6e553a70a89c4e9dfa14e + ref: 4dc2658b3c944d65e4624fad87e7532c9253448e path: evm-test-suite - uses: denoland/setup-deno@v2 From e0abf6a8480d72798f09697c8bae3921583fb619 Mon Sep 17 00:00:00 2001 From: "cmd[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Nov 2025 14:07:28 +0000 Subject: [PATCH 4/4] Update from github-actions[bot] running command 'prdoc --audience runtime_dev --bump patch' --- prdoc/pr_10303.prdoc | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 prdoc/pr_10303.prdoc diff --git a/prdoc/pr_10303.prdoc b/prdoc/pr_10303.prdoc new file mode 100644 index 0000000000000..c648dcf447b61 --- /dev/null +++ b/prdoc/pr_10303.prdoc @@ -0,0 +1,9 @@ +title: pallet-revive fix prestate diff tracing +doc: +- audience: Runtime Dev + description: 'Fix prestate diff-tracing, add missing storage diff for created contracts + + ' +crates: +- name: pallet-revive + bump: patch