diff --git a/evm/src/cpu/kernel/asm/core/transfer.asm b/evm/src/cpu/kernel/asm/core/transfer.asm index 0ba99fd8..05582e6e 100644 --- a/evm/src/cpu/kernel/asm/core/transfer.asm +++ b/evm/src/cpu/kernel/asm/core/transfer.asm @@ -73,6 +73,7 @@ global deduct_eth_insufficient_balance: // Pre stack: addr, amount, redest // Post stack: (empty) +// TODO: Should it be copy-on-write instead of mutating the trie? global add_eth: // stack: addr, amount, retdest DUP1 %mpt_read_state_trie diff --git a/evm/src/generation/state.rs b/evm/src/generation/state.rs index 95de3279..2e3718bf 100644 --- a/evm/src/generation/state.rs +++ b/evm/src/generation/state.rs @@ -97,4 +97,10 @@ impl GenerationState { self.registers = checkpoint.registers; self.traces.rollback(checkpoint.traces); } + + pub(crate) fn stack(&self) -> Vec { + (0..self.registers.stack_len) + .map(|i| stack_peek(self, i).unwrap()) + .collect() + } } diff --git a/evm/src/witness/transition.rs b/evm/src/witness/transition.rs index ff10b08b..d48561db 100644 --- a/evm/src/witness/transition.rs +++ b/evm/src/witness/transition.rs @@ -1,5 +1,4 @@ use anyhow::bail; -use itertools::Itertools; use log::log_enabled; use plonky2::field::types::Field; @@ -12,7 +11,7 @@ use crate::witness::gas::gas_to_charge; use crate::witness::memory::MemoryAddress; use crate::witness::operation::*; use crate::witness::state::RegistersState; -use crate::witness::util::{mem_read_code_with_log_and_fill, stack_peek}; +use crate::witness::util::mem_read_code_with_log_and_fill; use crate::{arithmetic, logic}; fn read_code_memory(state: &mut GenerationState, row: &mut CpuColumnsView) -> u8 { @@ -121,7 +120,7 @@ fn decode(registers: RegistersState, opcode: u8) -> Result { log::warn!( "Kernel panic at {}", - KERNEL.offset_name(registers.program_counter) + KERNEL.offset_name(registers.program_counter), ); Err(ProgramError::KernelPanic) } @@ -284,9 +283,7 @@ fn log_kernel_instruction(state: &mut GenerationState, op: Operatio state.registers.context, KERNEL.offset_name(pc), op, - (0..state.registers.stack_len) - .map(|i| stack_peek(state, i).unwrap()) - .collect_vec() + state.stack() ); assert!(pc < KERNEL.code.len(), "Kernel PC is out of range: {}", pc); @@ -310,7 +307,12 @@ pub(crate) fn transition(state: &mut GenerationState) -> anyhow::Re Err(e) => { if state.registers.is_kernel { let offset_name = KERNEL.offset_name(state.registers.program_counter); - bail!("exception in kernel mode at {}: {:?}", offset_name, e); + bail!( + "{:?} in kernel at pc={}, stack={:?}", + e, + offset_name, + state.stack() + ); } state.rollback(checkpoint); handle_error(state)