From 521bc3d2d81ed55123aed8d5337c31b53bd36883 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 6 Jun 2023 18:38:41 +0000 Subject: [PATCH] Split `ConstraintSystem` into a builder type and a verifying key type This is an initial refactor performed during Halo 2 Office Hours, to explore the effects of this split on the wider codebase. At the end, we discussed the result, and noted that the verifying key type still contains data in sub-types that is irrelevant to the actual verifying key. The verifying key type is also never exposed in the public API of the verifying key; `ConstraintSystem` was only public for its use in `Circuit::configure`. The likely next steps are: - Rework `PinnedConstraintSystem` to be the verifying key type, only storing the data needed for the transcript, but being an owned type that exposes immutable references via methods instead of its fields being `pub(crate)`. - Undo the `ConstraintSystemBuilder` rename, so we are just removing parts of the `ConstraintSystem` API. - Rework `ConstraintSystem::pinned` and `VerifyingKey::from_parts` to instead become the builder method for the verifying key type along with the data that is cached alongside it inside `VerifyingKey`. - Refactor the very few methods that we identified as only relevant to the verifying key type, as they are only used redundantly. --- halo2_gadgets/benches/poseidon.rs | 4 +- halo2_gadgets/benches/sha256.rs | 4 +- halo2_gadgets/src/ecc.rs | 4 +- halo2_gadgets/src/ecc/chip.rs | 4 +- halo2_gadgets/src/ecc/chip/add.rs | 8 +- halo2_gadgets/src/ecc/chip/add_incomplete.rs | 6 +- halo2_gadgets/src/ecc/chip/mul.rs | 6 +- halo2_gadgets/src/ecc/chip/mul/complete.rs | 6 +- halo2_gadgets/src/ecc/chip/mul/incomplete.rs | 7 +- halo2_gadgets/src/ecc/chip/mul/overflow.rs | 8 +- halo2_gadgets/src/ecc/chip/mul_fixed.rs | 6 +- .../src/ecc/chip/mul_fixed/base_field_elem.rs | 6 +- .../src/ecc/chip/mul_fixed/full_width.rs | 6 +- halo2_gadgets/src/ecc/chip/mul_fixed/short.rs | 10 +- halo2_gadgets/src/ecc/chip/witness_point.rs | 8 +- halo2_gadgets/src/poseidon/pow5.rs | 11 +- halo2_gadgets/src/sha256/table16.rs | 8 +- .../src/sha256/table16/compression.rs | 8 +- .../src/sha256/table16/message_schedule.rs | 8 +- .../src/sha256/table16/spread_table.rs | 8 +- halo2_gadgets/src/sinsemilla.rs | 4 +- halo2_gadgets/src/sinsemilla/chip.rs | 4 +- .../src/sinsemilla/chip/generator_table.rs | 4 +- halo2_gadgets/src/sinsemilla/merkle.rs | 4 +- halo2_gadgets/src/sinsemilla/merkle/chip.rs | 4 +- halo2_gadgets/src/utilities.rs | 4 +- halo2_gadgets/src/utilities/cond_swap.rs | 8 +- .../src/utilities/decompose_running_sum.rs | 8 +- .../src/utilities/lookup_range_check.rs | 12 +- halo2_proofs/benches/dev_lookup.rs | 2 +- halo2_proofs/benches/plonk.rs | 2 +- halo2_proofs/examples/circuit-layout.rs | 6 +- halo2_proofs/examples/simple-example.rs | 6 +- halo2_proofs/examples/two-chip.rs | 10 +- .../src/circuit/floor_planner/single_pass.rs | 4 +- halo2_proofs/src/circuit/floor_planner/v1.rs | 2 +- halo2_proofs/src/circuit/table_layouter.rs | 10 +- halo2_proofs/src/dev.rs | 61 +++++---- halo2_proofs/src/dev/cost.rs | 49 ++++---- halo2_proofs/src/dev/failure.rs | 19 +-- halo2_proofs/src/dev/gates.rs | 8 +- halo2_proofs/src/dev/graph.rs | 6 +- halo2_proofs/src/dev/graph/layout.rs | 32 ++--- halo2_proofs/src/dev/tfp.rs | 6 +- halo2_proofs/src/plonk.rs | 8 +- halo2_proofs/src/plonk/circuit.rs | 118 ++++++++++-------- halo2_proofs/src/plonk/error.rs | 4 +- halo2_proofs/src/plonk/keygen.rs | 36 +++--- halo2_proofs/src/plonk/lookup/prover.rs | 4 +- halo2_proofs/src/plonk/permutation/prover.rs | 8 +- .../src/plonk/permutation/verifier.rs | 2 +- halo2_proofs/src/plonk/prover.rs | 15 +-- halo2_proofs/src/plonk/verifier.rs | 4 +- halo2_proofs/tests/plonk_api.rs | 5 +- 54 files changed, 335 insertions(+), 280 deletions(-) diff --git a/halo2_gadgets/benches/poseidon.rs b/halo2_gadgets/benches/poseidon.rs index 31f21d2795..dace3b52ab 100644 --- a/halo2_gadgets/benches/poseidon.rs +++ b/halo2_gadgets/benches/poseidon.rs @@ -4,7 +4,7 @@ use halo2_proofs::{ pasta::Fp, plonk::{ create_proof, keygen_pk, keygen_vk, verify_proof, Advice, Circuit, Column, - ConstraintSystem, Error, Instance, SingleVerifier, + ConstraintSystemBuilder, Error, Instance, SingleVerifier, }, poly::commitment::Params, transcript::{Blake2bRead, Blake2bWrite, Challenge255}, @@ -52,7 +52,7 @@ where } } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let state = (0..WIDTH).map(|_| meta.advice_column()).collect::>(); let expected = meta.instance_column(); meta.enable_equality(expected); diff --git a/halo2_gadgets/benches/sha256.rs b/halo2_gadgets/benches/sha256.rs index ffb4165a70..551a7778ab 100644 --- a/halo2_gadgets/benches/sha256.rs +++ b/halo2_gadgets/benches/sha256.rs @@ -2,7 +2,7 @@ use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner, Value}, pasta::{pallas, EqAffine}, plonk::{ - create_proof, keygen_pk, keygen_vk, verify_proof, Circuit, ConstraintSystem, Error, + create_proof, keygen_pk, keygen_vk, verify_proof, Circuit, ConstraintSystemBuilder, Error, SingleVerifier, }, poly::commitment::Params, @@ -32,7 +32,7 @@ fn bench(name: &str, k: u32, c: &mut Criterion) { Self::default() } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { Table16Chip::configure(meta) } diff --git a/halo2_gadgets/src/ecc.rs b/halo2_gadgets/src/ecc.rs index 38fab0a49a..53c0ba32a1 100644 --- a/halo2_gadgets/src/ecc.rs +++ b/halo2_gadgets/src/ecc.rs @@ -583,7 +583,7 @@ pub(crate) mod tests { use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner, Value}, dev::MockProver, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{Circuit, ConstraintSystemBuilder, Error}, }; use lazy_static::lazy_static; use pasta_curves::pallas; @@ -736,7 +736,7 @@ pub(crate) mod tests { MyCircuit { test_errors: false } } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let advices = [ meta.advice_column(), meta.advice_column(), diff --git a/halo2_gadgets/src/ecc/chip.rs b/halo2_gadgets/src/ecc/chip.rs index 4d12057afb..aac339877b 100644 --- a/halo2_gadgets/src/ecc/chip.rs +++ b/halo2_gadgets/src/ecc/chip.rs @@ -11,7 +11,7 @@ use ff::PrimeField; use group::prime::PrimeCurveAffine; use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter, Value}, - plonk::{Advice, Assigned, Column, ConstraintSystem, Error, Fixed}, + plonk::{Advice, Assigned, Column, ConstraintSystemBuilder, Error, Fixed}, }; use pasta_curves::{arithmetic::CurveAffine, pallas}; @@ -261,7 +261,7 @@ impl> EccChip { /// All columns in `advices` will be equality-enabled. #[allow(non_snake_case)] pub fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, advices: [Column; 10], lagrange_coeffs: [Column; 8], range_check: LookupRangeCheckConfig, diff --git a/halo2_gadgets/src/ecc/chip/add.rs b/halo2_gadgets/src/ecc/chip/add.rs index 8932b1282b..259a3a6a92 100644 --- a/halo2_gadgets/src/ecc/chip/add.rs +++ b/halo2_gadgets/src/ecc/chip/add.rs @@ -3,7 +3,9 @@ use super::EccPoint; use group::ff::PrimeField; use halo2_proofs::{ circuit::Region, - plonk::{Advice, Assigned, Column, ConstraintSystem, Constraints, Error, Expression, Selector}, + plonk::{ + Advice, Assigned, Column, ConstraintSystemBuilder, Constraints, Error, Expression, Selector, + }, poly::Rotation, }; use pasta_curves::pallas; @@ -36,7 +38,7 @@ pub struct Config { impl Config { #[allow(clippy::too_many_arguments)] pub(super) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, x_p: Column, y_p: Column, x_qr: Column, @@ -74,7 +76,7 @@ impl Config { [self.x_qr, self.y_qr].into_iter().collect() } - fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystemBuilder) { // https://p.z.cash/halo2-0.1:ecc-complete-addition meta.create_gate("complete addition", |meta| { let q_add = meta.query_selector(self.q_add); diff --git a/halo2_gadgets/src/ecc/chip/add_incomplete.rs b/halo2_gadgets/src/ecc/chip/add_incomplete.rs index 597dfb1bc5..f9f6c1dc82 100644 --- a/halo2_gadgets/src/ecc/chip/add_incomplete.rs +++ b/halo2_gadgets/src/ecc/chip/add_incomplete.rs @@ -3,7 +3,7 @@ use std::collections::HashSet; use super::NonIdentityEccPoint; use halo2_proofs::{ circuit::Region, - plonk::{Advice, Column, ConstraintSystem, Constraints, Error, Selector}, + plonk::{Advice, Column, ConstraintSystemBuilder, Constraints, Error, Selector}, poly::Rotation, }; use pasta_curves::pallas; @@ -23,7 +23,7 @@ pub struct Config { impl Config { pub(super) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, x_p: Column, y_p: Column, x_qr: Column, @@ -53,7 +53,7 @@ impl Config { .collect() } - fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystemBuilder) { // https://p.z.cash/halo2-0.1:ecc-incomplete-addition meta.create_gate("incomplete addition", |meta| { let q_add_incomplete = meta.query_selector(self.q_add_incomplete); diff --git a/halo2_gadgets/src/ecc/chip/mul.rs b/halo2_gadgets/src/ecc/chip/mul.rs index 8e857ae442..36a08723cc 100644 --- a/halo2_gadgets/src/ecc/chip/mul.rs +++ b/halo2_gadgets/src/ecc/chip/mul.rs @@ -11,7 +11,7 @@ use std::{ use ff::{Field, PrimeField}; use halo2_proofs::{ circuit::{AssignedCell, Layouter, Region, Value}, - plonk::{Advice, Assigned, Column, ConstraintSystem, Constraints, Error, Selector}, + plonk::{Advice, Assigned, Column, ConstraintSystemBuilder, Constraints, Error, Selector}, poly::Rotation, }; use uint::construct_uint; @@ -63,7 +63,7 @@ pub struct Config { impl Config { pub(super) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, add_config: add::Config, lookup_config: LookupRangeCheckConfig, advices: [Column; 10], @@ -126,7 +126,7 @@ impl Config { config } - fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystemBuilder) { // If `lsb` is 0, (x, y) = (x_p, -y_p). If `lsb` is 1, (x, y) = (0,0). // https://p.z.cash/halo2-0.1:ecc-var-mul-lsb-gate?partial meta.create_gate("LSB check", |meta| { diff --git a/halo2_gadgets/src/ecc/chip/mul/complete.rs b/halo2_gadgets/src/ecc/chip/mul/complete.rs index 1795ddc62b..8812be1bcb 100644 --- a/halo2_gadgets/src/ecc/chip/mul/complete.rs +++ b/halo2_gadgets/src/ecc/chip/mul/complete.rs @@ -4,7 +4,7 @@ use crate::utilities::{bool_check, ternary}; use halo2_proofs::{ circuit::{Region, Value}, - plonk::{Advice, Column, ConstraintSystem, Constraints, Error, Expression, Selector}, + plonk::{Advice, Column, ConstraintSystemBuilder, Constraints, Error, Expression, Selector}, poly::Rotation, }; @@ -22,7 +22,7 @@ pub struct Config { impl Config { pub(super) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, z_complete: Column, add_config: add::Config, ) -> Self { @@ -43,7 +43,7 @@ impl Config { /// This is used to check the bits used in complete addition, since the incomplete /// addition gate (controlled by `q_mul`) already checks scalar decomposition for /// the other bits. - fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystemBuilder) { // | y_p | z_complete | // -------------------- // | y_p | z_{i + 1} | diff --git a/halo2_gadgets/src/ecc/chip/mul/incomplete.rs b/halo2_gadgets/src/ecc/chip/mul/incomplete.rs index 8baa115f7b..92bacb9d96 100644 --- a/halo2_gadgets/src/ecc/chip/mul/incomplete.rs +++ b/halo2_gadgets/src/ecc/chip/mul/incomplete.rs @@ -6,7 +6,8 @@ use group::ff::PrimeField; use halo2_proofs::{ circuit::{Region, Value}, plonk::{ - Advice, Column, ConstraintSystem, Constraints, Error, Expression, Selector, VirtualCells, + Advice, Column, ConstraintSystemBuilder, Constraints, Error, Expression, Selector, + VirtualCells, }, poly::Rotation, }; @@ -73,7 +74,7 @@ pub(crate) struct Config { impl Config { pub(super) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, z: Column, x_a: Column, x_p: Column, @@ -104,7 +105,7 @@ impl Config { } // Gate for incomplete addition part of variable-base scalar multiplication. - fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystemBuilder) { // Closure to compute x_{R,i} = λ_{1,i}^2 - x_{A,i} - x_{P,i} let x_r = |meta: &mut VirtualCells, rotation: Rotation| { self.double_and_add.x_r(meta, rotation) diff --git a/halo2_gadgets/src/ecc/chip/mul/overflow.rs b/halo2_gadgets/src/ecc/chip/mul/overflow.rs index 12101ae82e..6adc8d6f44 100644 --- a/halo2_gadgets/src/ecc/chip/mul/overflow.rs +++ b/halo2_gadgets/src/ecc/chip/mul/overflow.rs @@ -7,7 +7,9 @@ use group::ff::PrimeField; use halo2_proofs::circuit::AssignedCell; use halo2_proofs::{ circuit::Layouter, - plonk::{Advice, Assigned, Column, ConstraintSystem, Constraints, Error, Expression, Selector}, + plonk::{ + Advice, Assigned, Column, ConstraintSystemBuilder, Constraints, Error, Expression, Selector, + }, poly::Rotation, }; use pasta_curves::pallas; @@ -26,7 +28,7 @@ pub struct Config { impl Config { pub(super) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, lookup_config: LookupRangeCheckConfig, advices: [Column; 3], ) -> Self { @@ -45,7 +47,7 @@ impl Config { config } - fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystemBuilder) { // https://p.z.cash/halo2-0.1:ecc-var-mul-overflow meta.create_gate("overflow checks", |meta| { let q_mul_overflow = meta.query_selector(self.q_mul_overflow); diff --git a/halo2_gadgets/src/ecc/chip/mul_fixed.rs b/halo2_gadgets/src/ecc/chip/mul_fixed.rs index d0781056b8..344b845591 100644 --- a/halo2_gadgets/src/ecc/chip/mul_fixed.rs +++ b/halo2_gadgets/src/ecc/chip/mul_fixed.rs @@ -13,7 +13,7 @@ use group::{ use halo2_proofs::{ circuit::{AssignedCell, Region, Value}, plonk::{ - Advice, Column, ConstraintSystem, Constraints, Error, Expression, Fixed, Selector, + Advice, Column, ConstraintSystemBuilder, Constraints, Error, Expression, Fixed, Selector, VirtualCells, }, poly::Rotation, @@ -54,7 +54,7 @@ pub struct Config> { impl> Config { #[allow(clippy::too_many_arguments)] pub(super) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, lagrange_coeffs: [Column; H], window: Column, u: Column, @@ -112,7 +112,7 @@ impl> Config { /// This gate is not used in the mul_fixed::full_width helper, since the full-width /// scalar is witnessed directly as three-bit windows instead of being decomposed /// via a running sum. - fn running_sum_coords_gate(&self, meta: &mut ConstraintSystem) { + fn running_sum_coords_gate(&self, meta: &mut ConstraintSystemBuilder) { meta.create_gate("Running sum coordinates check", |meta| { let q_mul_fixed_running_sum = meta.query_selector(self.running_sum_config.q_range_check()); diff --git a/halo2_gadgets/src/ecc/chip/mul_fixed/base_field_elem.rs b/halo2_gadgets/src/ecc/chip/mul_fixed/base_field_elem.rs index 9a2b0c76ce..e845494355 100644 --- a/halo2_gadgets/src/ecc/chip/mul_fixed/base_field_elem.rs +++ b/halo2_gadgets/src/ecc/chip/mul_fixed/base_field_elem.rs @@ -10,7 +10,7 @@ use crate::{ use group::ff::PrimeField; use halo2_proofs::{ circuit::{AssignedCell, Layouter}, - plonk::{Advice, Column, ConstraintSystem, Constraints, Error, Expression, Selector}, + plonk::{Advice, Column, ConstraintSystemBuilder, Constraints, Error, Expression, Selector}, poly::Rotation, }; use pasta_curves::pallas; @@ -27,7 +27,7 @@ pub struct Config> { impl> Config { pub(crate) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, canon_advices: [Column; 3], lookup_config: LookupRangeCheckConfig, super_config: super::Config, @@ -56,7 +56,7 @@ impl> Config { config } - fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystemBuilder) { // Check that the base field element is canonical. // https://p.z.cash/halo2-0.1:ecc-fixed-mul-base-canonicity meta.create_gate("Canonicity checks", |meta| { diff --git a/halo2_gadgets/src/ecc/chip/mul_fixed/full_width.rs b/halo2_gadgets/src/ecc/chip/mul_fixed/full_width.rs index 886f86bbba..8c5f46342c 100644 --- a/halo2_gadgets/src/ecc/chip/mul_fixed/full_width.rs +++ b/halo2_gadgets/src/ecc/chip/mul_fixed/full_width.rs @@ -5,7 +5,7 @@ use arrayvec::ArrayVec; use ff::PrimeField; use halo2_proofs::{ circuit::{AssignedCell, Layouter, Region, Value}, - plonk::{ConstraintSystem, Constraints, Error, Selector}, + plonk::{ConstraintSystemBuilder, Constraints, Error, Selector}, poly::Rotation, }; use pasta_curves::pallas; @@ -18,7 +18,7 @@ pub struct Config> { impl> Config { pub(crate) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, super_config: super::Config, ) -> Self { let config = Self { @@ -31,7 +31,7 @@ impl> Config { config } - fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystemBuilder) { // Check that each window `k` is within 3 bits // https://p.z.cash/halo2-0.1:ecc-fixed-mul-full-word meta.create_gate("Full-width fixed-base scalar mul", |meta| { diff --git a/halo2_gadgets/src/ecc/chip/mul_fixed/short.rs b/halo2_gadgets/src/ecc/chip/mul_fixed/short.rs index bfdc735f70..3d93afb99c 100644 --- a/halo2_gadgets/src/ecc/chip/mul_fixed/short.rs +++ b/halo2_gadgets/src/ecc/chip/mul_fixed/short.rs @@ -5,7 +5,7 @@ use crate::{ecc::chip::MagnitudeSign, utilities::bool_check}; use halo2_proofs::{ circuit::{Layouter, Region}, - plonk::{ConstraintSystem, Constraints, Error, Expression, Selector}, + plonk::{ConstraintSystemBuilder, Constraints, Error, Expression, Selector}, poly::Rotation, }; use pasta_curves::pallas; @@ -19,7 +19,7 @@ pub struct Config> { impl> Config { pub(crate) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, super_config: super::Config, ) -> Self { let config = Self { @@ -32,7 +32,7 @@ impl> Config { config } - fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystemBuilder) { // Gate contains the following constraints: // - https://p.z.cash/halo2-0.1:ecc-fixed-mul-short-msb // - https://p.z.cash/halo2-0.1:ecc-fixed-mul-short-conditional-neg @@ -409,7 +409,7 @@ pub mod tests { use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner}, dev::{FailureLocation, MockProver, VerifyFailure}, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{Circuit, ConstraintSystemBuilder, Error}, }; #[derive(Default)] @@ -432,7 +432,7 @@ pub mod tests { Self::default() } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let advices = [ meta.advice_column(), meta.advice_column(), diff --git a/halo2_gadgets/src/ecc/chip/witness_point.rs b/halo2_gadgets/src/ecc/chip/witness_point.rs index 7cba8d6f87..54fb791ffd 100644 --- a/halo2_gadgets/src/ecc/chip/witness_point.rs +++ b/halo2_gadgets/src/ecc/chip/witness_point.rs @@ -5,8 +5,8 @@ use group::prime::PrimeCurveAffine; use halo2_proofs::{ circuit::{AssignedCell, Region, Value}, plonk::{ - Advice, Assigned, Column, ConstraintSystem, Constraints, Error, Expression, Selector, - VirtualCells, + Advice, Assigned, Column, ConstraintSystemBuilder, Constraints, Error, Expression, + Selector, VirtualCells, }, poly::Rotation, }; @@ -29,7 +29,7 @@ pub struct Config { impl Config { pub(super) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, x: Column, y: Column, ) -> Self { @@ -45,7 +45,7 @@ impl Config { config } - fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystemBuilder) { let curve_eqn = |meta: &mut VirtualCells| { let x = meta.query_advice(self.x, Rotation::cur()); let y = meta.query_advice(self.y, Rotation::cur()); diff --git a/halo2_gadgets/src/poseidon/pow5.rs b/halo2_gadgets/src/poseidon/pow5.rs index 7e7aa45b58..70b8c0aea5 100644 --- a/halo2_gadgets/src/poseidon/pow5.rs +++ b/halo2_gadgets/src/poseidon/pow5.rs @@ -5,7 +5,8 @@ use group::ff::Field; use halo2_proofs::{ circuit::{AssignedCell, Cell, Chip, Layouter, Region, Value}, plonk::{ - Advice, Any, Column, ConstraintSystem, Constraints, Error, Expression, Fixed, Selector, + Advice, Any, Column, ConstraintSystemBuilder, Constraints, Error, Expression, Fixed, + Selector, }, poly::Rotation, }; @@ -54,7 +55,7 @@ impl Pow5Chip { // needs to be known wherever we implement the hashing gadget, but it isn't strictly // necessary for the permutation. pub fn configure>( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, state: [Column; WIDTH], partial_sbox: Column, rc_a: [Column; WIDTH], @@ -597,7 +598,7 @@ mod tests { circuit::{Layouter, SimpleFloorPlanner, Value}, dev::MockProver, pasta::Fp, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{Circuit, ConstraintSystemBuilder, Error}, }; use pasta_curves::pallas; use rand::rngs::OsRng; @@ -624,7 +625,7 @@ mod tests { PermuteCircuit::(PhantomData) } - fn configure(meta: &mut ConstraintSystem) -> Pow5Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Pow5Config { let state = (0..WIDTH).map(|_| meta.advice_column()).collect::>(); let partial_sbox = meta.advice_column(); @@ -743,7 +744,7 @@ mod tests { } } - fn configure(meta: &mut ConstraintSystem) -> Pow5Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Pow5Config { let state = (0..WIDTH).map(|_| meta.advice_column()).collect::>(); let partial_sbox = meta.advice_column(); diff --git a/halo2_gadgets/src/sha256/table16.rs b/halo2_gadgets/src/sha256/table16.rs index 9e56c78a4d..c288831e19 100644 --- a/halo2_gadgets/src/sha256/table16.rs +++ b/halo2_gadgets/src/sha256/table16.rs @@ -5,7 +5,7 @@ use super::Sha256Instructions; use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter, Region, Value}, pasta::pallas, - plonk::{Advice, Any, Assigned, Column, ConstraintSystem, Error}, + plonk::{Advice, Any, Assigned, Column, ConstraintSystemBuilder, Error}, }; mod compression; @@ -266,7 +266,7 @@ impl Table16Chip { /// Configures a circuit to include this chip. pub fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, ) -> >::Config { // Columns required by this chip: let message_schedule = meta.advice_column(); @@ -457,7 +457,7 @@ mod tests { use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner}, pasta::pallas, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{Circuit, ConstraintSystemBuilder, Error}, }; #[test] @@ -473,7 +473,7 @@ mod tests { MyCircuit {} } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { Table16Chip::configure(meta) } diff --git a/halo2_gadgets/src/sha256/table16/compression.rs b/halo2_gadgets/src/sha256/table16/compression.rs index 528b1d9a98..f682e19f0e 100644 --- a/halo2_gadgets/src/sha256/table16/compression.rs +++ b/halo2_gadgets/src/sha256/table16/compression.rs @@ -6,7 +6,7 @@ use super::{ use halo2_proofs::{ circuit::{Layouter, Value}, pasta::pallas, - plonk::{Advice, Column, ConstraintSystem, Error, Selector}, + plonk::{Advice, Column, ConstraintSystemBuilder, Error, Selector}, poly::Rotation, }; use std::convert::TryInto; @@ -457,7 +457,7 @@ impl Table16Assignment for CompressionConfig {} impl CompressionConfig { pub(super) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, lookup: SpreadInputs, message_schedule: Column, extras: [Column; 6], @@ -944,7 +944,7 @@ mod tests { circuit::{Layouter, SimpleFloorPlanner}, dev::MockProver, pasta::pallas, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{Circuit, ConstraintSystemBuilder, Error}, }; #[test] @@ -959,7 +959,7 @@ mod tests { MyCircuit {} } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { Table16Chip::configure(meta) } diff --git a/halo2_gadgets/src/sha256/table16/message_schedule.rs b/halo2_gadgets/src/sha256/table16/message_schedule.rs index 0f92b2e132..156cb05b05 100644 --- a/halo2_gadgets/src/sha256/table16/message_schedule.rs +++ b/halo2_gadgets/src/sha256/table16/message_schedule.rs @@ -4,7 +4,7 @@ use super::{super::BLOCK_SIZE, AssignedBits, BlockWord, SpreadInputs, Table16Ass use halo2_proofs::{ circuit::Layouter, pasta::pallas, - plonk::{Advice, Column, ConstraintSystem, Error, Selector}, + plonk::{Advice, Column, ConstraintSystemBuilder, Error, Selector}, poly::Rotation, }; @@ -71,7 +71,7 @@ impl MessageScheduleConfig { /// itself. #[allow(clippy::many_single_char_names)] pub(super) fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, lookup: SpreadInputs, message_schedule: Column, extras: [Column; 6], @@ -401,7 +401,7 @@ mod tests { circuit::{Layouter, SimpleFloorPlanner}, dev::MockProver, pasta::pallas, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{Circuit, ConstraintSystemBuilder, Error}, }; #[test] @@ -416,7 +416,7 @@ mod tests { MyCircuit {} } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { Table16Chip::configure(meta) } diff --git a/halo2_gadgets/src/sha256/table16/spread_table.rs b/halo2_gadgets/src/sha256/table16/spread_table.rs index 9fcd7bdea7..981bcd3dbf 100644 --- a/halo2_gadgets/src/sha256/table16/spread_table.rs +++ b/halo2_gadgets/src/sha256/table16/spread_table.rs @@ -4,7 +4,7 @@ use group::ff::{Field, PrimeField}; use halo2_proofs::{ circuit::{Chip, Layouter, Region, Value}, pasta::pallas, - plonk::{Advice, Column, ConstraintSystem, Error, TableColumn}, + plonk::{Advice, Column, ConstraintSystemBuilder, Error, TableColumn}, poly::Rotation, }; use std::convert::TryInto; @@ -182,7 +182,7 @@ impl Chip for SpreadTableChip { impl SpreadTableChip { pub fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, input_tag: Column, input_dense: Column, input_spread: Column, @@ -298,7 +298,7 @@ mod tests { circuit::{Layouter, SimpleFloorPlanner, Value}, dev::MockProver, pasta::Fp, - plonk::{Advice, Circuit, Column, ConstraintSystem, Error}, + plonk::{Advice, Circuit, Column, ConstraintSystemBuilder, Error}, }; #[test] @@ -317,7 +317,7 @@ mod tests { MyCircuit {} } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let input_tag = meta.advice_column(); let input_dense = meta.advice_column(); let input_spread = meta.advice_column(); diff --git a/halo2_gadgets/src/sinsemilla.rs b/halo2_gadgets/src/sinsemilla.rs index 3f06315a77..834659bfe7 100644 --- a/halo2_gadgets/src/sinsemilla.rs +++ b/halo2_gadgets/src/sinsemilla.rs @@ -456,7 +456,7 @@ pub(crate) mod tests { use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner, Value}, dev::MockProver, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{Circuit, ConstraintSystemBuilder, Error}, }; use rand::rngs::OsRng; @@ -532,7 +532,7 @@ pub(crate) mod tests { } #[allow(non_snake_case)] - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let advices = [ meta.advice_column(), meta.advice_column(), diff --git a/halo2_gadgets/src/sinsemilla/chip.rs b/halo2_gadgets/src/sinsemilla/chip.rs index ac4c34f781..1763b15cc6 100644 --- a/halo2_gadgets/src/sinsemilla/chip.rs +++ b/halo2_gadgets/src/sinsemilla/chip.rs @@ -16,7 +16,7 @@ use std::marker::PhantomData; use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter, Value}, plonk::{ - Advice, Column, ConstraintSystem, Constraints, Error, Expression, Fixed, Selector, + Advice, Column, ConstraintSystemBuilder, Constraints, Error, Expression, Fixed, Selector, TableColumn, VirtualCells, }, poly::Rotation, @@ -149,7 +149,7 @@ where #[allow(clippy::too_many_arguments)] #[allow(non_snake_case)] pub fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, advices: [Column; 5], witness_pieces: Column, fixed_y_q: Column, diff --git a/halo2_gadgets/src/sinsemilla/chip/generator_table.rs b/halo2_gadgets/src/sinsemilla/chip/generator_table.rs index fd0ff03f91..f784ec3966 100644 --- a/halo2_gadgets/src/sinsemilla/chip/generator_table.rs +++ b/halo2_gadgets/src/sinsemilla/chip/generator_table.rs @@ -1,7 +1,7 @@ use group::ff::PrimeField; use halo2_proofs::{ circuit::{Layouter, Value}, - plonk::{ConstraintSystem, Error, Expression, TableColumn}, + plonk::{ConstraintSystemBuilder, Error, Expression, TableColumn}, poly::Rotation, }; @@ -24,7 +24,7 @@ impl GeneratorTableConfig { /// this specific configuration sets up Sinsemilla-specific constraints /// controlled by `q_sinsemilla`, and would likely not apply to other chips. pub fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, config: super::SinsemillaConfig, ) where Hash: HashDomains, diff --git a/halo2_gadgets/src/sinsemilla/merkle.rs b/halo2_gadgets/src/sinsemilla/merkle.rs index 02a3bdaf7c..82bd26457a 100644 --- a/halo2_gadgets/src/sinsemilla/merkle.rs +++ b/halo2_gadgets/src/sinsemilla/merkle.rs @@ -192,7 +192,7 @@ pub mod tests { circuit::{Layouter, SimpleFloorPlanner, Value}, dev::MockProver, pasta::pallas, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{Circuit, ConstraintSystemBuilder, Error}, }; use rand::{rngs::OsRng, RngCore}; @@ -218,7 +218,7 @@ pub mod tests { Self::default() } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let advices = [ meta.advice_column(), meta.advice_column(), diff --git a/halo2_gadgets/src/sinsemilla/merkle/chip.rs b/halo2_gadgets/src/sinsemilla/merkle/chip.rs index 2c37fe924b..6d0ee4661d 100644 --- a/halo2_gadgets/src/sinsemilla/merkle/chip.rs +++ b/halo2_gadgets/src/sinsemilla/merkle/chip.rs @@ -2,7 +2,7 @@ use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter, Value}, - plonk::{Advice, Column, ConstraintSystem, Constraints, Error, Selector}, + plonk::{Advice, Column, ConstraintSystemBuilder, Constraints, Error, Selector}, poly::Rotation, }; use pasta_curves::pallas; @@ -86,7 +86,7 @@ where { /// Configures the [`MerkleChip`]. pub fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, sinsemilla_config: SinsemillaConfig, ) -> MerkleConfig { // All five advice columns are equality-enabled by SinsemillaConfig. diff --git a/halo2_gadgets/src/utilities.rs b/halo2_gadgets/src/utilities.rs index 739f4411de..d2e2608c45 100644 --- a/halo2_gadgets/src/utilities.rs +++ b/halo2_gadgets/src/utilities.rs @@ -244,7 +244,7 @@ mod tests { use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner}, dev::{FailureLocation, MockProver, VerifyFailure}, - plonk::{Any, Circuit, ConstraintSystem, Constraints, Error, Selector}, + plonk::{Any, Circuit, ConstraintSystemBuilder, Constraints, Error, Selector}, poly::Rotation, }; use pasta_curves::pallas; @@ -276,7 +276,7 @@ mod tests { MyCircuit(self.0) } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let selector = meta.selector(); let advice = meta.advice_column(); diff --git a/halo2_gadgets/src/utilities/cond_swap.rs b/halo2_gadgets/src/utilities/cond_swap.rs index d733e6c4fb..454d1fc95a 100644 --- a/halo2_gadgets/src/utilities/cond_swap.rs +++ b/halo2_gadgets/src/utilities/cond_swap.rs @@ -5,7 +5,7 @@ use super::{bool_check, ternary, UtilitiesInstructions}; use group::ff::{Field, PrimeField}; use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter, Value}, - plonk::{Advice, Column, ConstraintSystem, Constraints, Error, Selector}, + plonk::{Advice, Column, ConstraintSystemBuilder, Constraints, Error, Selector}, poly::Rotation, }; use std::marker::PhantomData; @@ -130,7 +130,7 @@ impl CondSwapChip { /// /// `advices[0]` will be equality-enabled. pub fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, advices: [Column; 5], ) -> CondSwapConfig { let a = advices[0]; @@ -200,7 +200,7 @@ mod tests { use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner, Value}, dev::MockProver, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{Circuit, ConstraintSystemBuilder, Error}, }; use pasta_curves::pallas::Base; use rand::rngs::OsRng; @@ -222,7 +222,7 @@ mod tests { Self::default() } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let advices = [ meta.advice_column(), meta.advice_column(), diff --git a/halo2_gadgets/src/utilities/decompose_running_sum.rs b/halo2_gadgets/src/utilities/decompose_running_sum.rs index 5a83e4175f..3d2b4f0747 100644 --- a/halo2_gadgets/src/utilities/decompose_running_sum.rs +++ b/halo2_gadgets/src/utilities/decompose_running_sum.rs @@ -25,7 +25,7 @@ use ff::PrimeFieldBits; use halo2_proofs::{ circuit::{AssignedCell, Region, Value}, - plonk::{Advice, Column, ConstraintSystem, Constraints, Error, Selector}, + plonk::{Advice, Column, ConstraintSystemBuilder, Constraints, Error, Selector}, poly::Rotation, }; @@ -68,7 +68,7 @@ impl RunningSumConfig, + meta: &mut ConstraintSystemBuilder, q_range_check: Selector, z: Column, ) -> Self { @@ -212,7 +212,7 @@ mod tests { use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner}, dev::{FailureLocation, MockProver, VerifyFailure}, - plonk::{Any, Circuit, ConstraintSystem, Error}, + plonk::{Any, Circuit, ConstraintSystemBuilder, Error}, }; use pasta_curves::pallas; use rand::rngs::OsRng; @@ -252,7 +252,7 @@ mod tests { } } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let z = meta.advice_column(); let q_range_check = meta.selector(); let constants = meta.fixed_column(); diff --git a/halo2_gadgets/src/utilities/lookup_range_check.rs b/halo2_gadgets/src/utilities/lookup_range_check.rs index b26a89a884..e7bf037787 100644 --- a/halo2_gadgets/src/utilities/lookup_range_check.rs +++ b/halo2_gadgets/src/utilities/lookup_range_check.rs @@ -3,7 +3,7 @@ use halo2_proofs::{ circuit::{AssignedCell, Layouter, Region}, - plonk::{Advice, Column, ConstraintSystem, Constraints, Error, Selector, TableColumn}, + plonk::{Advice, Column, ConstraintSystemBuilder, Constraints, Error, Selector, TableColumn}, poly::Rotation, }; use std::{convert::TryInto, marker::PhantomData}; @@ -78,7 +78,7 @@ impl LookupRangeCheckConfig { /// /// Both the `running_sum` and `constants` columns will be equality-enabled. pub fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, running_sum: Column, table_idx: TableColumn, ) -> Self { @@ -176,7 +176,7 @@ impl LookupRangeCheckConfig { /// Range check on an existing cell that is copied into this helper. /// /// Returns an error if `element` is not in a column that was passed to - /// [`ConstraintSystem::enable_equality`] during circuit configuration. + /// [`ConstraintSystemBuilder::enable_equality`] during circuit configuration. pub fn copy_check( &self, mut layouter: impl Layouter, @@ -393,7 +393,7 @@ mod tests { use halo2_proofs::{ circuit::{Layouter, SimpleFloorPlanner, Value}, dev::{FailureLocation, MockProver, VerifyFailure}, - plonk::{Circuit, ConstraintSystem, Error}, + plonk::{Circuit, ConstraintSystemBuilder, Error}, }; use pasta_curves::pallas; @@ -415,7 +415,7 @@ mod tests { *self } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let running_sum = meta.advice_column(); let table_idx = meta.lookup_table_column(); let constants = meta.fixed_column(); @@ -514,7 +514,7 @@ mod tests { } } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let running_sum = meta.advice_column(); let table_idx = meta.lookup_table_column(); let constants = meta.fixed_column(); diff --git a/halo2_proofs/benches/dev_lookup.rs b/halo2_proofs/benches/dev_lookup.rs index 55057e0d13..6853d3ebdc 100644 --- a/halo2_proofs/benches/dev_lookup.rs +++ b/halo2_proofs/benches/dev_lookup.rs @@ -33,7 +33,7 @@ fn criterion_benchmark(c: &mut Criterion) { Self::default() } - fn configure(meta: &mut ConstraintSystem) -> MyConfig { + fn configure(meta: &mut ConstraintSystemBuilder) -> MyConfig { let config = MyConfig { selector: meta.complex_selector(), table: meta.lookup_table_column(), diff --git a/halo2_proofs/benches/plonk.rs b/halo2_proofs/benches/plonk.rs index 64e8197c6d..67ad6d4de3 100644 --- a/halo2_proofs/benches/plonk.rs +++ b/halo2_proofs/benches/plonk.rs @@ -179,7 +179,7 @@ fn criterion_benchmark(c: &mut Criterion) { } } - fn configure(meta: &mut ConstraintSystem) -> PlonkConfig { + fn configure(meta: &mut ConstraintSystemBuilder) -> PlonkConfig { meta.set_minimum_degree(5); let a = meta.advice_column(); diff --git a/halo2_proofs/examples/circuit-layout.rs b/halo2_proofs/examples/circuit-layout.rs index fad839e81f..958d8ef382 100644 --- a/halo2_proofs/examples/circuit-layout.rs +++ b/halo2_proofs/examples/circuit-layout.rs @@ -2,7 +2,9 @@ use ff::Field; use halo2_proofs::{ circuit::{Cell, Layouter, Region, SimpleFloorPlanner, Value}, pasta::Fp, - plonk::{Advice, Assigned, Circuit, Column, ConstraintSystem, Error, Fixed, TableColumn}, + plonk::{ + Advice, Assigned, Circuit, Column, ConstraintSystemBuilder, Error, Fixed, TableColumn, + }, poly::Rotation, }; use rand_core::OsRng; @@ -170,7 +172,7 @@ impl Circuit for MyCircuit { } #[allow(clippy::many_single_char_names)] - fn configure(meta: &mut ConstraintSystem) -> PlonkConfig { + fn configure(meta: &mut ConstraintSystemBuilder) -> PlonkConfig { let e = meta.advice_column(); let a = meta.advice_column(); let b = meta.advice_column(); diff --git a/halo2_proofs/examples/simple-example.rs b/halo2_proofs/examples/simple-example.rs index 85b87537fb..72b84182b9 100644 --- a/halo2_proofs/examples/simple-example.rs +++ b/halo2_proofs/examples/simple-example.rs @@ -3,7 +3,7 @@ use std::marker::PhantomData; use group::ff::Field; use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter, Region, SimpleFloorPlanner, Value}, - plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Fixed, Instance, Selector}, + plonk::{Advice, Circuit, Column, ConstraintSystemBuilder, Error, Fixed, Instance, Selector}, poly::Rotation, }; @@ -74,7 +74,7 @@ impl FieldChip { } fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, advice: [Column; 2], instance: Column, constant: Column, @@ -253,7 +253,7 @@ impl Circuit for MyCircuit { Self::default() } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { // We create the two advice columns that FieldChip uses for I/O. let advice = [meta.advice_column(), meta.advice_column()]; diff --git a/halo2_proofs/examples/two-chip.rs b/halo2_proofs/examples/two-chip.rs index 321ce8a58c..0495a4b376 100644 --- a/halo2_proofs/examples/two-chip.rs +++ b/halo2_proofs/examples/two-chip.rs @@ -3,7 +3,7 @@ use std::marker::PhantomData; use group::ff::Field; use halo2_proofs::{ circuit::{AssignedCell, Chip, Layouter, Region, SimpleFloorPlanner, Value}, - plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Instance, Selector}, + plonk::{Advice, Circuit, Column, ConstraintSystemBuilder, Error, Instance, Selector}, poly::Rotation, }; @@ -153,7 +153,7 @@ impl AddChip { } fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, advice: [Column; 2], ) -> >::Config { let s_add = meta.selector(); @@ -255,7 +255,7 @@ impl MulChip { } fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, advice: [Column; 2], ) -> >::Config { for column in &advice { @@ -376,7 +376,7 @@ impl FieldChip { } fn configure( - meta: &mut ConstraintSystem, + meta: &mut ConstraintSystemBuilder, advice: [Column; 2], instance: Column, ) -> >::Config { @@ -463,7 +463,7 @@ impl Circuit for MyCircuit { Self::default() } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { // We create the two advice columns that FieldChip uses for I/O. let advice = [meta.advice_column(), meta.advice_column()]; diff --git a/halo2_proofs/src/circuit/floor_planner/single_pass.rs b/halo2_proofs/src/circuit/floor_planner/single_pass.rs index 968c3726cc..6b2dbb45a8 100644 --- a/halo2_proofs/src/circuit/floor_planner/single_pass.rs +++ b/halo2_proofs/src/circuit/floor_planner/single_pass.rs @@ -384,7 +384,9 @@ mod tests { MyCircuit {} } - fn configure(meta: &mut crate::plonk::ConstraintSystem) -> Self::Config { + fn configure( + meta: &mut crate::plonk::ConstraintSystemBuilder, + ) -> Self::Config { meta.advice_column() } diff --git a/halo2_proofs/src/circuit/floor_planner/v1.rs b/halo2_proofs/src/circuit/floor_planner/v1.rs index 42f197ca37..3a04245f56 100644 --- a/halo2_proofs/src/circuit/floor_planner/v1.rs +++ b/halo2_proofs/src/circuit/floor_planner/v1.rs @@ -498,7 +498,7 @@ mod tests { MyCircuit {} } - fn configure(meta: &mut crate::plonk::ConstraintSystem) -> Self::Config { + fn configure(meta: &mut crate::plonk::ConstraintSystemBuilder) -> Self::Config { meta.advice_column() } diff --git a/halo2_proofs/src/circuit/table_layouter.rs b/halo2_proofs/src/circuit/table_layouter.rs index f2379f7095..e126b34be7 100644 --- a/halo2_proofs/src/circuit/table_layouter.rs +++ b/halo2_proofs/src/circuit/table_layouter.rs @@ -156,7 +156,7 @@ mod tests { use crate::{ circuit::{Layouter, SimpleFloorPlanner}, dev::MockProver, - plonk::{Circuit, ConstraintSystem}, + plonk::{Circuit, ConstraintSystemBuilder}, poly::Rotation, }; @@ -182,7 +182,7 @@ mod tests { Self } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let a = meta.advice_column(); let table = meta.lookup_table_column(); @@ -240,7 +240,7 @@ mod tests { Self } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let a = meta.advice_column(); let table = meta.lookup_table_column(); @@ -304,7 +304,7 @@ mod tests { Self } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let a = meta.advice_column(); let table = meta.lookup_table_column(); @@ -369,7 +369,7 @@ mod tests { Self } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let a = meta.advice_column(); let table = (meta.lookup_table_column(), meta.lookup_table_column()); meta.lookup(|cells| { diff --git a/halo2_proofs/src/dev.rs b/halo2_proofs/src/dev.rs index a292b0ab4e..efb357b82c 100644 --- a/halo2_proofs/src/dev.rs +++ b/halo2_proofs/src/dev.rs @@ -11,8 +11,8 @@ use crate::plonk::Assigned; use crate::{ circuit, plonk::{ - permutation, Advice, Any, Assignment, Circuit, Column, ConstraintSystem, Error, Expression, - Fixed, FloorPlanner, Instance, Selector, + permutation, Advice, Any, Assignment, Circuit, Column, ConstraintSystemBuilder, Error, + Expression, Fixed, FloorPlanner, Instance, Selector, }, }; @@ -198,7 +198,7 @@ impl Mul for Value { /// Self::default() /// } /// -/// fn configure(meta: &mut ConstraintSystem) -> MyConfig { +/// fn configure(meta: &mut ConstraintSystemBuilder) -> MyConfig { /// let a = meta.advice_column(); /// let b = meta.advice_column(); /// let c = meta.advice_column(); @@ -272,7 +272,7 @@ impl Mul for Value { pub struct MockProver { k: u32, n: u32, - cs: ConstraintSystem, + cs: ConstraintSystemBuilder, /// The regions in the circuit. regions: Vec, @@ -489,7 +489,7 @@ impl MockProver { ) -> Result { let n = 1 << k; - let mut cs = ConstraintSystem::default(); + let mut cs = ConstraintSystemBuilder::default(); let config = ConcreteCircuit::configure(&mut cs); let cs = cs; @@ -497,7 +497,7 @@ impl MockProver { return Err(Error::not_enough_rows_available(k)); } - if instance.len() != cs.num_instance_columns { + if instance.len() != cs.cs.num_instance_columns { return Err(Error::InvalidInstances); } @@ -518,8 +518,8 @@ impl MockProver { .collect::, _>>()?; // Fixed columns contain no blinding factors. - let fixed = vec![vec![CellValue::Unassigned; n]; cs.num_fixed_columns]; - let selectors = vec![vec![false; n]; cs.num_selectors]; + let fixed = vec![vec![CellValue::Unassigned; n]; cs.cs.num_fixed_columns]; + let selectors = vec![vec![false; n]; cs.cs.num_selectors]; // Advice columns contain blinding factors. let blinding_factors = cs.blinding_factors(); let usable_rows = n - (blinding_factors + 1); @@ -532,10 +532,10 @@ impl MockProver { } column }; - cs.num_advice_columns + cs.cs.num_advice_columns ]; - let permutation = permutation::keygen::Assembly::new(n, &cs.permutation); - let constants = cs.constants.clone(); + let permutation = permutation::keygen::Assembly::new(n, &cs.cs.permutation); + let constants = cs.cs.constants.clone(); let mut prover = MockProver { k, @@ -577,6 +577,7 @@ impl MockProver { r.enabled_selectors.iter().flat_map(move |(selector, at)| { // Find the gates enabled by this selector self.cs + .cs .gates .iter() // Assume that if a queried selector is enabled, the user wants to use the @@ -638,6 +639,7 @@ impl MockProver { // Check that all gates are satisfied for all rows. let gate_errors = self.cs + .cs .gates .iter() .enumerate() @@ -648,12 +650,12 @@ impl MockProver { move |(poly_index, poly)| match poly.evaluate( &|scalar| Value::Real(scalar), &|_| panic!("virtual selectors are removed during optimization"), - &util::load(n, row, &self.cs.fixed_queries, &self.fixed), - &util::load(n, row, &self.cs.advice_queries, &self.advice), + &util::load(n, row, &self.cs.cs.fixed_queries, &self.fixed), + &util::load(n, row, &self.cs.cs.advice_queries, &self.advice), &util::load_instance( n, row, - &self.cs.instance_queries, + &self.cs.cs.instance_queries, &self.instance, ), &|a| -a, @@ -670,7 +672,7 @@ impl MockProver { ) .into(), location: FailureLocation::find_expressions( - &self.cs, + &self.cs.cs, &self.regions, (row - n) as usize, Some(poly).into_iter(), @@ -678,12 +680,17 @@ impl MockProver { cell_values: util::cell_values( gate, poly, - &util::load(n, row, &self.cs.fixed_queries, &self.fixed), - &util::load(n, row, &self.cs.advice_queries, &self.advice), + &util::load(n, row, &self.cs.cs.fixed_queries, &self.fixed), + &util::load( + n, + row, + &self.cs.cs.advice_queries, + &self.advice, + ), &util::load_instance( n, row, - &self.cs.instance_queries, + &self.cs.cs.instance_queries, &self.instance, ), ), @@ -704,6 +711,7 @@ impl MockProver { // Check that all lookups exist in their respective tables. let lookup_errors = self.cs + .cs .lookups .iter() .enumerate() @@ -713,7 +721,7 @@ impl MockProver { &|scalar| Value::Real(scalar), &|_| panic!("virtual selectors are removed during optimization"), &|query| { - let query = self.cs.fixed_queries[query.index]; + let query = self.cs.cs.fixed_queries[query.index]; let column_index = query.0.index(); let rotation = query.1 .0; self.fixed[column_index] @@ -721,7 +729,7 @@ impl MockProver { .into() }, &|query| { - let query = self.cs.advice_queries[query.index]; + let query = self.cs.cs.advice_queries[query.index]; let column_index = query.0.index(); let rotation = query.1 .0; self.advice[column_index] @@ -729,7 +737,7 @@ impl MockProver { .into() }, &|query| { - let query = self.cs.instance_queries[query.index]; + let query = self.cs.cs.instance_queries[query.index]; let column_index = query.0.index(); let rotation = query.1 .0; Value::Real( @@ -814,7 +822,7 @@ impl MockProver { Some(VerifyFailure::Lookup { lookup_index, location: FailureLocation::find_expressions( - &self.cs, + &self.cs.cs, &self.regions, *input_row, lookup.input_expressions.iter(), @@ -832,6 +840,7 @@ impl MockProver { // Original values of columns involved in the permutation. let original = |column, row| { self.cs + .cs .permutation .get_columns() .get(column) @@ -860,7 +869,7 @@ impl MockProver { if original_cell == permuted_cell { None } else { - let columns = self.cs.permutation.get_columns(); + let columns = self.cs.cs.permutation.get_columns(); let column = columns.get(column).unwrap(); Some(VerifyFailure::Permutation { column: (*column).into(), @@ -927,7 +936,7 @@ mod tests { use crate::{ circuit::{Layouter, SimpleFloorPlanner, Value}, plonk::{ - Advice, Any, Circuit, Column, ConstraintSystem, Error, Expression, Selector, + Advice, Any, Circuit, Column, ConstraintSystemBuilder, Error, Expression, Selector, TableColumn, }, poly::Rotation, @@ -949,7 +958,7 @@ mod tests { type Config = FaultyCircuitConfig; type FloorPlanner = SimpleFloorPlanner; - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let a = meta.advice_column(); let b = meta.advice_column(); let q = meta.selector(); @@ -1023,7 +1032,7 @@ mod tests { type Config = FaultyCircuitConfig; type FloorPlanner = SimpleFloorPlanner; - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let a = meta.advice_column(); let q = meta.complex_selector(); let table = meta.lookup_table_column(); diff --git a/halo2_proofs/src/dev/cost.rs b/halo2_proofs/src/dev/cost.rs index 0c3c7efaf1..37404f3347 100644 --- a/halo2_proofs/src/dev/cost.rs +++ b/halo2_proofs/src/dev/cost.rs @@ -14,7 +14,7 @@ use group::prime::PrimeGroup; use crate::{ circuit::{layouter::RegionColumn, Value}, plonk::{ - Advice, Any, Assigned, Assignment, Circuit, Column, ConstraintSystem, Error, Fixed, + Advice, Any, Assigned, Assignment, Circuit, Column, ConstraintSystemBuilder, Error, Fixed, FloorPlanner, Instance, Selector, }, poly::Rotation, @@ -260,14 +260,14 @@ impl> CircuitCost Self { // Collect the layout details. - let mut cs = ConstraintSystem::default(); + let mut cs = ConstraintSystemBuilder::default(); let config = ConcreteCircuit::configure(&mut cs); - let mut layout = Layout::new(k, 1 << k, cs.num_selectors); + let mut layout = Layout::new(k, 1 << k, cs.cs.num_selectors); ConcreteCircuit::FloorPlanner::synthesize( &mut layout, circuit, config, - cs.constants.clone(), + cs.cs.constants.clone(), ) .unwrap(); let (cs, _) = cs.compress_selectors(layout.selectors); @@ -278,14 +278,21 @@ impl> CircuitCost, HashSet> = HashMap::new(); for (c, r) in iter::empty() .chain( - cs.advice_queries + cs.cs + .advice_queries .iter() .map(|(c, r)| (Column::::from(*c), *r)), ) - .chain(cs.instance_queries.iter().map(|(c, r)| ((*c).into(), *r))) - .chain(cs.fixed_queries.iter().map(|(c, r)| ((*c).into(), *r))) .chain( - cs.permutation + cs.cs + .instance_queries + .iter() + .map(|(c, r)| ((*c).into(), *r)), + ) + .chain(cs.cs.fixed_queries.iter().map(|(c, r)| ((*c).into(), *r))) + .chain( + cs.cs + .permutation .get_columns() .into_iter() .map(|c| (c, Rotation::cur())), @@ -309,7 +316,7 @@ impl> CircuitCost max_deg - 2 { // permutation_product_poly for chaining chunks. point_sets.insert(vec![-((cs.blinding_factors() + 1) as i32), 0, 1]); @@ -318,23 +325,23 @@ impl> CircuitCost) -> Self::Config {} + fn configure(_meta: &mut ConstraintSystemBuilder) -> Self::Config {} fn synthesize( &self, diff --git a/halo2_proofs/src/dev/failure.rs b/halo2_proofs/src/dev/failure.rs index c6c5aecfff..5f8277bf69 100644 --- a/halo2_proofs/src/dev/failure.rs +++ b/halo2_proofs/src/dev/failure.rs @@ -400,7 +400,7 @@ fn render_lookup( ) { let n = prover.n as i32; let cs = &prover.cs; - let lookup = &cs.lookups[lookup_index]; + let lookup = &cs.cs.lookups[lookup_index]; // Get the absolute row on which the lookup's inputs are being queried, so we can // fetch the input values. @@ -469,15 +469,15 @@ fn render_lookup( &|_| panic!("virtual selectors are removed during optimization"), &cell_value( Any::Fixed, - &util::load(n, row, &cs.fixed_queries, &prover.fixed), + &util::load(n, row, &cs.cs.fixed_queries, &prover.fixed), ), &cell_value( Any::Advice, - &util::load(n, row, &cs.advice_queries, &prover.advice), + &util::load(n, row, &cs.cs.advice_queries, &prover.advice), ), &cell_value( Any::Instance, - &util::load_instance(n, row, &cs.instance_queries, &prover.instance), + &util::load_instance(n, row, &cs.cs.instance_queries, &prover.instance), ), &|a| a, &|mut a, mut b| { @@ -541,7 +541,7 @@ impl VerifyFailure { column, offset, } => render_cell_not_assigned( - &prover.cs.gates, + &prover.cs.cs.gates, gate, region, *gate_offset, @@ -552,9 +552,12 @@ impl VerifyFailure { constraint, location, cell_values, - } => { - render_constraint_not_satisfied(&prover.cs.gates, constraint, location, cell_values) - } + } => render_constraint_not_satisfied( + &prover.cs.cs.gates, + constraint, + location, + cell_values, + ), Self::Lookup { lookup_index, location, diff --git a/halo2_proofs/src/dev/gates.rs b/halo2_proofs/src/dev/gates.rs index fc624e96ba..beb49fabc7 100644 --- a/halo2_proofs/src/dev/gates.rs +++ b/halo2_proofs/src/dev/gates.rs @@ -7,7 +7,7 @@ use ff::PrimeField; use crate::{ dev::util, - plonk::{Circuit, ConstraintSystem}, + plonk::{Circuit, ConstraintSystemBuilder}, }; #[derive(Debug)] @@ -51,7 +51,7 @@ struct Gate { /// Self::default() /// } /// -/// fn configure(meta: &mut ConstraintSystem) -> MyConfig { +/// fn configure(meta: &mut ConstraintSystemBuilder) -> MyConfig { /// let a = meta.advice_column(); /// let b = meta.advice_column(); /// let c = meta.advice_column(); @@ -102,10 +102,11 @@ impl CircuitGates { /// Collects the gates from within the circuit. pub fn collect>() -> Self { // Collect the graph details. - let mut cs = ConstraintSystem::default(); + let mut cs = ConstraintSystemBuilder::default(); let _ = C::configure(&mut cs); let gates = cs + .cs .gates .iter() .map(|gate| Gate { @@ -185,6 +186,7 @@ impl CircuitGates { .collect(); let (total_negations, total_additions, total_multiplications) = cs + .cs .gates .iter() .flat_map(|gate| { diff --git a/halo2_proofs/src/dev/graph.rs b/halo2_proofs/src/dev/graph.rs index 18ef8154df..b887b97b3d 100644 --- a/halo2_proofs/src/dev/graph.rs +++ b/halo2_proofs/src/dev/graph.rs @@ -4,7 +4,7 @@ use tabbycat::{AttrList, Edge, GraphBuilder, GraphType, Identity, StmtList}; use crate::{ circuit::Value, plonk::{ - Advice, Any, Assigned, Assignment, Circuit, Column, ConstraintSystem, Error, Fixed, + Advice, Any, Assigned, Assignment, Circuit, Column, ConstraintSystemBuilder, Error, Fixed, FloorPlanner, Instance, Selector, }, }; @@ -21,10 +21,10 @@ pub fn circuit_dot_graph>( circuit: &ConcreteCircuit, ) -> String { // Collect the graph details. - let mut cs = ConstraintSystem::default(); + let mut cs = ConstraintSystemBuilder::default(); let config = ConcreteCircuit::configure(&mut cs); let mut graph = Graph::default(); - ConcreteCircuit::FloorPlanner::synthesize(&mut graph, circuit, config, cs.constants).unwrap(); + ConcreteCircuit::FloorPlanner::synthesize(&mut graph, circuit, config, cs.cs.constants).unwrap(); // Construct the node labels. We need to store these, because tabbycat operates on // string references, and we need those references to live long enough. diff --git a/halo2_proofs/src/dev/graph/layout.rs b/halo2_proofs/src/dev/graph/layout.rs index 965e0683e6..ba1c2f8e3f 100644 --- a/halo2_proofs/src/dev/graph/layout.rs +++ b/halo2_proofs/src/dev/graph/layout.rs @@ -9,7 +9,7 @@ use std::ops::Range; use crate::{ circuit::layouter::RegionColumn, dev::cost::Layout, - plonk::{Any, Circuit, Column, ConstraintSystem, FloorPlanner}, + plonk::{Any, Circuit, Column, ConstraintSystemBuilder, FloorPlanner}, }; /// Graphical renderer for circuit layouts. @@ -93,23 +93,24 @@ impl CircuitLayout { let n = 1 << k; // Collect the layout details. - let mut cs = ConstraintSystem::default(); + let mut cs = ConstraintSystemBuilder::default(); let config = ConcreteCircuit::configure(&mut cs); - let mut layout = Layout::new(k, n, cs.num_selectors); + let mut layout = Layout::new(k, n, cs.cs.num_selectors); ConcreteCircuit::FloorPlanner::synthesize( &mut layout, circuit, config, - cs.constants.clone(), + cs.cs.constants.clone(), ) .unwrap(); let (cs, selector_polys) = cs.compress_selectors(layout.selectors); - let non_selector_fixed_columns = cs.num_fixed_columns - selector_polys.len(); + let non_selector_fixed_columns = cs.cs.num_fixed_columns - selector_polys.len(); // Figure out what order to render the columns in. // TODO: For now, just render them in the order they were configured. - let total_columns = cs.num_instance_columns + cs.num_advice_columns + cs.num_fixed_columns; - let column_index = |cs: &ConstraintSystem, column: RegionColumn| { + let total_columns = + cs.cs.num_instance_columns + cs.cs.num_advice_columns + cs.cs.num_fixed_columns; + let column_index = |cs: &ConstraintSystemBuilder, column: RegionColumn| { let column: Column = match column { RegionColumn::Column(col) => col, RegionColumn::Selector(selector) => cs.selector_map[selector.0].into(), @@ -117,8 +118,8 @@ impl CircuitLayout { column.index() + match column.column_type() { Any::Instance => 0, - Any::Advice => cs.num_instance_columns, - Any::Fixed => cs.num_instance_columns + cs.num_advice_columns, + Any::Advice => cs.cs.num_instance_columns, + Any::Fixed => cs.cs.num_instance_columns + cs.cs.num_advice_columns, } }; @@ -140,14 +141,17 @@ impl CircuitLayout { ))?; root.draw(&Rectangle::new( [ - (cs.num_instance_columns, 0), - (cs.num_instance_columns + cs.num_advice_columns, view_bottom), + (cs.cs.num_instance_columns, 0), + ( + cs.cs.num_instance_columns + cs.cs.num_advice_columns, + view_bottom, + ), ], ShapeStyle::from(&RED.mix(0.2)).filled(), ))?; root.draw(&Rectangle::new( [ - (cs.num_instance_columns + cs.num_advice_columns, 0), + (cs.cs.num_instance_columns + cs.cs.num_advice_columns, 0), (total_columns, view_bottom), ], ShapeStyle::from(&BLUE.mix(0.2)).filled(), @@ -156,8 +160,8 @@ impl CircuitLayout { root.draw(&Rectangle::new( [ ( - cs.num_instance_columns - + cs.num_advice_columns + cs.cs.num_instance_columns + + cs.cs.num_advice_columns + non_selector_fixed_columns, 0, ), diff --git a/halo2_proofs/src/dev/tfp.rs b/halo2_proofs/src/dev/tfp.rs index 7a8d9df58e..4931628c0e 100644 --- a/halo2_proofs/src/dev/tfp.rs +++ b/halo2_proofs/src/dev/tfp.rs @@ -6,7 +6,7 @@ use tracing::{debug, debug_span, span::EnteredSpan}; use crate::{ circuit::{layouter::RegionLayouter, AssignedCell, Cell, Layouter, Region, Table, Value}, plonk::{ - Advice, Any, Assigned, Assignment, Circuit, Column, ConstraintSystem, Error, Fixed, + Advice, Any, Assigned, Assignment, Circuit, Column, ConstraintSystemBuilder, Error, Fixed, FloorPlanner, Instance, Selector, }, }; @@ -50,7 +50,7 @@ use crate::{ /// Self { some_witness: Value::unknown() } /// } /// -/// fn configure(meta: &mut ConstraintSystem) -> Self::Config { +/// fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { /// // .. /// # todo!() /// } @@ -126,7 +126,7 @@ impl<'c, F: Field, C: Circuit> Circuit for TracingCircuit<'c, F, C> { Self::owned(self.inner_ref().without_witnesses()) } - fn configure(meta: &mut ConstraintSystem) -> Self::Config { + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config { let _span = debug_span!("configure").entered(); C::configure(meta) } diff --git a/halo2_proofs/src/plonk.rs b/halo2_proofs/src/plonk.rs index e96cf3fe97..ccab5d5266 100644 --- a/halo2_proofs/src/plonk.rs +++ b/halo2_proofs/src/plonk.rs @@ -45,6 +45,8 @@ pub struct VerifyingKey { cs: ConstraintSystem, /// Cached maximum degree of `cs` (which doesn't change after construction). cs_degree: usize, + /// Cached number of blinding factors (which doesn't change after construction). + num_blinding_factors: usize, /// The representative of this `VerifyingKey` in transcripts. transcript_repr: C::Scalar, } @@ -57,17 +59,19 @@ where domain: EvaluationDomain, fixed_commitments: Vec, permutation: permutation::VerifyingKey, - cs: ConstraintSystem, + cs: ConstraintSystemBuilder, ) -> Self { // Compute cached values. let cs_degree = cs.degree(); + let num_blinding_factors = cs.blinding_factors(); let mut vk = Self { domain, fixed_commitments, permutation, - cs, + cs: cs.cs, cs_degree, + num_blinding_factors, // Temporary, this is not pinned. transcript_repr: C::Scalar::ZERO, }; diff --git a/halo2_proofs/src/plonk/circuit.rs b/halo2_proofs/src/plonk/circuit.rs index a6494d871d..d4ef383aa1 100644 --- a/halo2_proofs/src/plonk/circuit.rs +++ b/halo2_proofs/src/plonk/circuit.rs @@ -305,7 +305,7 @@ pub struct InstanceQuery { /// /// A lookup table can be loaded into this column via [`Layouter::assign_table`]. Columns /// can currently only contain a single table, but they may be used in multiple lookup -/// arguments via [`ConstraintSystem::lookup`]. +/// arguments via [`ConstraintSystemBuilder::lookup`]. /// /// Lookup table columns are always "encumbered" by the lookup arguments they are used in; /// they cannot simultaneously be used as general fixed columns. @@ -329,7 +329,7 @@ impl TableColumn { } /// Enable equality on this TableColumn. - pub fn enable_equality(&self, meta: &mut ConstraintSystem) { + pub fn enable_equality(&self, meta: &mut ConstraintSystemBuilder) { meta.enable_equality(self.inner) } } @@ -476,7 +476,7 @@ pub trait Circuit { /// The circuit is given an opportunity to describe the exact gate /// arrangement, column arrangement, etc. - fn configure(meta: &mut ConstraintSystem) -> Self::Config; + fn configure(meta: &mut ConstraintSystemBuilder) -> Self::Config; /// Given the provided `cs`, synthesize the circuit. The concrete type of /// the caller will be different depending on the context, and they may or @@ -928,6 +928,22 @@ impl Gate { } } +/// A builder type for a [`ConstraintSystem`]. +#[derive(Debug, Clone, Default)] +pub struct ConstraintSystemBuilder { + pub(crate) cs: ConstraintSystem, + + /// This is a cached vector that maps virtual selectors to the concrete + /// fixed column that they were compressed into. This is just used by dev + /// tooling right now. + pub(crate) selector_map: Vec>, + + // Contains an integer for each advice column + // identifying how many distinct queries it has + // so far; should be same length as num_advice_columns. + num_advice_queries: Vec, +} + /// This is a description of the circuit environment, such as the gate, column and /// permutation arrangements. #[derive(Debug, Clone)] @@ -937,17 +953,8 @@ pub struct ConstraintSystem { pub(crate) num_instance_columns: usize, pub(crate) num_selectors: usize, - /// This is a cached vector that maps virtual selectors to the concrete - /// fixed column that they were compressed into. This is just used by dev - /// tooling right now. - pub(crate) selector_map: Vec>, - pub(crate) gates: Vec>, pub(crate) advice_queries: Vec<(Column, Rotation)>, - // Contains an integer for each advice column - // identifying how many distinct queries it has - // so far; should be same length as num_advice_columns. - num_advice_queries: Vec, pub(crate) instance_queries: Vec<(Column, Rotation)>, pub(crate) fixed_queries: Vec<(Column, Rotation)>, @@ -1000,11 +1007,9 @@ impl Default for ConstraintSystem { num_advice_columns: 0, num_instance_columns: 0, num_selectors: 0, - selector_map: vec![], gates: vec![], fixed_queries: Vec::new(), advice_queries: Vec::new(), - num_advice_queries: Vec::new(), instance_queries: Vec::new(), permutation: permutation::Argument::new(), lookups: Vec::new(), @@ -1034,15 +1039,17 @@ impl ConstraintSystem { minimum_degree: &self.minimum_degree, } } +} +impl ConstraintSystemBuilder { /// Enables this fixed column to be used for global constant assignments. /// /// # Side-effects /// /// The column will be equality-enabled. pub fn enable_constant(&mut self, column: Column) { - if !self.constants.contains(&column) { - self.constants.push(column); + if !self.cs.constants.contains(&column) { + self.cs.constants.push(column); self.enable_equality(column); } } @@ -1051,7 +1058,7 @@ impl ConstraintSystem { pub fn enable_equality>>(&mut self, column: C) { let column = column.into(); self.query_any_index(column, Rotation::cur()); - self.permutation.add_column(column); + self.cs.permutation.add_column(column); } /// Add a lookup argument for some input expressions and table columns. @@ -1076,39 +1083,39 @@ impl ConstraintSystem { }) .collect(); - let index = self.lookups.len(); + let index = self.cs.lookups.len(); - self.lookups.push(lookup::Argument::new(table_map)); + self.cs.lookups.push(lookup::Argument::new(table_map)); index } fn query_fixed_index(&mut self, column: Column) -> usize { // Return existing query, if it exists - for (index, fixed_query) in self.fixed_queries.iter().enumerate() { + for (index, fixed_query) in self.cs.fixed_queries.iter().enumerate() { if fixed_query == &(column, Rotation::cur()) { return index; } } // Make a new query - let index = self.fixed_queries.len(); - self.fixed_queries.push((column, Rotation::cur())); + let index = self.cs.fixed_queries.len(); + self.cs.fixed_queries.push((column, Rotation::cur())); index } pub(crate) fn query_advice_index(&mut self, column: Column, at: Rotation) -> usize { // Return existing query, if it exists - for (index, advice_query) in self.advice_queries.iter().enumerate() { + for (index, advice_query) in self.cs.advice_queries.iter().enumerate() { if advice_query == &(column, at) { return index; } } // Make a new query - let index = self.advice_queries.len(); - self.advice_queries.push((column, at)); + let index = self.cs.advice_queries.len(); + self.cs.advice_queries.push((column, at)); self.num_advice_queries[column.index] += 1; index @@ -1116,15 +1123,15 @@ impl ConstraintSystem { fn query_instance_index(&mut self, column: Column, at: Rotation) -> usize { // Return existing query, if it exists - for (index, instance_query) in self.instance_queries.iter().enumerate() { + for (index, instance_query) in self.cs.instance_queries.iter().enumerate() { if instance_query == &(column, at) { return index; } } // Make a new query - let index = self.instance_queries.len(); - self.instance_queries.push((column, at)); + let index = self.cs.instance_queries.len(); + self.cs.instance_queries.push((column, at)); index } @@ -1138,7 +1145,9 @@ impl ConstraintSystem { } } } +} +impl ConstraintSystem { pub(crate) fn get_advice_query_index(&self, column: Column, at: Rotation) -> usize { for (index, advice_query) in self.advice_queries.iter().enumerate() { if advice_query == &(column, at) { @@ -1183,12 +1192,14 @@ impl ConstraintSystem { ), } } +} +impl ConstraintSystemBuilder { /// Sets the minimum degree required by the circuit, which can be set to a /// larger amount than actually needed. This can be used, for example, to /// force the permutation argument to involve more columns in the same set. pub fn set_minimum_degree(&mut self, degree: usize) { - self.minimum_degree = Some(degree); + self.cs.minimum_degree = Some(degree); } /// Creates a new gate. @@ -1218,7 +1229,7 @@ impl ConstraintSystem { "Gates must contain at least one constraint." ); - self.gates.push(Gate { + self.cs.gates.push(Gate { name, constraint_names, polys, @@ -1237,14 +1248,14 @@ impl ConstraintSystem { pub(crate) fn compress_selectors(mut self, selectors: Vec>) -> (Self, Vec>) { // The number of provided selector assignments must be the number we // counted for this constraint system. - assert_eq!(selectors.len(), self.num_selectors); + assert_eq!(selectors.len(), self.cs.num_selectors); // Compute the maximal degree of every selector. We only consider the // expressions in gates, as lookup arguments cannot support simple // selectors. Selectors that are complex or do not appear in any gates // will have degree zero. let mut degrees = vec![0; selectors.len()]; - for expr in self.gates.iter().flat_map(|gate| gate.polys.iter()) { + for expr in self.cs.gates.iter().flat_map(|gate| gate.polys.iter()) { if let Some(selector) = expr.extract_simple_selector() { degrees[selector.0] = max(degrees[selector.0], expr.degree()); } @@ -1324,13 +1335,18 @@ impl ConstraintSystem { } // Substitute selectors for the real fixed columns in all gates - for expr in self.gates.iter_mut().flat_map(|gate| gate.polys.iter_mut()) { + for expr in self + .cs + .gates + .iter_mut() + .flat_map(|gate| gate.polys.iter_mut()) + { replace_selectors(expr, &selector_replacements, false); } // Substitute non-simple selectors for the real fixed columns in all // lookup expressions - for expr in self.lookups.iter_mut().flat_map(|lookup| { + for expr in self.cs.lookups.iter_mut().flat_map(|lookup| { lookup .input_expressions .iter_mut() @@ -1347,16 +1363,16 @@ impl ConstraintSystem { /// selectors. Also, simple selectors may not appear in lookup argument /// inputs. pub fn selector(&mut self) -> Selector { - let index = self.num_selectors; - self.num_selectors += 1; + let index = self.cs.num_selectors; + self.cs.num_selectors += 1; Selector(index, true) } /// Allocate a new complex selector that can appear anywhere /// within expressions. pub fn complex_selector(&mut self) -> Selector { - let index = self.num_selectors; - self.num_selectors += 1; + let index = self.cs.num_selectors; + self.cs.num_selectors += 1; Selector(index, false) } @@ -1370,20 +1386,20 @@ impl ConstraintSystem { /// Allocate a new fixed column pub fn fixed_column(&mut self) -> Column { let tmp = Column { - index: self.num_fixed_columns, + index: self.cs.num_fixed_columns, column_type: Fixed, }; - self.num_fixed_columns += 1; + self.cs.num_fixed_columns += 1; tmp } /// Allocate a new advice column pub fn advice_column(&mut self) -> Column { let tmp = Column { - index: self.num_advice_columns, + index: self.cs.num_advice_columns, column_type: Advice, }; - self.num_advice_columns += 1; + self.cs.num_advice_columns += 1; self.num_advice_queries.push(0); tmp } @@ -1391,10 +1407,10 @@ impl ConstraintSystem { /// Allocate a new instance column pub fn instance_column(&mut self) -> Column { let tmp = Column { - index: self.num_instance_columns, + index: self.cs.num_instance_columns, column_type: Instance, }; - self.num_instance_columns += 1; + self.cs.num_instance_columns += 1; tmp } @@ -1403,13 +1419,14 @@ impl ConstraintSystem { pub fn degree(&self) -> usize { // The permutation argument will serve alongside the gates, so must be // accounted for. - let mut degree = self.permutation.required_degree(); + let mut degree = self.cs.permutation.required_degree(); // The lookup argument also serves alongside the gates and must be accounted // for. degree = std::cmp::max( degree, - self.lookups + self.cs + .lookups .iter() .map(|l| l.required_degree()) .max() @@ -1420,14 +1437,15 @@ impl ConstraintSystem { // correct degree and that our extended domain is the right size. degree = std::cmp::max( degree, - self.gates + self.cs + .gates .iter() .flat_map(|gate| gate.polynomials().iter().map(|poly| poly.degree())) .max() .unwrap_or(0), ); - std::cmp::max(degree, self.minimum_degree.unwrap_or(1)) + std::cmp::max(degree, self.cs.minimum_degree.unwrap_or(1)) } /// Compute the number of blinding factors necessary to perfectly blind @@ -1476,13 +1494,13 @@ impl ConstraintSystem { /// table. #[derive(Debug)] pub struct VirtualCells<'a, F: Field> { - meta: &'a mut ConstraintSystem, + meta: &'a mut ConstraintSystemBuilder, queried_selectors: Vec, queried_cells: Vec, } impl<'a, F: Field> VirtualCells<'a, F> { - fn new(meta: &'a mut ConstraintSystem) -> Self { + fn new(meta: &'a mut ConstraintSystemBuilder) -> Self { VirtualCells { meta, queried_selectors: vec![], diff --git a/halo2_proofs/src/plonk/error.rs b/halo2_proofs/src/plonk/error.rs index 6e3131e798..6487c1582c 100644 --- a/halo2_proofs/src/plonk/error.rs +++ b/halo2_proofs/src/plonk/error.rs @@ -31,9 +31,9 @@ pub enum Error { /// Instance provided exceeds number of available rows InstanceTooLarge, /// Circuit synthesis requires global constants, but circuit configuration did not - /// call [`ConstraintSystem::enable_constant`] on fixed columns with sufficient space. + /// call [`ConstraintSystemBuilder::enable_constant`] on fixed columns with sufficient space. /// - /// [`ConstraintSystem::enable_constant`]: crate::plonk::ConstraintSystem::enable_constant + /// [`ConstraintSystemBuilder::enable_constant`]: crate::plonk::ConstraintSystemBuilder::enable_constant NotEnoughColumnsForConstants, /// The instance sets up a copy constraint involving a column that has not been /// included in the permutation. diff --git a/halo2_proofs/src/plonk/keygen.rs b/halo2_proofs/src/plonk/keygen.rs index bb26d5a6fb..51b5cc5519 100644 --- a/halo2_proofs/src/plonk/keygen.rs +++ b/halo2_proofs/src/plonk/keygen.rs @@ -6,11 +6,9 @@ use ff::{Field, FromUniformBytes}; use group::Curve; use super::{ - circuit::{ - Advice, Any, Assignment, Circuit, Column, ConstraintSystem, Fixed, FloorPlanner, Instance, - Selector, - }, - permutation, Assigned, Error, LagrangeCoeff, Polynomial, ProvingKey, VerifyingKey, + circuit::{Advice, Any, Assignment, Circuit, Column, Fixed, FloorPlanner, Instance, Selector}, + permutation, Assigned, ConstraintSystemBuilder, Error, LagrangeCoeff, Polynomial, ProvingKey, + VerifyingKey, }; use crate::{ arithmetic::CurveAffine, @@ -26,14 +24,14 @@ pub(crate) fn create_domain( params: &Params, ) -> ( EvaluationDomain, - ConstraintSystem, + ConstraintSystemBuilder, ConcreteCircuit::Config, ) where C: CurveAffine, ConcreteCircuit: Circuit, { - let mut cs = ConstraintSystem::default(); + let mut cs = ConstraintSystemBuilder::default(); let config = ConcreteCircuit::configure(&mut cs); let degree = cs.degree(); @@ -203,9 +201,9 @@ where let mut assembly: Assembly = Assembly { k: params.k, - fixed: vec![domain.empty_lagrange_assigned(); cs.num_fixed_columns], - permutation: permutation::keygen::Assembly::new(params.n as usize, &cs.permutation), - selectors: vec![vec![false; params.n as usize]; cs.num_selectors], + fixed: vec![domain.empty_lagrange_assigned(); cs.cs.num_fixed_columns], + permutation: permutation::keygen::Assembly::new(params.n as usize, &cs.cs.permutation), + selectors: vec![vec![false; params.n as usize]; cs.cs.num_selectors], usable_rows: 0..params.n as usize - (cs.blinding_factors() + 1), _marker: std::marker::PhantomData, }; @@ -215,7 +213,7 @@ where &mut assembly, circuit, config, - cs.constants.clone(), + cs.cs.constants.clone(), )?; let mut fixed = batch_invert_assigned(assembly.fixed); @@ -226,9 +224,11 @@ where .map(|poly| domain.lagrange_from_vec(poly)), ); + // This is post-optimization. + let permutation_vk = assembly .permutation - .build_vk(params, &domain, &cs.permutation); + .build_vk(params, &domain, &cs.cs.permutation); let fixed_commitments = fixed .iter() @@ -253,7 +253,7 @@ where C: CurveAffine, ConcreteCircuit: Circuit, { - let mut cs = ConstraintSystem::default(); + let mut cs = ConstraintSystemBuilder::default(); let config = ConcreteCircuit::configure(&mut cs); let cs = cs; @@ -264,9 +264,9 @@ where let mut assembly: Assembly = Assembly { k: params.k, - fixed: vec![vk.domain.empty_lagrange_assigned(); cs.num_fixed_columns], - permutation: permutation::keygen::Assembly::new(params.n as usize, &cs.permutation), - selectors: vec![vec![false; params.n as usize]; cs.num_selectors], + fixed: vec![vk.domain.empty_lagrange_assigned(); cs.cs.num_fixed_columns], + permutation: permutation::keygen::Assembly::new(params.n as usize, &cs.cs.permutation), + selectors: vec![vec![false; params.n as usize]; cs.cs.num_selectors], usable_rows: 0..params.n as usize - (cs.blinding_factors() + 1), _marker: std::marker::PhantomData, }; @@ -276,7 +276,7 @@ where &mut assembly, circuit, config, - cs.constants.clone(), + cs.cs.constants.clone(), )?; let mut fixed = batch_invert_assigned(assembly.fixed); @@ -299,7 +299,7 @@ where let permutation_pk = assembly .permutation - .build_pk(params, &vk.domain, &cs.permutation); + .build_pk(params, &vk.domain, &cs.cs.permutation); // Compute l_0(X) // TODO: this can be done more efficiently diff --git a/halo2_proofs/src/plonk/lookup/prover.rs b/halo2_proofs/src/plonk/lookup/prover.rs index a6ad4a62c7..9f026706fd 100644 --- a/halo2_proofs/src/plonk/lookup/prover.rs +++ b/halo2_proofs/src/plonk/lookup/prover.rs @@ -264,7 +264,7 @@ impl Permuted { mut rng: R, transcript: &mut T, ) -> Result, Error> { - let blinding_factors = pk.vk.cs.blinding_factors(); + let blinding_factors = pk.vk.num_blinding_factors; // Goal is to compute the products of fractions // // Numerator: (\theta^{m-1} a_0(\omega^i) + \theta^{m-2} a_1(\omega^i) + ... + \theta a_{m-2}(\omega^i) + a_{m-1}(\omega^i) + \beta) @@ -568,7 +568,7 @@ fn permute_expression_pair( input_expression: &Polynomial, table_expression: &Polynomial, ) -> Result, Error> { - let blinding_factors = pk.vk.cs.blinding_factors(); + let blinding_factors = pk.vk.num_blinding_factors; let usable_rows = params.n as usize - (blinding_factors + 1); let mut permuted_input_expression: Vec = input_expression.to_vec(); diff --git a/halo2_proofs/src/plonk/permutation/prover.rs b/halo2_proofs/src/plonk/permutation/prover.rs index 7e72378bde..096eb243e7 100644 --- a/halo2_proofs/src/plonk/permutation/prover.rs +++ b/halo2_proofs/src/plonk/permutation/prover.rs @@ -72,7 +72,7 @@ impl Argument { // 3 circuit for the permutation argument. assert!(pk.vk.cs_degree >= 3); let chunk_len = pk.vk.cs_degree - 2; - let blinding_factors = pk.vk.cs.blinding_factors(); + let blinding_factors = pk.vk.num_blinding_factors; // Each column gets its own delta power. let mut deltaomega = C::Scalar::ONE; @@ -214,7 +214,7 @@ impl Committed { impl Iterator> + 'a, ) { let chunk_len = pk.vk.cs_degree - 2; - let blinding_factors = pk.vk.cs.blinding_factors(); + let blinding_factors = pk.vk.num_blinding_factors; let last_rotation = Rotation(-((blinding_factors + 1) as i32)); let constructed = Constructed { @@ -346,7 +346,7 @@ impl Constructed { transcript: &mut T, ) -> Result, Error> { let domain = &pk.vk.domain; - let blinding_factors = pk.vk.cs.blinding_factors(); + let blinding_factors = pk.vk.num_blinding_factors; { let mut sets = self.sets.iter(); @@ -391,7 +391,7 @@ impl Evaluated { pk: &'a plonk::ProvingKey, x: ChallengeX, ) -> impl Iterator> + Clone { - let blinding_factors = pk.vk.cs.blinding_factors(); + let blinding_factors = pk.vk.num_blinding_factors; let x_next = pk.vk.domain.rotate_omega(*x, Rotation::next()); let x_last = pk .vk diff --git a/halo2_proofs/src/plonk/permutation/verifier.rs b/halo2_proofs/src/plonk/permutation/verifier.rs index bf3d8f5c30..80e8883c34 100644 --- a/halo2_proofs/src/plonk/permutation/verifier.rs +++ b/halo2_proofs/src/plonk/permutation/verifier.rs @@ -193,7 +193,7 @@ impl Evaluated { vk: &'r plonk::VerifyingKey, x: ChallengeX, ) -> impl Iterator> + Clone { - let blinding_factors = vk.cs.blinding_factors(); + let blinding_factors = vk.num_blinding_factors; let x_next = vk.domain.rotate_omega(*x, Rotation::next()); let x_last = vk .domain diff --git a/halo2_proofs/src/plonk/prover.rs b/halo2_proofs/src/plonk/prover.rs index e54f2129f0..9ecd985658 100644 --- a/halo2_proofs/src/plonk/prover.rs +++ b/halo2_proofs/src/plonk/prover.rs @@ -5,17 +5,14 @@ use std::iter; use std::ops::RangeTo; use super::{ - circuit::{ - Advice, Any, Assignment, Circuit, Column, ConstraintSystem, Fixed, FloorPlanner, Instance, - Selector, - }, + circuit::{Advice, Any, Assignment, Circuit, Column, Fixed, FloorPlanner, Instance, Selector}, lookup, permutation, vanishing, ChallengeBeta, ChallengeGamma, ChallengeTheta, ChallengeX, ChallengeY, Error, ProvingKey, }; use crate::{ arithmetic::{eval_polynomial, CurveAffine}, circuit::Value, - plonk::Assigned, + plonk::{Assigned, ConstraintSystemBuilder}, poly::{ self, commitment::{Blind, Params}, @@ -60,7 +57,7 @@ pub fn create_proof< pk.vk.hash_into(transcript)?; let domain = &pk.vk.domain; - let mut meta = ConstraintSystem::default(); + let mut meta = ConstraintSystemBuilder::default(); let config = ConcreteCircuit::configure(&mut meta); // Selector optimizations cannot be applied here; use the ConstraintSystem @@ -81,7 +78,7 @@ pub fn create_proof< .map(|values| { let mut poly = domain.empty_lagrange(); assert_eq!(poly.len(), params.n as usize); - if values.len() > (poly.len() - (meta.blinding_factors() + 1)) { + if values.len() > (poly.len() - (pk.vk.num_blinding_factors + 1)) { return Err(Error::InstanceTooLarge); } for (poly, value) in poly.iter_mut().zip(values.iter()) { @@ -266,7 +263,7 @@ pub fn create_proof< } } - let unusable_rows_start = params.n as usize - (meta.blinding_factors() + 1); + let unusable_rows_start = params.n as usize - (pk.vk.num_blinding_factors + 1); let mut witness = WitnessCollection { k: params.k, @@ -746,7 +743,7 @@ fn test_create_proof() { *self } - fn configure(_meta: &mut ConstraintSystem) -> Self::Config {} + fn configure(_meta: &mut ConstraintSystemBuilder) -> Self::Config {} fn synthesize( &self, diff --git a/halo2_proofs/src/plonk/verifier.rs b/halo2_proofs/src/plonk/verifier.rs index f141ebaf98..54e826767f 100644 --- a/halo2_proofs/src/plonk/verifier.rs +++ b/halo2_proofs/src/plonk/verifier.rs @@ -90,7 +90,7 @@ pub fn verify_proof< instance .iter() .map(|instance| { - if instance.len() > params.n as usize - (vk.cs.blinding_factors() + 1) { + if instance.len() > params.n as usize - (vk.num_blinding_factors + 1) { return Err(Error::InstanceTooLarge); } let mut poly = instance.to_vec(); @@ -205,7 +205,7 @@ pub fn verify_proof< // x^n let xn = x.pow(&[params.n, 0, 0, 0]); - let blinding_factors = vk.cs.blinding_factors(); + let blinding_factors = vk.num_blinding_factors; let l_evals = vk .domain .l_i_range(*x, xn, (-((blinding_factors + 1) as i32))..=0); diff --git a/halo2_proofs/tests/plonk_api.rs b/halo2_proofs/tests/plonk_api.rs index 11e87616ae..b04dfc4c4d 100644 --- a/halo2_proofs/tests/plonk_api.rs +++ b/halo2_proofs/tests/plonk_api.rs @@ -9,7 +9,8 @@ use halo2_proofs::dev::MockProver; use halo2_proofs::pasta::{Eq, EqAffine, Fp}; use halo2_proofs::plonk::{ create_proof, keygen_pk, keygen_vk, verify_proof, Advice, Assigned, BatchVerifier, Circuit, - Column, ConstraintSystem, Error, Fixed, SingleVerifier, TableColumn, VerificationStrategy, + Column, ConstraintSystemBuilder, Error, Fixed, SingleVerifier, TableColumn, + VerificationStrategy, }; use halo2_proofs::poly::commitment::{Guard, MSM}; use halo2_proofs::poly::{commitment::Params, Rotation}; @@ -272,7 +273,7 @@ fn plonk_api() { } } - fn configure(meta: &mut ConstraintSystem) -> PlonkConfig { + fn configure(meta: &mut ConstraintSystemBuilder) -> PlonkConfig { let e = meta.advice_column(); let a = meta.advice_column(); let b = meta.advice_column();