From aa77660bfe4d48db1f5f362b464a82085342685b Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Fri, 13 May 2022 14:16:28 +0200 Subject: [PATCH] Back to const generic + arrays --- starky2/src/all_stark.rs | 4 +-- starky2/src/cross_table_lookup.rs | 2 +- starky2/src/permutation.rs | 2 +- starky2/src/prover.rs | 49 ++++++++++++++++++++++--------- starky2/src/stark.rs | 11 +++++-- starky2/src/stark_testing.rs | 7 +++-- starky2/src/vanishing_poly.rs | 2 +- starky2/src/vars.rs | 8 ++--- starky2/src/verifier.rs | 8 +++-- 9 files changed, 62 insertions(+), 31 deletions(-) diff --git a/starky2/src/all_stark.rs b/starky2/src/all_stark.rs index 0aa080d8..bcfe9935 100644 --- a/starky2/src/all_stark.rs +++ b/starky2/src/all_stark.rs @@ -52,7 +52,7 @@ impl, const D: usize> Stark for CpuStark( &self, - _vars: StarkEvaluationVars, + _vars: StarkEvaluationVars, _yield_constr: &mut ConstraintConsumer

, ) where FE: FieldExtension, @@ -79,7 +79,7 @@ impl, const D: usize> Stark for KeccakStark( &self, - _vars: StarkEvaluationVars, + _vars: StarkEvaluationVars, _yield_constr: &mut ConstraintConsumer

, ) where FE: FieldExtension, diff --git a/starky2/src/cross_table_lookup.rs b/starky2/src/cross_table_lookup.rs index af8f5c5d..14932ea2 100644 --- a/starky2/src/cross_table_lookup.rs +++ b/starky2/src/cross_table_lookup.rs @@ -220,7 +220,7 @@ impl<'a, F: RichField + Extendable, const D: usize> } pub(crate) fn eval_cross_table_lookup_checks( - vars: StarkEvaluationVars, + vars: StarkEvaluationVars, ctl_vars: &[CTLCheckVars], consumer: &mut ConstraintConsumer

, ) where diff --git a/starky2/src/permutation.rs b/starky2/src/permutation.rs index 51142724..56784f8f 100644 --- a/starky2/src/permutation.rs +++ b/starky2/src/permutation.rs @@ -260,7 +260,7 @@ where pub(crate) fn eval_permutation_checks( stark: &S, config: &StarkConfig, - vars: StarkEvaluationVars, + vars: StarkEvaluationVars, permutation_vars: PermutationCheckVars, consumer: &mut ConstraintConsumer

, ) where diff --git a/starky2/src/prover.rs b/starky2/src/prover.rs index 4120275f..a5f1c6fd 100644 --- a/starky2/src/prover.rs +++ b/starky2/src/prover.rs @@ -18,7 +18,7 @@ use plonky2::util::transpose; use plonky2_util::{log2_ceil, log2_strict}; use rayon::prelude::*; -use crate::all_stark::{AllStark, Table}; +use crate::all_stark::{AllStark, CpuStark, KeccakStark, Table}; use crate::config::StarkConfig; use crate::constraint_consumer::ConstraintConsumer; use crate::cross_table_lookup::{cross_table_lookup_data, CTLCheckVars, CtlData}; @@ -44,6 +44,10 @@ where C: GenericConfig, [(); <::Packing>::WIDTH]:, [(); C::Hasher::HASH_SIZE]:, + [(); CpuStark::::COLUMNS]:, + [(); CpuStark::::PUBLIC_INPUTS]:, + [(); KeccakStark::::COLUMNS]:, + [(); KeccakStark::::PUBLIC_INPUTS]:, { let num_starks = Table::Keccak as usize + 1; debug_assert_eq!(num_starks, trace_poly_values.len()); @@ -94,7 +98,10 @@ where &trace_poly_values[Table::Cpu as usize], &trace_commitments[Table::Cpu as usize], &ctl_data_per_table[Table::Cpu as usize], - &public_inputs[Table::Cpu as usize], + public_inputs[Table::Cpu as usize] + .clone() + .try_into() + .unwrap(), &mut challenger, timing, )?; @@ -104,7 +111,10 @@ where &trace_poly_values[Table::Keccak as usize], &trace_commitments[Table::Keccak as usize], &ctl_data_per_table[Table::Keccak as usize], - &public_inputs[Table::Keccak as usize], + public_inputs[Table::Keccak as usize] + .clone() + .try_into() + .unwrap(), &mut challenger, timing, )?; @@ -122,7 +132,7 @@ fn prove_single_table( trace_poly_values: &[PolynomialValues], trace_commitment: &PolynomialBatch, ctl_data: &CtlData, - public_inputs: &[F], + public_inputs: [F; S::PUBLIC_INPUTS], challenger: &mut Challenger, timing: &mut TimingTree, ) -> Result> @@ -132,8 +142,8 @@ where S: Stark, [(); <::Packing>::WIDTH]:, [(); C::Hasher::HASH_SIZE]:, - // [(); S::COLUMNS]:, - // [(); S::PUBLIC_INPUTS]:, + [(); S::COLUMNS]:, + [(); S::PUBLIC_INPUTS]:, { let degree = trace_poly_values[0].len(); let degree_bits = log2_strict(degree); @@ -294,7 +304,7 @@ fn compute_quotient_polys<'a, F, P, C, S, const D: usize>( permutation_ctl_zs_commitment: Option<&'a PolynomialBatch>, permutation_challenges: Option<&'a Vec>>, ctl_data: &CtlData, - public_inputs: &[F], + public_inputs: [F; S::PUBLIC_INPUTS], alphas: Vec, degree_bits: usize, num_permutation_zs: usize, @@ -305,6 +315,9 @@ where P: PackedField, C: GenericConfig, S: Stark, + [(); S::COLUMNS]:, + [(); S::PUBLIC_INPUTS]:, + [(); P::WIDTH]:, { let degree = 1 << degree_bits; let rate_bits = config.fri_config.rate_bits; @@ -327,8 +340,12 @@ where let z_h_on_coset = ZeroPolyOnCoset::::new(degree_bits, quotient_degree_bits); // Retrieve the LDE values at index `i`. - let get_trace_values_packed = - |i_start| -> Vec

