From 23feffad7c9cb03330030f90ced251668f40220d Mon Sep 17 00:00:00 2001 From: pgherveou Date: Mon, 15 Sep 2025 09:28:04 +0200 Subject: [PATCH 1/5] Fix tracing collect --- substrate/frame/revive/src/evm/tracing.rs | 2 +- substrate/frame/revive/src/evm/tracing/call_tracing.rs | 4 ++-- substrate/frame/revive/src/evm/tracing/prestate_tracing.rs | 4 ++-- substrate/frame/revive/src/lib.rs | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/substrate/frame/revive/src/evm/tracing.rs b/substrate/frame/revive/src/evm/tracing.rs index 10dbcdde10313..dc235ede4784e 100644 --- a/substrate/frame/revive/src/evm/tracing.rs +++ b/substrate/frame/revive/src/evm/tracing.rs @@ -60,7 +60,7 @@ where } /// Collect the traces and return them. - pub fn collect_trace(&mut self) -> Option { + pub fn collect_trace(self) -> Option { match self { Tracer::CallTracer(inner) => inner.collect_trace().map(Trace::Call), Tracer::PrestateTracer(inner) => Some(inner.collect_trace().into()), diff --git a/substrate/frame/revive/src/evm/tracing/call_tracing.rs b/substrate/frame/revive/src/evm/tracing/call_tracing.rs index 5eff16e0ce4c9..9b51bfcea46b1 100644 --- a/substrate/frame/revive/src/evm/tracing/call_tracing.rs +++ b/substrate/frame/revive/src/evm/tracing/call_tracing.rs @@ -51,8 +51,8 @@ impl CallTracer { } /// Collect the traces and return them. - pub fn collect_trace(&mut self) -> Option> { - core::mem::take(&mut self.traces).pop() + pub fn collect_trace(mut self) -> Option> { + self.traces.pop() } } diff --git a/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs b/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs index 6afbf3dd56fc3..39d8066ce2165 100644 --- a/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs +++ b/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs @@ -63,8 +63,8 @@ where } /// Collect the traces and return them. - pub fn collect_trace(&mut self) -> PrestateTrace { - let trace = core::mem::take(&mut self.trace); + pub fn collect_trace(self) -> PrestateTrace { + let Self { trace, .. } = self; let (mut pre, mut post) = trace; let include_code = !self.config.disable_code; diff --git a/substrate/frame/revive/src/lib.rs b/substrate/frame/revive/src/lib.rs index 9ed4e02dee25d..d5da246058944 100644 --- a/substrate/frame/revive/src/lib.rs +++ b/substrate/frame/revive/src/lib.rs @@ -2059,11 +2059,11 @@ macro_rules! impl_runtime_apis_plus_revive { tracer_type: $crate::evm::TracerType, ) -> Vec<(u32, $crate::evm::Trace)> { use $crate::{sp_runtime::traits::Block, tracing::trace}; - let mut tracer = $crate::Pallet::::evm_tracer(tracer_type); let mut traces = vec![]; let (header, extrinsics) = block.deconstruct(); <$Executive>::initialize_block(&header); for (index, ext) in extrinsics.into_iter().enumerate() { + let mut tracer = $crate::Pallet::::evm_tracer(tracer_type.clone()); let t = tracer.as_tracing(); let _ = trace(t, || <$Executive>::apply_extrinsic(ext)); @@ -2104,7 +2104,7 @@ macro_rules! impl_runtime_apis_plus_revive { tracer_type: $crate::evm::TracerType, ) -> Result<$crate::evm::Trace, $crate::EthTransactError> { use $crate::tracing::trace; - let mut tracer = $crate::Pallet::::evm_tracer(tracer_type); + let mut tracer = $crate::Pallet::::evm_tracer(tracer_type.clone()); let t = tracer.as_tracing(); t.watch_address(&tx.from.unwrap_or_default()); @@ -2116,7 +2116,7 @@ macro_rules! impl_runtime_apis_plus_revive { } else if let Err(err) = result { Err(err) } else { - Ok(tracer.empty_trace()) + Ok($crate::Pallet::::evm_tracer(tracer_type).empty_trace()) } } From b565491e769871cb28b6bfb40599a68f6d08d6f7 Mon Sep 17 00:00:00 2001 From: "cmd[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 07:34:17 +0000 Subject: [PATCH 2/5] Update from github-actions[bot] running command 'prdoc --audience runtime_dev --bump patch' --- prdoc/pr_9736.prdoc | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 prdoc/pr_9736.prdoc diff --git a/prdoc/pr_9736.prdoc b/prdoc/pr_9736.prdoc new file mode 100644 index 0000000000000..82cee4495bdb3 --- /dev/null +++ b/prdoc/pr_9736.prdoc @@ -0,0 +1,12 @@ +title: '[pallet-revive] fix tracing collect' +doc: +- audience: Runtime Dev + description: |- + Fix tracing collection + + collect_trace should take `self` instead of `&mut self`, to avoid reusing the tracer state when tracing multiple transactions in a block. + + Fix https://github.com/paritytech/contract-issues/issues/156https://github.com/paritytech/contract-issues/issues/156 +crates: +- name: pallet-revive + bump: patch From 9237ec2a152dbc5f1a58c64675b516cf76af6b5e Mon Sep 17 00:00:00 2001 From: PG Herveou Date: Mon, 15 Sep 2025 09:34:28 +0200 Subject: [PATCH 3/5] Update substrate/frame/revive/src/evm/tracing/prestate_tracing.rs --- substrate/frame/revive/src/evm/tracing/prestate_tracing.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs b/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs index 39d8066ce2165..d3f2157775857 100644 --- a/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs +++ b/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs @@ -64,8 +64,7 @@ where /// Collect the traces and return them. pub fn collect_trace(self) -> PrestateTrace { - let Self { trace, .. } = self; - let (mut pre, mut post) = trace; + let (mut pre, mut post) = self.trace; let include_code = !self.config.disable_code; let is_empty = |info: &PrestateTraceInfo| { From edc64948b7b1e16baea125bed92b74a5328b6671 Mon Sep 17 00:00:00 2001 From: pgherveou Date: Tue, 16 Sep 2025 10:35:59 +0200 Subject: [PATCH 4/5] fix call_tracing & log position --- .../revive/src/evm/api/debug_rpc_types.rs | 3 +++ .../revive/src/evm/tracing/call_tracing.rs | 19 ++++++++++++++----- substrate/frame/revive/src/tests/pvm.rs | 8 +++++++- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/substrate/frame/revive/src/evm/api/debug_rpc_types.rs b/substrate/frame/revive/src/evm/api/debug_rpc_types.rs index 7dbfc254a769a..b3a547c59eaf4 100644 --- a/substrate/frame/revive/src/evm/api/debug_rpc_types.rs +++ b/substrate/frame/revive/src/evm/api/debug_rpc_types.rs @@ -291,6 +291,9 @@ pub struct CallTrace { /// Type of call. #[serde(rename = "type")] pub call_type: CallType, + /// Number of child calls entered (for log position calculation) + #[serde(skip)] + pub child_call_count: u32, } /// A log emitted during a call. diff --git a/substrate/frame/revive/src/evm/tracing/call_tracing.rs b/substrate/frame/revive/src/evm/tracing/call_tracing.rs index 9b51bfcea46b1..3c62949c0c95d 100644 --- a/substrate/frame/revive/src/evm/tracing/call_tracing.rs +++ b/substrate/frame/revive/src/evm/tracing/call_tracing.rs @@ -71,6 +71,13 @@ impl Gas> Tracing for CallTracer ( @@ -121,12 +128,14 @@ impl Gas> Tracing for CallTracer Date: Tue, 16 Sep 2025 10:38:48 +0200 Subject: [PATCH 5/5] simplify --- substrate/frame/revive/src/evm/tracing/call_tracing.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/substrate/frame/revive/src/evm/tracing/call_tracing.rs b/substrate/frame/revive/src/evm/tracing/call_tracing.rs index 3c62949c0c95d..9392dcb8fb3e5 100644 --- a/substrate/frame/revive/src/evm/tracing/call_tracing.rs +++ b/substrate/frame/revive/src/evm/tracing/call_tracing.rs @@ -130,9 +130,12 @@ impl Gas> Tracing for CallTracer