From d75a5969eca9a83893af0b9324168e669547511d Mon Sep 17 00:00:00 2001 From: pinkiebell <40266861+pinkiebell@users.noreply.github.com> Date: Wed, 30 Nov 2022 07:57:06 +0000 Subject: [PATCH 1/2] bus-mapping: fix return data offset and length bookkeeping This resolves a problem with the returndatacopy opcode because of zero return_data.[offset, length] --- .../src/circuit_input_builder/input_state_ref.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bus-mapping/src/circuit_input_builder/input_state_ref.rs b/bus-mapping/src/circuit_input_builder/input_state_ref.rs index 724e897290..6b05649204 100644 --- a/bus-mapping/src/circuit_input_builder/input_state_ref.rs +++ b/bus-mapping/src/circuit_input_builder/input_state_ref.rs @@ -808,7 +808,7 @@ impl<'a> CircuitInputStateRef<'a> { pub fn handle_return(&mut self, step: &GethExecStep) -> Result<(), Error> { // handle return_data if !self.call()?.is_root { - match step.op { + let (offset, length) = match step.op { OpcodeId::RETURN | OpcodeId::REVERT => { let offset = step.stack.nth_last(0)?.as_usize(); let length = step.stack.nth_last(1)?.as_usize(); @@ -821,12 +821,18 @@ impl<'a> CircuitInputStateRef<'a> { caller_ctx.return_data[0..length] .copy_from_slice(&callee_memory.0[offset..offset + length]); } + (offset, length) } _ => { let caller_ctx = self.caller_ctx_mut()?; caller_ctx.return_data.truncate(0); + (0, 0) } - } + }; + + let call = self.call_mut()?; + call.return_data_offset = offset.try_into().unwrap(); + call.return_data_length = length.try_into().unwrap(); } let call = self.call()?.clone(); From 6cd966d3895d28e19a35e9eccabd97c81f204def Mon Sep 17 00:00:00 2001 From: pinkiebell <40266861+pinkiebell@users.noreply.github.com> Date: Wed, 30 Nov 2022 14:23:31 +0000 Subject: [PATCH 2/2] fix conflict --- .../circuit_input_builder/input_state_ref.rs | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/bus-mapping/src/circuit_input_builder/input_state_ref.rs b/bus-mapping/src/circuit_input_builder/input_state_ref.rs index 6b05649204..e6221bcdf6 100644 --- a/bus-mapping/src/circuit_input_builder/input_state_ref.rs +++ b/bus-mapping/src/circuit_input_builder/input_state_ref.rs @@ -807,33 +807,35 @@ impl<'a> CircuitInputStateRef<'a> { /// previous call context. pub fn handle_return(&mut self, step: &GethExecStep) -> Result<(), Error> { // handle return_data - if !self.call()?.is_root { - let (offset, length) = match step.op { - OpcodeId::RETURN | OpcodeId::REVERT => { - let offset = step.stack.nth_last(0)?.as_usize(); - let length = step.stack.nth_last(1)?.as_usize(); - // TODO: Try to get rid of clone. - // At the moment it conflicts with `call_ctx` and `caller_ctx`. - let callee_memory = self.call_ctx()?.memory.clone(); - let caller_ctx = self.caller_ctx_mut()?; - caller_ctx.return_data.resize(length, 0); - if length != 0 { - caller_ctx.return_data[0..length] - .copy_from_slice(&callee_memory.0[offset..offset + length]); + let (return_data_offset, return_data_length) = { + if !self.call()?.is_root { + let (offset, length) = match step.op { + OpcodeId::RETURN | OpcodeId::REVERT => { + let offset = step.stack.nth_last(0)?.as_usize(); + let length = step.stack.nth_last(1)?.as_usize(); + // TODO: Try to get rid of clone. + // At the moment it conflicts with `call_ctx` and `caller_ctx`. + let callee_memory = self.call_ctx()?.memory.clone(); + let caller_ctx = self.caller_ctx_mut()?; + caller_ctx.return_data.resize(length, 0); + if length != 0 { + caller_ctx.return_data[0..length] + .copy_from_slice(&callee_memory.0[offset..offset + length]); + } + (offset, length) } - (offset, length) - } - _ => { - let caller_ctx = self.caller_ctx_mut()?; - caller_ctx.return_data.truncate(0); - (0, 0) - } - }; + _ => { + let caller_ctx = self.caller_ctx_mut()?; + caller_ctx.return_data.truncate(0); + (0, 0) + } + }; - let call = self.call_mut()?; - call.return_data_offset = offset.try_into().unwrap(); - call.return_data_length = length.try_into().unwrap(); - } + (offset.try_into().unwrap(), length.try_into().unwrap()) + } else { + (0, 0) + } + }; let call = self.call()?.clone(); let call_ctx = self.call_ctx()?; @@ -861,8 +863,8 @@ impl<'a> CircuitInputStateRef<'a> { // If current call has caller. if let Ok(caller) = self.caller_mut() { caller.last_callee_id = call.call_id; - caller.last_callee_return_data_length = call.return_data_length; - caller.last_callee_return_data_offset = call.return_data_offset; + caller.last_callee_return_data_length = return_data_length; + caller.last_callee_return_data_offset = return_data_offset; } self.tx_ctx.pop_call_ctx();