{ trace_commitment.get_lde_values_packed(i_start, step) }; + let get_trace_values_packed = |i_start| -> [P; S::COLUMNS] { + trace_commitment + .get_lde_values_packed(i_start, step) + .try_into() + .unwrap() + }; // Last element of the subgroup. let last = F::primitive_root_of_unity(degree_bits).inverse(); @@ -362,7 +379,7 @@ where let vars = StarkEvaluationVars { local_values: &get_trace_values_packed(i_start), next_values: &get_trace_values_packed(i_next_start), - public_inputs, + public_inputs: &public_inputs, }; let permutation_check_data = if let (Some(permutation_zs_commitment), Some(permutation_challenge_sets)) = @@ -428,7 +445,7 @@ fn check_constraints<'a, F, C, S, const D: usize>( permutation_ctl_zs_commitment: Option<&'a PolynomialBatch>, permutation_challenges: Option<&'a Vec>>, ctl_data: &CtlData, - public_inputs: &[F], + public_inputs: [F; S::PUBLIC_INPUTS], alphas: Vec, degree_bits: usize, num_permutation_zs: usize, @@ -437,6 +454,8 @@ fn check_constraints<'a, F, C, S, const D: usize>( F: RichField + Extendable, C: GenericConfig, S: Stark, + [(); S::COLUMNS]:, + [(); S::PUBLIC_INPUTS]:, { let degree = 1 << degree_bits; let rate_bits = 0; // Set this to higher value to check constraint degree. @@ -478,9 +497,11 @@ fn check_constraints<'a, F, C, S, const D: usize>( lagrange_basis_last, ); let vars = StarkEvaluationVars { - local_values: &get_comm_values(trace_commitment, i), - next_values: &get_comm_values(trace_commitment, i_next), - public_inputs, + local_values: &get_comm_values(trace_commitment, i).try_into().unwrap(), + next_values: &get_comm_values(trace_commitment, i_next) + .try_into() + .unwrap(), + public_inputs: &public_inputs, }; let permutation_check_data = if let (Some(permutation_zs_commitment), Some(permutation_challenge_sets)) = diff --git a/starky2/src/stark.rs b/starky2/src/stark.rs index bb8429cd..dcf1a73f 100644 --- a/starky2/src/stark.rs +++ b/starky2/src/stark.rs @@ -33,7 +33,7 @@ pub trait Stark, const D: usize>: Sync { /// constraints over `F`. fn eval_packed_generic( &self, - vars: StarkEvaluationVars, + vars: StarkEvaluationVars, yield_constr: &mut ConstraintConsumer

