diff --git a/evm/src/memory/memory_stark.rs b/evm/src/memory/memory_stark.rs index af4981af..b196a21d 100644 --- a/evm/src/memory/memory_stark.rs +++ b/evm/src/memory/memory_stark.rs @@ -1,18 +1,20 @@ use std::marker::PhantomData; use itertools::{izip, multiunzip}; -use plonky2::{field::{field_types::PrimeField64, extension_field::Extendable}, hash::hash_types::RichField, plonk::circuit_builder::CircuitBuilder}; +use plonky2::field::extension_field::{Extendable, FieldExtension}; +use plonky2::field::packed_field::PackedField; +use plonky2::hash::hash_types::RichField; +use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer}; use crate::memory::registers::{ memory_value_limb, sorted_memory_value_limb, MEMORY_ADDR_CONTEXT, MEMORY_ADDR_SEGMENT, - MEMORY_ADDR_VIRTUAL, MEMORY_IS_READ, MEMORY_TIMESTAMP, SORTED_MEMORY_ADDR_CONTEXT, - SORTED_MEMORY_ADDR_SEGMENT, SORTED_MEMORY_ADDR_VIRTUAL, SORTED_MEMORY_TIMESTAMP, SORTED_MEMORY_IS_READ, - MEMORY_CONTEXT_FIRST_CHANGE, MEMORY_SEGMENT_FIRST_CHANGE, MEMORY_VIRTUAL_FIRST_CHANGE, + MEMORY_ADDR_VIRTUAL, MEMORY_CONTEXT_FIRST_CHANGE, MEMORY_COUNTER, MEMORY_IS_READ, + MEMORY_RANGE_CHECK, MEMORY_SEGMENT_FIRST_CHANGE, MEMORY_TIMESTAMP, MEMORY_VIRTUAL_FIRST_CHANGE, + NUM_REGISTERS, SORTED_MEMORY_ADDR_CONTEXT, SORTED_MEMORY_ADDR_SEGMENT, + SORTED_MEMORY_ADDR_VIRTUAL, SORTED_MEMORY_IS_READ, SORTED_MEMORY_TIMESTAMP, }; - -use crate::vars::{StarkEvaluationVars, StarkEvaluationTargets}; -use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer}; use crate::stark::Stark; +use crate::vars::{StarkEvaluationTargets, StarkEvaluationVars}; #[derive(Default)] pub struct TransactionMemory { @@ -31,6 +33,7 @@ pub struct MemorySegment { pub content: Vec, } +pub(crate) const NUM_PUBLIC_INPUTS: usize = 0; #[derive(Copy, Clone)] pub struct MemoryStark { @@ -157,7 +160,7 @@ impl, const D: usize> MemoryStark { .collect(); let is_read = &trace_cols[MEMORY_IS_READ]; let timestamp = &trace_cols[MEMORY_TIMESTAMP]; - + let ( sorted_context, sorted_segment, @@ -166,10 +169,10 @@ impl, const D: usize> MemoryStark { sorted_is_read, sorted_timestamp, ) = sort_memory_ops(context, segment, virtuals, &values, is_read, timestamp); - + let (context_first_change, segment_first_change, virtual_first_change) = generate_first_change_flags(&sorted_context, &sorted_segment, &sorted_virtual); - + let range_check_value = generate_range_check_value( &sorted_context, &sorted_segment, @@ -179,7 +182,7 @@ impl, const D: usize> MemoryStark { &segment_first_change, &virtual_first_change, ); - + trace_cols[SORTED_MEMORY_ADDR_CONTEXT] = sorted_context; trace_cols[SORTED_MEMORY_ADDR_SEGMENT] = sorted_segment; trace_cols[SORTED_MEMORY_ADDR_VIRTUAL] = sorted_virtual; @@ -188,12 +191,13 @@ impl, const D: usize> MemoryStark { } trace_cols[SORTED_MEMORY_IS_READ] = sorted_is_read; trace_cols[SORTED_MEMORY_TIMESTAMP] = sorted_timestamp; - + trace_cols[MEMORY_CONTEXT_FIRST_CHANGE] = context_first_change; trace_cols[MEMORY_SEGMENT_FIRST_CHANGE] = segment_first_change; trace_cols[MEMORY_VIRTUAL_FIRST_CHANGE] = virtual_first_change; - - trace_cols[crate::registers::range_check_degree::col_rc_degree_input(0)] = range_check_value; + + trace_cols[MEMORY_RANGE_CHECK] = range_check_value; + trace_cols[MEMORY_COUNTER] = (0..trace_cols.len()).map(|i| F::from_canonical_usize(i)).collect(); } } @@ -201,11 +205,15 @@ impl, const D: usize> Stark for MemoryStark, + fn eval_packed_generic( + &self, + vars: StarkEvaluationVars, yield_constr: &mut ConstraintConsumer

, - ) { - let one = P::from(F::ONE); + ) where + FE: FieldExtension, + P: PackedField, + { + let one = P::from(FE::ONE); let addr_context = vars.local_values[SORTED_MEMORY_ADDR_CONTEXT]; let addr_segment = vars.local_values[SORTED_MEMORY_ADDR_SEGMENT]; @@ -230,8 +238,7 @@ impl, const D: usize> Stark for MemoryStark, const D: usize> Stark for MemoryStark, - vars: StarkEvaluationTargets, + fn eval_ext_circuit( + &self, + builder: &mut plonky2::plonk::circuit_builder::CircuitBuilder, + vars: StarkEvaluationTargets, yield_constr: &mut RecursiveConstraintConsumer, ) { let one = builder.one_extension(); @@ -299,8 +307,7 @@ impl, const D: usize> Stark for MemoryStark, const D: usize> Stark for MemoryStark, const D: usize> Stark for MemoryStark usize { + 3 + } } diff --git a/evm/src/memory/registers.rs b/evm/src/memory/registers.rs index 2ab4619f..0a9f4f8e 100644 --- a/evm/src/memory/registers.rs +++ b/evm/src/memory/registers.rs @@ -28,4 +28,7 @@ pub(crate) const MEMORY_CONTEXT_FIRST_CHANGE: usize = SORTED_MEMORY_TIMESTAMP + pub(crate) const MEMORY_SEGMENT_FIRST_CHANGE: usize = MEMORY_CONTEXT_FIRST_CHANGE + 1; pub(crate) const MEMORY_VIRTUAL_FIRST_CHANGE: usize = MEMORY_SEGMENT_FIRST_CHANGE + 1; -pub(crate) const NUM_REGISTERS: usize = MEMORY_VIRTUAL_FIRST_CHANGE + 1; +pub(crate) const MEMORY_RANGE_CHECK: usize = MEMORY_VIRTUAL_FIRST_CHANGE + 1; +pub(crate) const MEMORY_COUNTER: usize = MEMORY_RANGE_CHECK + 1; + +pub(crate) const NUM_REGISTERS: usize = MEMORY_COUNTER + 1;