diff --git a/src/circuit/gadget/ecc/chip.rs b/src/circuit/gadget/ecc/chip.rs index 956330b4..a12b7030 100644 --- a/src/circuit/gadget/ecc/chip.rs +++ b/src/circuit/gadget/ecc/chip.rs @@ -139,7 +139,7 @@ pub struct EccConfig { pub fixed_z: Column, /// Incomplete addition - pub q_add_incomplete: Selector, + add_incomplete: add_incomplete::Config, /// Complete addition pub q_add: Selector, @@ -249,12 +249,15 @@ impl EccChip { // Create witness point gate let witness_point = witness_point::Config::configure(meta, advices[0], advices[1]); + // Create incomplete point addition gate + let add_incomplete = + add_incomplete::Config::configure(meta, advices[0], advices[1], advices[2], advices[3]); let config = EccConfig { advices, lagrange_coeffs, fixed_z: meta.fixed_column(), - q_add_incomplete: meta.selector(), + add_incomplete, q_add: meta.selector(), q_mul_hi: (meta.selector(), meta.selector(), meta.selector()), q_mul_lo: (meta.selector(), meta.selector(), meta.selector()), @@ -270,12 +273,6 @@ impl EccChip { running_sum_config, }; - // Create incomplete point addition gate - { - let config: add_incomplete::Config = (&config).into(); - config.create_gate(meta); - } - // Create complete point addition gate { let add_config: add::Config = (&config).into(); @@ -432,7 +429,7 @@ impl EccInstructions for EccChip { a: &Self::NonIdentityPoint, b: &Self::NonIdentityPoint, ) -> Result { - let config: add_incomplete::Config = self.config().into(); + let config = self.config().add_incomplete; layouter.assign_region( || "incomplete point addition", |mut region| config.assign_region(a, b, 0, &mut region), diff --git a/src/circuit/gadget/ecc/chip/add_incomplete.rs b/src/circuit/gadget/ecc/chip/add_incomplete.rs index a5da1875..30b74e0d 100644 --- a/src/circuit/gadget/ecc/chip/add_incomplete.rs +++ b/src/circuit/gadget/ecc/chip/add_incomplete.rs @@ -1,6 +1,6 @@ use std::{array, collections::HashSet}; -use super::{copy, CellValue, EccConfig, NonIdentityEccPoint, Var}; +use super::{copy, CellValue, NonIdentityEccPoint, Var}; use group::Curve; use halo2::{ circuit::Region, @@ -9,7 +9,7 @@ use halo2::{ }; use pasta_curves::{arithmetic::CurveAffine, pallas}; -#[derive(Clone, Debug)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct Config { q_add_incomplete: Selector, // x-coordinate of P in P + Q = R @@ -22,24 +22,37 @@ pub struct Config { pub y_qr: Column, } -impl From<&EccConfig> for Config { - fn from(ecc_config: &EccConfig) -> Self { - Self { - q_add_incomplete: ecc_config.q_add_incomplete, - x_p: ecc_config.advices[0], - y_p: ecc_config.advices[1], - x_qr: ecc_config.advices[2], - y_qr: ecc_config.advices[3], - } - } -} - impl Config { + pub(super) fn configure( + meta: &mut ConstraintSystem, + x_p: Column, + y_p: Column, + x_qr: Column, + y_qr: Column, + ) -> Self { + meta.enable_equality(x_p.into()); + meta.enable_equality(y_p.into()); + meta.enable_equality(x_qr.into()); + meta.enable_equality(y_qr.into()); + + let config = Self { + q_add_incomplete: meta.selector(), + x_p, + y_p, + x_qr, + y_qr, + }; + + config.create_gate(meta); + + config + } + pub(crate) fn advice_columns(&self) -> HashSet> { core::array::IntoIter::new([self.x_p, self.y_p, self.x_qr, self.y_qr]).collect() } - pub(super) fn create_gate(&self, meta: &mut ConstraintSystem) { + fn create_gate(&self, meta: &mut ConstraintSystem) { meta.create_gate("incomplete addition gates", |meta| { let q_add_incomplete = meta.query_selector(self.q_add_incomplete); let x_p = meta.query_advice(self.x_p, Rotation::cur()); diff --git a/src/circuit/gadget/ecc/chip/mul_fixed.rs b/src/circuit/gadget/ecc/chip/mul_fixed.rs index 87c2e376..bb2b87a8 100644 --- a/src/circuit/gadget/ecc/chip/mul_fixed.rs +++ b/src/circuit/gadget/ecc/chip/mul_fixed.rs @@ -108,7 +108,7 @@ impl From<&EccConfig> for Config { window: ecc_config.advices[4], u: ecc_config.advices[5], add_config: ecc_config.into(), - add_incomplete_config: ecc_config.into(), + add_incomplete_config: ecc_config.add_incomplete, }; // Check relationships between this config and `add_config`.