diff --git a/prdoc/pr_8881.prdoc b/prdoc/pr_8881.prdoc new file mode 100644 index 0000000000000..ca0f09fab3a34 --- /dev/null +++ b/prdoc/pr_8881.prdoc @@ -0,0 +1,11 @@ +title: '[pallet-revive] only record diff if value changed' +doc: +- audience: Runtime Dev + description: |- + Only record storage change in diff mode if the value differ from the initial one. + Previous implementation would report a diff for example when the old value was written again. + + Updated tests in https://github.com/paritytech/evm-test-suite/pull/96 +crates: +- name: pallet-revive + bump: patch diff --git a/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs b/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs index 542be0f2fcd6b..c0794458b846b 100644 --- a/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs +++ b/substrate/frame/revive/src/evm/tracing/prestate_tracing.rs @@ -200,7 +200,8 @@ where fn storage_write(&mut self, key: &Key, old_value: Option>, new_value: Option<&[u8]>) { let key = Bytes::from(key.unhashed().to_vec()); - self.trace + let old_value = self + .trace .0 .entry(self.current_addr) .or_default() @@ -208,13 +209,19 @@ where .entry(key.clone()) .or_insert_with(|| old_value.map(Into::into)); - if self.config.diff_mode { + if !self.config.diff_mode { + return + } + + if old_value.as_ref().map(|v| v.0.as_ref()) != new_value { self.trace .1 .entry(self.current_addr) .or_default() .storage .insert(key, new_value.map(|v| v.to_vec().into())); + } else { + self.trace.1.entry(self.current_addr).or_default().storage.remove(&key); } }