From d56e3745dda5cc35d5ec86a81b5c505e94b89a39 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Wed, 4 May 2022 22:04:11 +0200 Subject: [PATCH] Progress --- starky2/src/mock_stark.rs | 4 +- starky2/src/permutation.rs | 4 +- starky2/src/prover.rs | 117 +++++++++++++++++++++++++++------- starky2/src/stark.rs | 11 +--- starky2/src/stark_testing.rs | 7 +- starky2/src/vanishing_poly.rs | 4 +- starky2/src/vars.rs | 8 +-- starky2/src/verifier.rs | 8 +-- 8 files changed, 110 insertions(+), 53 deletions(-) diff --git a/starky2/src/mock_stark.rs b/starky2/src/mock_stark.rs index 767bf580..ba415a12 100644 --- a/starky2/src/mock_stark.rs +++ b/starky2/src/mock_stark.rs @@ -66,7 +66,7 @@ impl, const D: usize> Stark for FibonacciStar fn eval_packed_generic( &self, - vars: StarkEvaluationVars, + vars: StarkEvaluationVars, yield_constr: &mut ConstraintConsumer

, ) where FE: FieldExtension, @@ -195,7 +195,7 @@ impl, const D: usize, const W: usize> Stark fn eval_packed_generic( &self, - vars: StarkEvaluationVars, + vars: StarkEvaluationVars, yield_constr: &mut ConstraintConsumer

, ) where FE: FieldExtension, diff --git a/starky2/src/permutation.rs b/starky2/src/permutation.rs index 443ff787..ad3efd0c 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_data: PermutationCheckVars, consumer: &mut ConstraintConsumer

