diff --git a/evm/src/cpu/kernel/interpreter.rs b/evm/src/cpu/kernel/interpreter.rs index d7c61f02..016e3c44 100644 --- a/evm/src/cpu/kernel/interpreter.rs +++ b/evm/src/cpu/kernel/interpreter.rs @@ -9,35 +9,36 @@ use crate::memory::segments::Segment; const HALT_OFFSET: usize = 0xdeadbeef; #[derive(Debug)] -pub(crate) struct ContextMemory { - memory: Vec, +pub(crate) struct InterpreterMemory { + context_memory: Vec, } -impl Default for ContextMemory { +impl Default for InterpreterMemory { fn default() -> Self { Self { - memory: vec![MemoryContextState::default()], + context_memory: vec![MemoryContextState::default()], } } } -impl ContextMemory { +impl InterpreterMemory { fn mload_general(&self, context: usize, segment: Segment, offset: usize) -> U256 { - self.memory[context].segments[segment as usize].get(offset) + self.context_memory[context].segments[segment as usize].get(offset) } fn mstore_general(&mut self, context: usize, segment: Segment, offset: usize, value: U256) { - self.memory[context].segments[segment as usize].set(offset, value) + self.context_memory[context].segments[segment as usize].set(offset, value) } } +// TODO: Remove `code` and `stack` fields as they are contained in `memory`. pub(crate) struct Interpreter<'a> { code: &'a [u8], jumpdests: Vec, offset: usize, pub(crate) stack: Vec, context: usize, - memory: ContextMemory, + memory: InterpreterMemory, /// Non-deterministic prover inputs, stored backwards so that popping the last item gives the /// next prover input. prover_inputs: Vec, @@ -67,7 +68,7 @@ pub(crate) fn run_with_input( offset: initial_offset, stack: initial_stack, context: 0, - memory: ContextMemory::default(), + memory: InterpreterMemory::default(), prover_inputs, running: true, }; @@ -425,7 +426,7 @@ impl<'a> Interpreter<'a> { let segment = Segment::all()[self.pop().as_usize()]; let offset = self.pop().as_usize(); let value = self.memory.mload_general(context, segment, offset); - assert!(value < U256::one() << segment.bit_range()); + assert!(value.bits() <= segment.bit_range()); self.push(value); } @@ -434,7 +435,7 @@ impl<'a> Interpreter<'a> { let segment = Segment::all()[self.pop().as_usize()]; let offset = self.pop().as_usize(); let value = self.pop(); - assert!(value < U256::one() << segment.bit_range()); + assert!(value.bits() <= segment.bit_range()); self.memory.mstore_general(context, segment, offset, value); } } @@ -492,11 +493,11 @@ mod tests { let Interpreter { stack, memory, .. } = run; assert_eq!(stack, vec![0xff.into(), 0xff00.into()]); assert_eq!( - memory.memory[0].segments[Segment::MainMemory as usize].get(0x27), + memory.context_memory[0].segments[Segment::MainMemory as usize].get(0x27), 0x42.into() ); assert_eq!( - memory.memory[0].segments[Segment::MainMemory as usize].get(0x1f), + memory.context_memory[0].segments[Segment::MainMemory as usize].get(0x1f), 0xff.into() ); Ok(()) diff --git a/evm/src/memory/segments.rs b/evm/src/memory/segments.rs index 106f2963..ba90f183 100644 --- a/evm/src/memory/segments.rs +++ b/evm/src/memory/segments.rs @@ -63,9 +63,9 @@ impl Segment { Segment::MainMemory => 8, Segment::Calldata => 8, Segment::Returndata => 8, - Segment::Metadata => 8, - Segment::KernelGeneral => 8, - Segment::TxnData => 8, + Segment::Metadata => 256, + Segment::KernelGeneral => 256, + Segment::TxnData => 256, Segment::RlpRaw => 8, } }