From 0943c24fd37a98b77e89f0b1ba967b05a3092789 Mon Sep 17 00:00:00 2001 From: Aleksandar Brayanov Date: Wed, 14 Aug 2024 03:43:54 +0100 Subject: [PATCH] refactor: move log_entries to Call --- .../evm-tracing/src/formatters/blockscout.rs | 2 + .../evm-tracing/src/formatters/call_tracer.rs | 9 +--- client/evm-tracing/src/listeners/call_list.rs | 42 ++++++++++--------- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/client/evm-tracing/src/formatters/blockscout.rs b/client/evm-tracing/src/formatters/blockscout.rs index c880c6c3d8..5d4eb2cb2e 100644 --- a/client/evm-tracing/src/formatters/blockscout.rs +++ b/client/evm-tracing/src/formatters/blockscout.rs @@ -89,4 +89,6 @@ pub struct BlockscoutCall { pub gas_used: U256, #[serde(flatten)] pub inner: BlockscoutCallInner, + + pub logs: Vec, } diff --git a/client/evm-tracing/src/formatters/call_tracer.rs b/client/evm-tracing/src/formatters/call_tracer.rs index 040eb9706d..1fba866f72 100644 --- a/client/evm-tracing/src/formatters/call_tracer.rs +++ b/client/evm-tracing/src/formatters/call_tracer.rs @@ -43,7 +43,7 @@ impl super::ResponseFormatter for Formatter { for entry in listener.entries.iter() { let mut result: Vec = entry .into_iter() - .map(|(entry_index, it)| { + .map(|(_, it)| { let from = it.from; let trace_address = it.trace_address.clone(); let value = it.value; @@ -73,12 +73,7 @@ impl super::ResponseFormatter for Formatter { res: res.clone(), value: Some(value), logs: match res { - CallResult::Output { .. } => { - match listener.log_entries.get(entry_index) { - Some(entry_logs) => entry_logs.clone(), - None => Vec::new(), - } - } + CallResult::Output { .. } => it.logs.clone(), CallResult::Error { .. } => Vec::new(), }, }, diff --git a/client/evm-tracing/src/listeners/call_list.rs b/client/evm-tracing/src/listeners/call_list.rs index 64b75f11ac..aef3e02eb8 100644 --- a/client/evm-tracing/src/listeners/call_list.rs +++ b/client/evm-tracing/src/listeners/call_list.rs @@ -82,9 +82,6 @@ pub struct Listener { /// If true the listener will collect EvmEvent::Log events. pub with_log: bool, - - /// Storage for all logs emitted by EvmEvent::Log events. - pub log_entries: BTreeMap>, } struct Context { @@ -123,7 +120,6 @@ impl Default for Listener { call_list_first_transaction: true, record_transaction_event_only: false, with_log: false, - log_entries: BTreeMap::>::new(), } } } @@ -168,6 +164,7 @@ impl Listener { input: context.data, res, }, + logs: Vec::::new(), } } ContextType::Create => { @@ -186,6 +183,7 @@ impl Listener { init: context.data, res, }, + logs: Vec::::new(), } } }; @@ -216,6 +214,7 @@ impl Listener { input: vec![], res, }, + logs: Vec::::new(), }; self.insert_entry(self.entries_next_index, entry); @@ -500,6 +499,7 @@ impl Listener { to: target, balance, }, + logs: Vec::::new(), }, ); self.entries_next_index += 1; @@ -537,9 +537,9 @@ impl Listener { topics, data, }; - let key = self.entries_next_index.saturating_sub(1u32); + let key = self.entries_next_index; if self.with_log { - self.insert_log_entry(&key, log); + self.insert_log_entry(key, log); } } @@ -559,15 +559,13 @@ impl Listener { } } - fn insert_log_entry(&mut self, key: &u32, entry: Log) { - if let Some(entry_logs) = self.log_entries.get(key) { - let mut new_entry_logs: Vec = (*entry_logs.clone()).to_vec(); - new_entry_logs.push(entry); - self.log_entries.insert(*key, new_entry_logs); - } else { - let mut logs_vec = Vec::::new(); - logs_vec.push(entry); - self.log_entries.insert(*key, logs_vec); + fn insert_log_entry(&mut self, key: u32, log_entry: Log) { + if let Some(ref mut last) = self.entries.last_mut() { + if let Some(ref mut last_call) = last.get(&key) { + let mut call = (*last_call).clone(); + call.logs.push(log_entry); + last.insert(key, call); + } } } @@ -612,6 +610,7 @@ impl Listener { input: context.data, res, }, + logs: Vec::::new(), } } ContextType::Create => { @@ -640,6 +639,7 @@ impl Listener { init: context.data, res, }, + logs: Vec::::new(), } } }, @@ -1183,9 +1183,10 @@ mod tests { do_evm_call_event(&mut listener); do_evm_log_event(&mut listener); do_exit_event(&mut listener); + listener.finish_transaction(); assert_eq!(listener.entries.len(), 1); - assert_eq!(listener.log_entries.get(&1).is_some(), true); - assert_eq!(listener.log_entries.get(&1).unwrap().len(), 1); + assert_eq!(listener.entries[0].len(), 2); + assert_eq!(listener.entries[0].get(&1).unwrap().logs.len(), 1); } #[test] @@ -1199,9 +1200,10 @@ mod tests { do_evm_log_event(&mut listener); do_evm_log_event(&mut listener); do_exit_event(&mut listener); + listener.finish_transaction(); assert_eq!(listener.entries.len(), 1); - assert_eq!(listener.log_entries.get(&1).is_some(), true); - assert_eq!(listener.log_entries.get(&1).unwrap().len(), 2); + assert_eq!(listener.entries[0].len(), 2); + assert_eq!(listener.entries[0].get(&1).unwrap().logs.len(), 2); } #[test] @@ -1215,6 +1217,6 @@ mod tests { do_evm_log_event(&mut listener); do_exit_event(&mut listener); assert_eq!(listener.entries.len(), 1); - assert_eq!(listener.log_entries.get(&0), None); + assert_eq!(listener.entries[0].get(&1).unwrap().logs.len(), 0); } }