From 938e3bd5dab45e7b6b49d9b9e368b85350637be1 Mon Sep 17 00:00:00 2001 From: Hamy Ratoanina Date: Tue, 11 Apr 2023 15:13:55 -0400 Subject: [PATCH] Set stack_len_bounds_aux properly --- evm/src/cpu/cpu_stark.rs | 4 ++-- evm/src/cpu/stack_bounds.rs | 4 ++-- evm/src/witness/transition.rs | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/evm/src/cpu/cpu_stark.rs b/evm/src/cpu/cpu_stark.rs index 09c7d576..21bf75cc 100644 --- a/evm/src/cpu/cpu_stark.rs +++ b/evm/src/cpu/cpu_stark.rs @@ -157,7 +157,7 @@ impl, const D: usize> Stark for CpuStark, const D: usize> Stark for CpuStark(lv: &mut CpuColumnsView) { diff --git a/evm/src/witness/transition.rs b/evm/src/witness/transition.rs index 65b7ddcf..0184e183 100644 --- a/evm/src/witness/transition.rs +++ b/evm/src/witness/transition.rs @@ -4,6 +4,7 @@ use plonky2::field::types::Field; use crate::cpu::columns::CpuColumnsView; use crate::cpu::kernel::aggregator::KERNEL; +use crate::cpu::stack_bounds::{DECREMENTING_FLAGS, INCREMENTING_FLAGS, MAX_USER_STACK_SIZE}; use crate::generation::state::GenerationState; use crate::memory::segments::Segment; use crate::witness::errors::ProgramError; @@ -258,6 +259,24 @@ fn try_perform_instruction(state: &mut GenerationState) -> Result<( fill_op_flag(op, &mut row); + let check_underflow: F = DECREMENTING_FLAGS.map(|i| row[i]).into_iter().sum(); + let check_overflow: F = INCREMENTING_FLAGS.map(|i| row[i]).into_iter().sum(); + let no_check = F::ONE - (check_underflow + check_overflow); + + let disallowed_len = check_overflow * F::from_canonical_usize(MAX_USER_STACK_SIZE) - no_check; + let diff = row.stack_len - disallowed_len; + + let user_mode = F::ONE - row.is_kernel_mode; + let rhs = user_mode + check_underflow; + + row.stack_len_bounds_aux = match diff.try_inverse() { + Some(diff_inv) => diff_inv * rhs, // `rhs` may be a value other than 1 or 0 + None => { + assert_eq!(rhs, F::ZERO); + F::ZERO + } + }; + perform_op(state, op, row) }