, ) where FE: FieldExtension, @@ -42,7 +42,7 @@ pub trait Stark, const D: usize>: Sync { /// Evaluate constraints at a vector of points from the base field `F`. fn eval_packed_base>( &self, - vars: StarkEvaluationVars, + vars: StarkEvaluationVars, yield_constr: &mut ConstraintConsumer

, ) { self.eval_packed_generic(vars, yield_constr) @@ -51,7 +51,12 @@ pub trait Stark, const D: usize>: Sync { /// Evaluate constraints at a single point from the degree `D` extension field. fn eval_ext( &self, - vars: StarkEvaluationVars, + vars: StarkEvaluationVars< + F::Extension, + F::Extension, + { Self::COLUMNS }, + { Self::PUBLIC_INPUTS }, + >, yield_constr: &mut ConstraintConsumer, ) { self.eval_packed_generic(vars, yield_constr) diff --git a/starky2/src/stark_testing.rs b/starky2/src/stark_testing.rs index 10834649..222ebf39 100644 --- a/starky2/src/stark_testing.rs +++ b/starky2/src/stark_testing.rs @@ -37,8 +37,11 @@ where let constraint_evals = (0..size) .map(|i| { let vars = StarkEvaluationVars { - local_values: &trace_ldes[i], - next_values: &trace_ldes[(i + (1 << rate_bits)) % size], + local_values: &trace_ldes[i].clone().try_into().unwrap(), + next_values: &trace_ldes[(i + (1 << rate_bits)) % size] + .clone() + .try_into() + .unwrap(), public_inputs: &public_inputs, }; diff --git a/starky2/src/vanishing_poly.rs b/starky2/src/vanishing_poly.rs index c23462c1..459c27de 100644 --- a/starky2/src/vanishing_poly.rs +++ b/starky2/src/vanishing_poly.rs @@ -17,7 +17,7 @@ use crate::vars::{StarkEvaluationTargets, StarkEvaluationVars}; pub(crate) fn eval_vanishing_poly( stark: &S, config: &StarkConfig, - vars: StarkEvaluationVars, + vars: StarkEvaluationVars, permutation_vars: Option>, ctl_vars: &[CTLCheckVars], consumer: &mut ConstraintConsumer

, diff --git a/starky2/src/vars.rs b/starky2/src/vars.rs index bef8557b..cb83aeb7 100644 --- a/starky2/src/vars.rs +++ b/starky2/src/vars.rs @@ -3,14 +3,14 @@ use plonky2::field::packed_field::PackedField; use plonky2::iop::ext_target::ExtensionTarget; #[derive(Debug, Copy, Clone)] -pub struct StarkEvaluationVars<'a, F, P> +pub struct StarkEvaluationVars<'a, F, P, const COLUMNS: usize, const PUBLIC_INPUTS: usize> where F: Field, P: PackedField, { - pub local_values: &'a [P], - pub next_values: &'a [P], - pub public_inputs: &'a [P::Scalar], + pub local_values: &'a [P; COLUMNS], + pub next_values: &'a [P; COLUMNS], + pub public_inputs: &'a [P::Scalar; PUBLIC_INPUTS], } #[derive(Debug, Copy, Clone)] diff --git a/starky2/src/verifier.rs b/starky2/src/verifier.rs index bb156128..c219dbe4 100644 --- a/starky2/src/verifier.rs +++ b/starky2/src/verifier.rs @@ -108,13 +108,15 @@ where quotient_polys, } = &proof.openings; let vars = StarkEvaluationVars { - local_values, - next_values, + local_values: &local_values.to_vec().try_into().unwrap(), + next_values: &next_values.to_vec().try_into().unwrap(), public_inputs: &public_inputs .iter() .copied() .map(F::Extension::from_basefield) - .collect::>(), + .collect::>() + .try_into() + .unwrap(), }; let degree_bits = proof.recover_degree_bits(config);