diff --git a/evm/src/cpu/kernel/interpreter.rs b/evm/src/cpu/kernel/interpreter.rs index 78691632..a16d2d3a 100644 --- a/evm/src/cpu/kernel/interpreter.rs +++ b/evm/src/cpu/kernel/interpreter.rs @@ -292,10 +292,15 @@ impl<'a> Interpreter<'a> { pub(crate) fn set_jumpdest_bits(&mut self, context: usize, jumpdest_bits: Vec) { self.generation_state.memory.contexts[context].segments[Segment::JumpdestBits as usize] - .content = jumpdest_bits - .into_iter() - .map(|x| u256_from_bool(x)) - .collect(); + .content = jumpdest_bits.iter().map(|&x| u256_from_bool(x)).collect(); + self.generation_state.jumpdest_addresses = Some( + jumpdest_bits + .into_iter() + .enumerate() + .filter(|&(_, x)| x) + .map(|(i, _)| i) + .collect(), + ) } fn incr(&mut self, n: usize) { diff --git a/evm/src/cpu/kernel/tests/core/jumpdest_analysis.rs b/evm/src/cpu/kernel/tests/core/jumpdest_analysis.rs index d3edc17b..58e9f936 100644 --- a/evm/src/cpu/kernel/tests/core/jumpdest_analysis.rs +++ b/evm/src/cpu/kernel/tests/core/jumpdest_analysis.rs @@ -4,37 +4,37 @@ use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::interpreter::Interpreter; use crate::cpu::kernel::opcodes::{get_opcode, get_push_opcode}; -// #[test] -// fn test_jumpdest_analysis() -> Result<()> { -// let jumpdest_analysis = KERNEL.global_labels["validate_jumpdest_table"]; -// const CONTEXT: usize = 3; // arbitrary +#[test] +fn test_validate_jumpdest_table() -> Result<()> { + let validate_jumpdest_table = KERNEL.global_labels["validate_jumpdest_table"]; + const CONTEXT: usize = 3; // arbitrary -// let add = get_opcode("ADD"); -// let push2 = get_push_opcode(2); -// let jumpdest = get_opcode("JUMPDEST"); + let add = get_opcode("ADD"); + let push2 = get_push_opcode(2); + let jumpdest = get_opcode("JUMPDEST"); -// #[rustfmt::skip] -// let code: Vec = vec![ -// add, -// jumpdest, -// push2, -// jumpdest, // part of PUSH2 -// jumpdest, // part of PUSH2 -// jumpdest, -// add, -// jumpdest, -// ]; + #[rustfmt::skip] + let code: Vec = vec![ + add, + jumpdest, + push2, + jumpdest, // part of PUSH2 + jumpdest, // part of PUSH2 + jumpdest, + add, + jumpdest, + ]; -// let jumpdest_bits = vec![false, true, false, false, false, true, false, true]; + let jumpdest_bits = vec![false, true, false, false, false, true, false, true]; -// // Contract creation transaction. -// let initial_stack = vec![0xDEADBEEFu32.into(), CONTEXT.into()]; -// let mut interpreter = Interpreter::new_with_kernel(jumpdest_analysis, initial_stack); -// interpreter.set_code(CONTEXT, code); -// interpreter.set_jumpdest_bits(CONTEXT, jumpdest_bits); + // Contract creation transaction. + let initial_stack = vec![0xDEADBEEFu32.into(), CONTEXT.into()]; + let mut interpreter = Interpreter::new_with_kernel(validate_jumpdest_table, initial_stack); + interpreter.set_code(CONTEXT, code); + interpreter.set_jumpdest_bits(CONTEXT, jumpdest_bits); -// interpreter.run()?; -// assert_eq!(interpreter.stack(), vec![]); + interpreter.run()?; + assert_eq!(interpreter.stack(), vec![]); -// Ok(()) -// } + Ok(()) +} diff --git a/evm/src/generation/prover_input.rs b/evm/src/generation/prover_input.rs index 2435f4eb..53e25db4 100644 --- a/evm/src/generation/prover_input.rs +++ b/evm/src/generation/prover_input.rs @@ -276,12 +276,6 @@ impl GenerationState { /// Return the proof for the last jump adddress fn run_next_jumpdest_table_proof(&mut self) -> Result { - let code_len = u256_to_usize(self.memory.get(MemoryAddress { - context: self.registers.context, - segment: Segment::ContextMetadata as usize, - virt: ContextMetadata::CodeSize as usize, - }))?; - let code = (0..self.last_jumpdest_address) .map(|i| { u256_to_u8(self.memory.get(MemoryAddress {