From 80e87becb8e0058861accfab90dc2a8ba5264845 Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Fri, 2 Apr 2021 19:15:39 -0700 Subject: [PATCH] Minor refactor --- src/circuit_data.rs | 18 ++---------------- src/constraint_polynomial.rs | 1 + src/gates/gate.rs | 9 +++++++++ src/plonk_common.rs | 33 +++++++++++++++++++++++++++++++++ src/prover.rs | 5 +++-- 5 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/circuit_data.rs b/src/circuit_data.rs index ff837f36..79dae85b 100644 --- a/src/circuit_data.rs +++ b/src/circuit_data.rs @@ -1,4 +1,3 @@ -use crate::constraint_polynomial::{EvaluationTargets, EvaluationVars}; use crate::field::field::Field; use crate::gates::gate::GateRef; use crate::generator::WitnessGenerator; @@ -7,6 +6,7 @@ use crate::prover::prove; use crate::target::Target; use crate::verifier::verify; use crate::witness::PartialWitness; +use crate::circuit_builder::CircuitBuilder; #[derive(Copy, Clone)] pub struct CircuitConfig { @@ -97,6 +97,7 @@ pub(crate) struct CommonCircuitData { /// The types of gates used in this circuit. pub(crate) gates: Vec>, + /// The largest number of constraints imposed by any gate. pub(crate) num_gate_constraints: usize, /// A commitment to each constant polynomial. @@ -137,19 +138,4 @@ impl CommonCircuitData { // 2 constraints for each Z check. self.config.num_checks * 2 + self.num_gate_constraints } - - pub fn evaluate(&self, vars: EvaluationVars) -> Vec { - let mut constraints = vec![F::ZERO; self.num_gate_constraints]; - for gate in &self.gates { - let gate_constraints = gate.0.eval_filtered(vars); - for (i, c) in gate_constraints.into_iter().enumerate() { - constraints[i] += c; - } - } - constraints - } - - pub fn evaluate_recursive(&self, vars: EvaluationTargets) -> Vec { - todo!() - } } diff --git a/src/constraint_polynomial.rs b/src/constraint_polynomial.rs index 2f8ce83b..532ddbfe 100644 --- a/src/constraint_polynomial.rs +++ b/src/constraint_polynomial.rs @@ -9,6 +9,7 @@ pub struct EvaluationVars<'a, F: Field> { pub(crate) next_wires: &'a [F], } +#[derive(Copy, Clone)] pub struct EvaluationTargets<'a> { pub(crate) local_constants: &'a [Target], pub(crate) next_constants: &'a [Target], diff --git a/src/gates/gate.rs b/src/gates/gate.rs index 075e2aab..f5767b2f 100644 --- a/src/gates/gate.rs +++ b/src/gates/gate.rs @@ -24,6 +24,15 @@ pub trait Gate: 'static + Send + Sync { self.eval_unfiltered(vars) } + fn eval_filtered_recursively( + &self, + builder: &mut CircuitBuilder, + vars: EvaluationTargets, + ) -> Vec { + // TODO: Filter + self.eval_unfiltered_recursively(builder, vars) + } + fn generators( &self, gate_index: usize, diff --git a/src/plonk_common.rs b/src/plonk_common.rs index 4a0136de..166bc150 100644 --- a/src/plonk_common.rs +++ b/src/plonk_common.rs @@ -1,6 +1,39 @@ use crate::circuit_builder::CircuitBuilder; use crate::field::field::Field; use crate::target::Target; +use crate::constraint_polynomial::{EvaluationTargets, EvaluationVars}; +use crate::gates::gate::GateRef; + +pub fn evaluate_gate_constraints( + gates: &[GateRef], + num_gate_constraints: usize, + vars: EvaluationVars, +) -> Vec { + let mut constraints = vec![F::ZERO; num_gate_constraints]; + for gate in gates { + let gate_constraints = gate.0.eval_filtered(vars); + for (i, c) in gate_constraints.into_iter().enumerate() { + constraints[i] += c; + } + } + constraints +} + +pub fn evaluate_gate_constraints_recursively( + builder: &mut CircuitBuilder, + gates: &[GateRef], + num_gate_constraints: usize, + vars: EvaluationTargets, +) -> Vec { + let mut constraints = vec![builder.zero(); num_gate_constraints]; + for gate in gates { + let gate_constraints = gate.0.eval_filtered_recursively(builder, vars); + for (i, c) in gate_constraints.into_iter().enumerate() { + constraints[i] = builder.add(constraints[i], c); + } + } + constraints +} /// Evaluate the polynomial which vanishes on any multiplicative subgroup of a given order `n`. pub(crate) fn eval_zero_poly(n: usize, x: F) -> F { diff --git a/src/prover.rs b/src/prover.rs index 13890a6a..15305c08 100644 --- a/src/prover.rs +++ b/src/prover.rs @@ -10,7 +10,7 @@ use crate::field::field::Field; use crate::generator::generate_partial_witness; use crate::hash::merkle_root_bit_rev_order; use crate::plonk_challenger::Challenger; -use crate::plonk_common::{eval_l_1, reduce_with_powers_multi}; +use crate::plonk_common::{eval_l_1, reduce_with_powers_multi, evaluate_gate_constraints}; use crate::polynomial::division::divide_by_z_h; use crate::polynomial::polynomial::{PolynomialCoeffs, PolynomialValues}; use crate::proof::Proof; @@ -190,7 +190,8 @@ fn compute_vanishing_poly_entry( gamma: F, alphas: &[F], ) -> Vec { - let constraint_terms = common_data.evaluate(vars); + let constraint_terms = evaluate_gate_constraints( + &common_data.gates, common_data.num_gate_constraints, vars); // The L_1(x) (Z(x) - 1) vanishing terms. let mut vanishing_z_1_terms = Vec::new();