, ) where @@ -269,8 +269,6 @@ pub(crate) fn eval_permutation_checks, C: GenericConfig, S: Stark, - [(); S::COLUMNS]:, - [(); S::PUBLIC_INPUTS]:, { let PermutationCheckVars { local_zs, diff --git a/starky2/src/prover.rs b/starky2/src/prover.rs index 0e59d79e..1ecb8560 100644 --- a/starky2/src/prover.rs +++ b/starky2/src/prover.rs @@ -3,7 +3,7 @@ use std::marker::PhantomData; use anyhow::{ensure, Result}; use itertools::Itertools; -use plonky2::field::extension_field::Extendable; +use plonky2::field::extension_field::{Extendable, FieldExtension}; use plonky2::field::field_types::Field; use plonky2::field::packable::Packable; use plonky2::field::packed_field::PackedField; @@ -20,7 +20,7 @@ use plonky2_util::{log2_ceil, log2_strict}; use rayon::prelude::*; use crate::config::StarkConfig; -use crate::constraint_consumer::ConstraintConsumer; +use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer}; use crate::permutation::PermutationCheckVars; use crate::permutation::{ compute_permutation_z_polys, get_n_permutation_challenge_sets, PermutationChallengeSet, @@ -28,7 +28,7 @@ use crate::permutation::{ use crate::proof::{StarkOpeningSet, StarkProof, StarkProofWithPublicInputs}; use crate::stark::Stark; use crate::vanishing_poly::eval_vanishing_poly; -use crate::vars::StarkEvaluationVars; +use crate::vars::{StarkEvaluationTargets, StarkEvaluationVars}; pub enum Table { Cpu = 0, @@ -38,10 +38,69 @@ pub enum Table { struct CpuStark { f: PhantomData, } + +impl, const D: usize> Stark for CpuStark { + const COLUMNS: usize = 0; + const PUBLIC_INPUTS: usize = 0; + + fn eval_packed_generic( + &self, + vars: StarkEvaluationVars, + yield_constr: &mut ConstraintConsumer

, + ) where + FE: FieldExtension, + P: PackedField, + { + todo!() + } + + fn eval_ext_recursively( + &self, + builder: &mut plonky2::plonk::circuit_builder::CircuitBuilder, + vars: StarkEvaluationTargets, + yield_constr: &mut RecursiveConstraintConsumer, + ) { + todo!() + } + + fn constraint_degree(&self) -> usize { + todo!() + } +} + struct KeccakStark { f: PhantomData, } +impl, const D: usize> Stark for KeccakStark { + const COLUMNS: usize = 0; + const PUBLIC_INPUTS: usize = 0; + + fn eval_packed_generic( + &self, + vars: StarkEvaluationVars, + yield_constr: &mut ConstraintConsumer

, + ) where + FE: FieldExtension, + P: PackedField, + { + todo!() + } + + fn eval_ext_recursively( + &self, + builder: &mut plonky2::plonk::circuit_builder::CircuitBuilder, + vars: StarkEvaluationTargets, + yield_constr: &mut RecursiveConstraintConsumer, + ) { + todo!() + } + + fn constraint_degree(&self) -> usize { + todo!() + } +} + pub struct AllStarks, const D: usize> { cpu: CpuStark, keccak: KeccakStark, @@ -78,7 +137,7 @@ pub fn prove( cross_table_lookups: Vec, public_inputs: Vec>, timing: &mut TimingTree, -) -> Result> +) -> Result>> where F: RichField + Extendable, C: GenericConfig, @@ -128,16 +187,35 @@ where challenger.observe_cap(cap); } - todo!() + let cpu_proof = do_rest( + &all_starks.cpu, + config, + &trace_poly_values[Table::Cpu as usize], + &trace_commitments[Table::Cpu as usize], + &public_inputs[Table::Cpu as usize], + &mut challenger, + timing, + )?; + let keccak_proof = do_rest( + &all_starks.keccak, + config, + &trace_poly_values[Table::Keccak as usize], + &trace_commitments[Table::Keccak as usize], + &public_inputs[Table::Keccak as usize], + &mut challenger, + timing, + )?; + + Ok(vec![cpu_proof, keccak_proof]) } fn do_rest( - stark: S, + stark: &S, config: &StarkConfig, - trace_poly_values: Vec>, - trace_commitment: PolynomialBatch, + trace_poly_values: &[PolynomialValues], + trace_commitment: &PolynomialBatch, // lookup info - public_inputs: [F; S::PUBLIC_INPUTS], + public_inputs: &[F], challenger: &mut Challenger, timing: &mut TimingTree, ) -> Result> @@ -147,8 +225,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); @@ -247,7 +325,7 @@ where ); challenger.observe_openings(&openings.to_fri_openings()); - let initial_merkle_trees = once(&trace_commitment) + let initial_merkle_trees = once(trace_commitment) .chain(permutation_zs_commitment) .chain(once("ient_commitment)) .collect_vec(); @@ -264,7 +342,7 @@ where ) ); let proof = StarkProof { - trace_cap: trace_commitment.merkle_tree.cap, + trace_cap: trace_commitment.merkle_tree.cap.clone(), permutation_zs_cap, quotient_polys_cap, openings, @@ -301,7 +379,7 @@ fn compute_quotient_polys<'a, F, P, C, S, const D: usize>( PolynomialBatch, Vec>, )>, - public_inputs: [F; S::PUBLIC_INPUTS], + public_inputs: &[F], alphas: Vec, degree_bits: usize, config: &StarkConfig, @@ -311,9 +389,6 @@ 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; @@ -336,12 +411,8 @@ 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| -> [P; S::COLUMNS] { - trace_commitment - .get_lde_values_packed(i_start, step) - .try_into() - .unwrap() - }; + let get_trace_values_packed = + |i_start| -> Vec

{ trace_commitment.get_lde_values_packed(i_start, step) }; // Last element of the subgroup. let last = F::primitive_root_of_unity(degree_bits).inverse(); diff --git a/starky2/src/stark.rs b/starky2/src/stark.rs index a130d283..c5ec5405 100644 --- a/starky2/src/stark.rs +++ b/starky2/src/stark.rs @@ -30,7 +30,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, @@ -39,7 +39,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) @@ -48,12 +48,7 @@ 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< - F::Extension, - F::Extension, - { Self::COLUMNS }, - { Self::PUBLIC_INPUTS }, - >, + vars: StarkEvaluationVars, 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 222ebf39..10834649 100644 --- a/starky2/src/stark_testing.rs +++ b/starky2/src/stark_testing.rs @@ -37,11 +37,8 @@ where let constraint_evals = (0..size) .map(|i| { let vars = StarkEvaluationVars { - local_values: &trace_ldes[i].clone().try_into().unwrap(), - next_values: &trace_ldes[(i + (1 << rate_bits)) % size] - .clone() - .try_into() - .unwrap(), + local_values: &trace_ldes[i], + next_values: &trace_ldes[(i + (1 << rate_bits)) % size], public_inputs: &public_inputs, }; diff --git a/starky2/src/vanishing_poly.rs b/starky2/src/vanishing_poly.rs index dc32b800..0a3f4514 100644 --- a/starky2/src/vanishing_poly.rs +++ b/starky2/src/vanishing_poly.rs @@ -16,7 +16,7 @@ use crate::vars::{StarkEvaluationTargets, StarkEvaluationVars}; pub(crate) fn eval_vanishing_poly( stark: &S, config: &StarkConfig, - vars: StarkEvaluationVars, + vars: StarkEvaluationVars, permutation_data: Option>, consumer: &mut ConstraintConsumer

, ) where @@ -25,8 +25,6 @@ pub(crate) fn eval_vanishing_poly, C: GenericConfig, S: Stark, - [(); S::COLUMNS]:, - [(); S::PUBLIC_INPUTS]:, { stark.eval_packed_generic(vars, consumer); if let Some(permutation_data) = permutation_data { diff --git a/starky2/src/vars.rs b/starky2/src/vars.rs index cb83aeb7..bef8557b 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, const COLUMNS: usize, const PUBLIC_INPUTS: usize> +pub struct StarkEvaluationVars<'a, F, P> where F: Field, P: PackedField, { - pub local_values: &'a [P; COLUMNS], - pub next_values: &'a [P; COLUMNS], - pub public_inputs: &'a [P::Scalar; PUBLIC_INPUTS], + pub local_values: &'a [P], + pub next_values: &'a [P], + pub public_inputs: &'a [P::Scalar], } #[derive(Debug, Copy, Clone)] diff --git a/starky2/src/verifier.rs b/starky2/src/verifier.rs index ca88ae8b..d5344a44 100644 --- a/starky2/src/verifier.rs +++ b/starky2/src/verifier.rs @@ -68,14 +68,12 @@ where quotient_polys, } = &proof.openings; let vars = StarkEvaluationVars { - local_values: &local_values.to_vec().try_into().unwrap(), - next_values: &next_values.to_vec().try_into().unwrap(), + local_values: &local_values, + next_values: &next_values, public_inputs: &public_inputs .into_iter() .map(F::Extension::from_basefield) - .collect::>() - .try_into() - .unwrap(), + .collect::>(), }; let (l_1, l_last) = eval_l_1_and_l_last(degree_bits, challenges.stark_zeta);