From 8e220ac623ea745a30e3775c383f77e409851177 Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Tue, 23 Aug 2022 23:20:20 -0700 Subject: [PATCH] Fix for CTL challenges See this line - ```rust challenges: ctl_data.challenges.challenges[i % config.num_challenges], ``` This doesn't work if we have multiple lookers from the same table; then `zs_columns` will contain multiple contiguous entries for the same challenge. We could fix the index calculation, but it seems a bit error-prone. Seems easier to store the specific challenge as part of `zs_columns`. --- evm/src/cross_table_lookup.rs | 55 +++++++++++++++++++---------------- evm/src/prover.rs | 36 ++++++++++------------- 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/evm/src/cross_table_lookup.rs b/evm/src/cross_table_lookup.rs index 4097df7b..b4b8d6fb 100644 --- a/evm/src/cross_table_lookup.rs +++ b/evm/src/cross_table_lookup.rs @@ -168,23 +168,21 @@ impl CrossTableLookup { } /// Cross-table lookup data for one table. -#[derive(Clone)] +#[derive(Clone, Default)] pub struct CtlData { - /// Challenges used in the argument. - pub(crate) challenges: GrandProductChallengeSet, - /// Vector of `(Z, columns, filter_columns)` where `Z` is a Z-polynomial for a lookup - /// on columns `columns` with filter columns `filter_columns`. - pub zs_columns: Vec<(PolynomialValues, Vec>, Option>)>, + pub(crate) zs_columns: Vec>, +} + +/// Cross-table lookup data associated with one Z(x) polynomial. +#[derive(Clone)] +pub(crate) struct CtlZData { + pub(crate) z: PolynomialValues, + pub(crate) challenge: GrandProductChallenge, + pub(crate) columns: Vec>, + pub(crate) filter_column: Option>, } impl CtlData { - pub(crate) fn new(challenges: GrandProductChallengeSet) -> Self { - Self { - challenges, - zs_columns: vec![], - } - } - pub fn len(&self) -> usize { self.zs_columns.len() } @@ -194,7 +192,10 @@ impl CtlData { } pub fn z_polys(&self) -> Vec> { - self.zs_columns.iter().map(|(p, _, _)| p.clone()).collect() + self.zs_columns + .iter() + .map(|zs_columns| zs_columns.z.clone()) + .collect() } } @@ -205,7 +206,7 @@ pub fn cross_table_lookup_data, const D challenger: &mut Challenger, ) -> Vec> { let challenges = get_grand_product_challenge_set(challenger, config.num_challenges); - let mut ctl_data_per_table = vec![CtlData::new(challenges.clone()); trace_poly_values.len()]; + let mut ctl_data_per_table = vec![CtlData::default(); trace_poly_values.len()]; for CrossTableLookup { looking_tables, looked_table, @@ -252,19 +253,23 @@ pub fn cross_table_lookup_data, const D ); for (table, z) in looking_tables.iter().zip(zs_looking) { - ctl_data_per_table[table.table as usize].zs_columns.push(( - z, - table.columns.clone(), - table.filter_column.clone(), - )); + ctl_data_per_table[table.table as usize] + .zs_columns + .push(CtlZData { + z, + challenge, + columns: table.columns.clone(), + filter_column: table.filter_column.clone(), + }); } ctl_data_per_table[looked_table.table as usize] .zs_columns - .push(( - z_looked, - looked_table.columns.clone(), - looked_table.filter_column.clone(), - )); + .push(CtlZData { + z: z_looked, + challenge, + columns: looked_table.columns.clone(), + filter_column: looked_table.filter_column.clone(), + }); } } ctl_data_per_table diff --git a/evm/src/prover.rs b/evm/src/prover.rs index 15b83173..e93ad754 100644 --- a/evm/src/prover.rs +++ b/evm/src/prover.rs @@ -422,17 +422,15 @@ where .zs_columns .iter() .enumerate() - .map( - |(i, (_, columns, filter_column))| CtlCheckVars:: { - local_z: permutation_ctl_zs_commitment.get_lde_values_packed(i_start, step) - [num_permutation_zs + i], - next_z: permutation_ctl_zs_commitment - .get_lde_values_packed(i_next_start, step)[num_permutation_zs + i], - challenges: ctl_data.challenges.challenges[i % config.num_challenges], - columns, - filter_column, - }, - ) + .map(|(i, zs_columns)| CtlCheckVars:: { + local_z: permutation_ctl_zs_commitment.get_lde_values_packed(i_start, step) + [num_permutation_zs + i], + next_z: permutation_ctl_zs_commitment.get_lde_values_packed(i_next_start, step) + [num_permutation_zs + i], + challenges: zs_columns.challenge, + columns: &zs_columns.columns, + filter_column: &zs_columns.filter_column, + }) .collect::>(); eval_vanishing_poly::( stark, @@ -547,15 +545,13 @@ fn check_constraints<'a, F, C, S, const D: usize>( .zs_columns .iter() .enumerate() - .map( - |(iii, (_, columns, filter_column))| CtlCheckVars:: { - local_z: permutation_ctl_zs_subgroup_evals[i][num_permutation_zs + iii], - next_z: permutation_ctl_zs_subgroup_evals[i_next][num_permutation_zs + iii], - challenges: ctl_data.challenges.challenges[iii % config.num_challenges], - columns, - filter_column, - }, - ) + .map(|(iii, zs_columns)| CtlCheckVars:: { + local_z: permutation_ctl_zs_subgroup_evals[i][num_permutation_zs + iii], + next_z: permutation_ctl_zs_subgroup_evals[i_next][num_permutation_zs + iii], + challenges: zs_columns.challenge, + columns: &zs_columns.columns, + filter_column: &zs_columns.filter_column, + }) .collect::>(); eval_vanishing_poly::( stark,