From 296b21aed95726c661ef224c623dce536cedd3e3 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Thu, 17 Mar 2022 11:48:44 +0100 Subject: [PATCH] Not working --- plonky2/src/gates/gate.rs | 36 +++++++++++++------------ plonky2/src/gates/gate_testing.rs | 2 +- plonky2/src/plonk/recursive_verifier.rs | 5 ++-- plonky2/src/plonk/vanishing_poly.rs | 32 +++++++++++----------- plonky2/src/plonk/vars.rs | 8 +++--- 5 files changed, 43 insertions(+), 40 deletions(-) diff --git a/plonky2/src/gates/gate.rs b/plonky2/src/gates/gate.rs index 634c71f6..82d8a6bb 100644 --- a/plonky2/src/gates/gate.rs +++ b/plonky2/src/gates/gate.rs @@ -129,11 +129,17 @@ pub trait Gate, const D: usize>: 'static + Send + S &self, builder: &mut CircuitBuilder, mut vars: EvaluationTargets, - prefix: &[bool], + selector_index: usize, + combination_num: usize, combined_gate_constraints: &mut [ExtensionTarget], ) { - let filter = compute_filter_recursively(builder, prefix, vars.local_constants); - vars.remove_prefix(prefix); + let filter = compute_filter_recursively( + builder, + selector_index, + combination_num, + vars.local_constants[selector_index], + ); + vars.remove_prefix(selector_index); let my_constraints = self.eval_unfiltered_recursively(builder, vars); for (acc, c) in combined_gate_constraints.iter_mut().zip(my_constraints) { *acc = builder.mul_add_extension(filter, c, *acc); @@ -238,21 +244,17 @@ fn compute_filter<'a, K: Field>(selector_index: usize, combination_num: usize, c fn compute_filter_recursively, const D: usize>( builder: &mut CircuitBuilder, - prefix: &[bool], - constants: &[ExtensionTarget], + selector_index: usize, + combination_num: usize, + constant: ExtensionTarget, ) -> ExtensionTarget { - let one = builder.one_extension(); - let v = prefix - .iter() - .enumerate() - .map(|(i, &b)| { - if b { - constants[i] - } else { - builder.sub_extension(one, constants[i]) - } - }) + let v = (0..combination_num) + .filter(|&i| i != selector_index) + .map(|i| builder.constant_extension(F::Extension::from_canonical_usize(i))) + .collect::>(); + let v = v + .into_iter() + .map(|x| builder.sub_extension(x, constant)) .collect::>(); - builder.mul_many_extension(&v) } diff --git a/plonky2/src/gates/gate_testing.rs b/plonky2/src/gates/gate_testing.rs index 20e45e32..2b40b37d 100644 --- a/plonky2/src/gates/gate_testing.rs +++ b/plonky2/src/gates/gate_testing.rs @@ -152,7 +152,7 @@ where let evals = gate.eval_unfiltered(vars); let vars_t = EvaluationTargets { - local_constants: &constants_t, + local_constants: constants_t, local_wires: &wires_t, public_inputs_hash: &public_inputs_hash_t, }; diff --git a/plonky2/src/plonk/recursive_verifier.rs b/plonky2/src/plonk/recursive_verifier.rs index fb4238ee..ce29c7a9 100644 --- a/plonky2/src/plonk/recursive_verifier.rs +++ b/plonky2/src/plonk/recursive_verifier.rs @@ -53,7 +53,7 @@ impl, const D: usize> CircuitBuilder { { let one = self.one_extension(); - let local_constants = &proof.openings.constants; + let local_constants = proof.openings.constants.clone(); let local_wires = &proof.openings.wires; let vars = EvaluationTargets { local_constants, @@ -230,6 +230,7 @@ mod tests { let (proof, vd, cd) = recursive_proof::(proof, vd, cd, &config, Some(13), false, false)?; assert_eq!(cd.degree_bits, 13); + test_serialization(&proof, &cd)?; // Shrink it to 2^12. let (proof, _vd, cd) = @@ -403,7 +404,7 @@ mod tests { timing.print(); } - data.verify(proof.clone())?; + // data.verify(proof.clone())?; Ok((proof, data.verifier_only, data.common)) } diff --git a/plonky2/src/plonk/vanishing_poly.rs b/plonky2/src/plonk/vanishing_poly.rs index c5e0d563..5caaef1c 100644 --- a/plonky2/src/plonk/vanishing_poly.rs +++ b/plonky2/src/plonk/vanishing_poly.rs @@ -275,21 +275,21 @@ pub fn evaluate_gate_constraints_recursively< common_data: &CommonCircuitData, vars: EvaluationTargets, ) -> Vec> { - todo!(); - // let mut all_gate_constraints = vec![builder.zero_extension(); num_gate_constraints]; - // for gate in gates { - // with_context!( - // builder, - // &format!("evaluate {} constraints", gate.gate.0.id()), - // gate.gate.0.eval_filtered_recursively( - // builder, - // vars, - // &gate.prefix, - // &mut all_gate_constraints - // ) - // ); - // } - // all_gate_constraints + let mut all_gate_constraints = vec![builder.zero_extension(); common_data.num_gate_constraints]; + for (i, gate) in common_data.gates.iter().enumerate() { + with_context!( + builder, + &format!("evaluate {} constraints", gate.0.id()), + gate.0.eval_filtered_recursively( + builder, + vars.clone(), + common_data.selector_indices[i], + common_data.combination_nums[i], + &mut all_gate_constraints + ) + ); + } + all_gate_constraints } /// Evaluate the vanishing polynomial at `x`. In this context, the vanishing polynomial is a random @@ -322,7 +322,7 @@ pub(crate) fn eval_vanishing_poly_recursively< let constraint_terms = with_context!( builder, "evaluate gate constraints", - evaluate_gate_constraints_recursively(builder, common_data, vars,) + evaluate_gate_constraints_recursively(builder, common_data, vars.clone()) ); // The L_1(x) (Z(x) - 1) vanishing terms. diff --git a/plonky2/src/plonk/vars.rs b/plonky2/src/plonk/vars.rs index b9001703..10110d81 100644 --- a/plonky2/src/plonk/vars.rs +++ b/plonky2/src/plonk/vars.rs @@ -218,14 +218,14 @@ impl<'a, P: PackedField> ExactSizeIterator for EvaluationVarsBaseBatchIterPacked } impl<'a, const D: usize> EvaluationTargets<'a, D> { - pub fn remove_prefix(&mut self, prefix: &[bool]) { - self.local_constants = &self.local_constants[prefix.len()..]; + pub fn remove_prefix(&mut self, selector_index: usize) { + self.local_constants.remove(selector_index); } } -#[derive(Copy, Clone)] +#[derive(Clone)] pub struct EvaluationTargets<'a, const D: usize> { - pub local_constants: &'a [ExtensionTarget], + pub local_constants: Vec>, pub local_wires: &'a [ExtensionTarget], pub public_inputs_hash: &'a HashOutTarget, }