diff --git a/src/tracing/builder/parity.rs b/src/tracing/builder/parity.rs index 8799921..97b372f 100644 --- a/src/tracing/builder/parity.rs +++ b/src/tracing/builder/parity.rs @@ -375,10 +375,7 @@ impl ParityTraceBuilder { let maybe_memory = if step.memory.is_empty() { None } else { - Some(MemoryDelta { - off: step.memory_size, - data: step.memory.as_bytes().to_vec().into(), - }) + Some(MemoryDelta { off: step.memory_size, data: step.memory.as_bytes().clone() }) }; let maybe_execution = Some(VmExecutedOperation { diff --git a/src/tracing/mod.rs b/src/tracing/mod.rs index 1f6f88d..2527215 100644 --- a/src/tracing/mod.rs +++ b/src/tracing/mod.rs @@ -341,7 +341,7 @@ impl TracingInspector { let memory = self .config .record_memory_snapshots - .then(|| RecordedMemory::new(interp.shared_memory.context_memory().to_vec())) + .then(|| RecordedMemory::new(interp.shared_memory.context_memory())) .unwrap_or_default(); let stack = if self.config.record_stack_snapshots.is_full() { Some(interp.stack.data().clone()) diff --git a/src/tracing/types.rs b/src/tracing/types.rs index 5fb9128..4d821c6 100644 --- a/src/tracing/types.rs +++ b/src/tracing/types.rs @@ -628,23 +628,34 @@ pub struct StorageChange { /// This is a wrapper around the [SharedMemory](revm::interpreter::SharedMemory) context memory. #[derive(Clone, Debug, Default, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -pub struct RecordedMemory(pub(crate) Vec); +pub struct RecordedMemory(pub(crate) Bytes); impl RecordedMemory { #[inline] - pub(crate) fn new(mem: Vec) -> Self { - Self(mem) + pub(crate) fn new(mem: &[u8]) -> Self { + Self(Bytes::copy_from_slice(mem)) } /// Returns the memory as a byte slice #[inline] - pub fn as_bytes(&self) -> &[u8] { + pub fn as_bytes(&self) -> &Bytes { &self.0 } + /// Returns the memory as a byte vector #[inline] - pub(crate) fn resize(&mut self, size: usize) { - self.0.resize(size, 0); + pub fn into_bytes(self) -> Bytes { + self.0 + } + + #[inline] + pub(crate) fn resize(&mut self, len: usize) { + if len <= self.len() { + return self.0.truncate(len); + } + let mut data = self.0.to_vec(); + data.resize(len, 0); + self.0 = Bytes::from(data); } /// Returns the size of the memory