diff --git a/evm/src/cpu/kernel/interpreter.rs b/evm/src/cpu/kernel/interpreter.rs index d8e2aff0..52876c97 100644 --- a/evm/src/cpu/kernel/interpreter.rs +++ b/evm/src/cpu/kernel/interpreter.rs @@ -1,6 +1,7 @@ //! An EVM interpreter for testing and debugging purposes. use std::collections::HashMap; +use std::ops::Range; use anyhow::{anyhow, bail, ensure}; use ethereum_types::{U256, U512}; @@ -242,6 +243,18 @@ impl<'a> Interpreter<'a> { .content } + pub fn extract_kernel_memory(self, segment: Segment, range: Range) -> Vec { + let mut output: Vec = vec![]; + for i in range { + let term = self + .generation_state + .memory + .get(MemoryAddress::new(0, segment, i)); + output.push(term); + } + output + } + pub(crate) fn push(&mut self, x: U256) { self.stack_mut().push(x); self.generation_state.registers.stack_len += 1; diff --git a/evm/src/cpu/kernel/tests/bn254.rs b/evm/src/cpu/kernel/tests/bn254.rs index e7597ab5..ec4d4198 100644 --- a/evm/src/cpu/kernel/tests/bn254.rs +++ b/evm/src/cpu/kernel/tests/bn254.rs @@ -1,5 +1,3 @@ -use std::ops::Range; - use anyhow::Result; use ethereum_types::U256; use rand::Rng; @@ -12,19 +10,6 @@ use crate::cpu::kernel::interpreter::{ run_interpreter_with_memory, Interpreter, InterpreterMemoryInitialization, }; use crate::memory::segments::Segment::BnPairing; -use crate::witness::memory::MemoryAddress; - -fn extract_kernel_memory(range: Range, interpreter: Interpreter<'static>) -> Vec { - let mut output: Vec = vec![]; - for i in range { - let term = interpreter - .generation_state - .memory - .get(MemoryAddress::new(0, BnPairing, i)); - output.push(term); - } - output -} fn extract_stack(interpreter: Interpreter<'static>) -> Vec { interpreter @@ -119,9 +104,9 @@ fn test_mul_fp12() -> Result<()> { let intrptr_sparse: Interpreter = run_interpreter_with_memory(setup_sparse).unwrap(); let intrptr_square: Interpreter = run_interpreter_with_memory(setup_square).unwrap(); - let out_normal: Vec = extract_kernel_memory(out..out + 12, intrptr_normal); - let out_sparse: Vec = extract_kernel_memory(out..out + 12, intrptr_sparse); - let out_square: Vec = extract_kernel_memory(out..out + 12, intrptr_square); + let out_normal: Vec = intrptr_normal.extract_kernel_memory(BnPairing, out..out + 12); + let out_sparse: Vec = intrptr_sparse.extract_kernel_memory(BnPairing, out..out + 12); + let out_square: Vec = intrptr_square.extract_kernel_memory(BnPairing, out..out + 12); let exp_normal: Vec = (f * g).on_stack(); let exp_sparse: Vec = (f * h).on_stack(); @@ -197,10 +182,10 @@ fn test_frob_fp12() -> Result<()> { let intrptr_frob_3: Interpreter = run_interpreter_with_memory(setup_frob_3).unwrap(); let intrptr_frob_6: Interpreter = run_interpreter_with_memory(setup_frob_6).unwrap(); - let out_frob_1: Vec = extract_kernel_memory(ptr..ptr + 12, intrptr_frob_1); - let out_frob_2: Vec = extract_kernel_memory(ptr..ptr + 12, intrptr_frob_2); - let out_frob_3: Vec = extract_kernel_memory(ptr..ptr + 12, intrptr_frob_3); - let out_frob_6: Vec = extract_kernel_memory(ptr..ptr + 12, intrptr_frob_6); + let out_frob_1: Vec = intrptr_frob_1.extract_kernel_memory(BnPairing, ptr..ptr + 12); + let out_frob_2: Vec = intrptr_frob_2.extract_kernel_memory(BnPairing, ptr..ptr + 12); + let out_frob_3: Vec = intrptr_frob_3.extract_kernel_memory(BnPairing, ptr..ptr + 12); + let out_frob_6: Vec = intrptr_frob_6.extract_kernel_memory(BnPairing, ptr..ptr + 12); let exp_frob_1: Vec = f.frob(1).on_stack(); let exp_frob_2: Vec = f.frob(2).on_stack(); @@ -229,7 +214,7 @@ fn test_inv_fp12() -> Result<()> { memory: vec![(ptr, f.on_stack())], }; let interpreter: Interpreter = run_interpreter_with_memory(setup).unwrap(); - let output: Vec = extract_kernel_memory(inv..inv + 12, interpreter); + let output: Vec = interpreter.extract_kernel_memory(BnPairing, inv..inv + 12); let expected: Vec = f.inv().on_stack(); assert_eq!(output, expected); @@ -252,7 +237,7 @@ fn test_invariant_exponent() -> Result<()> { }; let interpreter: Interpreter = run_interpreter_with_memory(setup).unwrap(); - let output: Vec = extract_kernel_memory(ptr..ptr + 12, interpreter); + let output: Vec = interpreter.extract_kernel_memory(BnPairing, ptr..ptr + 12); let expected: Vec = invariant_exponent(f).on_stack(); assert_eq!(output, expected); @@ -332,7 +317,7 @@ fn test_miller() -> Result<()> { memory: vec![(ptr, inputs)], }; let interpreter = run_interpreter_with_memory(setup).unwrap(); - let output: Vec = extract_kernel_memory(out..out + 12, interpreter); + let output: Vec = interpreter.extract_kernel_memory(BnPairing, out..out + 12); let expected = miller_loop(CURVE_GENERATOR, TWISTED_GENERATOR).on_stack(); assert_eq!(output, expected); @@ -360,7 +345,7 @@ fn test_tate() -> Result<()> { memory: vec![(ptr, inputs)], }; let interpreter = run_interpreter_with_memory(setup).unwrap(); - let output: Vec = extract_kernel_memory(out..out + 12, interpreter); + let output: Vec = interpreter.extract_kernel_memory(BnPairing, out..out + 12); let expected = tate(CURVE_GENERATOR, TWISTED_GENERATOR).on_stack(); assert_eq!(output, expected);