From 01bbf1a05874bb4a92704d4cb36adb271943a15e Mon Sep 17 00:00:00 2001 From: Hamy Ratoanina Date: Thu, 9 Nov 2023 16:42:18 -0500 Subject: [PATCH] Constrain clock (#1343) --- evm/src/cpu/clock.rs | 37 +++++++++++++++++++++++++++++++++++++ evm/src/cpu/cpu_stark.rs | 4 +++- evm/src/cpu/mod.rs | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 evm/src/cpu/clock.rs diff --git a/evm/src/cpu/clock.rs b/evm/src/cpu/clock.rs new file mode 100644 index 00000000..0e39cbde --- /dev/null +++ b/evm/src/cpu/clock.rs @@ -0,0 +1,37 @@ +use plonky2::field::extension::Extendable; +use plonky2::field::packed::PackedField; +use plonky2::hash::hash_types::RichField; +use plonky2::iop::ext_target::ExtensionTarget; + +use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer}; +use crate::cpu::columns::CpuColumnsView; + +/// Check the correct updating of `clock`. +pub fn eval_packed( + lv: &CpuColumnsView

, + nv: &CpuColumnsView

, + yield_constr: &mut ConstraintConsumer

, +) { + // The clock is 0 at the beginning. + yield_constr.constraint_first_row(lv.clock); + // The clock is incremented by 1 at each row. + yield_constr.constraint_transition(nv.clock - lv.clock - P::ONES); +} + +/// Circuit version of `eval_packed`. +/// Check the correct updating of `clock`. +pub fn eval_ext_circuit, const D: usize>( + builder: &mut plonky2::plonk::circuit_builder::CircuitBuilder, + lv: &CpuColumnsView>, + nv: &CpuColumnsView>, + yield_constr: &mut RecursiveConstraintConsumer, +) { + // The clock is 0 at the beginning. + yield_constr.constraint_first_row(builder, lv.clock); + // The clock is incremented by 1 at each row. + { + let new_clock = builder.add_const_extension(lv.clock, F::ONE); + let constr = builder.sub_extension(nv.clock, new_clock); + yield_constr.constraint_transition(builder, constr); + } +} diff --git a/evm/src/cpu/cpu_stark.rs b/evm/src/cpu/cpu_stark.rs index 755461f3..4dc23b2a 100644 --- a/evm/src/cpu/cpu_stark.rs +++ b/evm/src/cpu/cpu_stark.rs @@ -15,7 +15,7 @@ use crate::all_stark::Table; use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer}; use crate::cpu::columns::{COL_MAP, NUM_CPU_COLUMNS}; use crate::cpu::{ - bootstrap_kernel, contextops, control_flow, decode, dup_swap, gas, jumps, membus, memio, + bootstrap_kernel, clock, contextops, control_flow, decode, dup_swap, gas, jumps, membus, memio, modfp254, pc, push0, shift, simple_logic, stack, stack_bounds, syscalls_exceptions, }; use crate::cross_table_lookup::{Column, TableWithColumns}; @@ -238,6 +238,7 @@ impl, const D: usize> Stark for CpuStark = next_values.borrow(); bootstrap_kernel::eval_bootstrap_kernel_packed(local_values, next_values, yield_constr); + clock::eval_packed(local_values, next_values, yield_constr); contextops::eval_packed(local_values, next_values, yield_constr); control_flow::eval_packed_generic(local_values, next_values, yield_constr); decode::eval_packed_generic(local_values, yield_constr); @@ -278,6 +279,7 @@ impl, const D: usize> Stark for CpuStark