chip::witness_point: Refactor witness_point::Config.

This commit is contained in:
therealyingtong 2021-11-30 13:47:52 -05:00
parent 76c8bb9711
commit 9d8fee29c7
3 changed files with 547 additions and 547 deletions

View File

@ -165,10 +165,8 @@ pub struct EccConfig {
/// when the scalar is a signed short exponent or a base-field element. /// when the scalar is a signed short exponent or a base-field element.
pub q_mul_fixed_running_sum: Selector, pub q_mul_fixed_running_sum: Selector,
/// Witness point (can be identity) /// Witness point
pub q_point: Selector, witness_point: witness_point::Config,
/// Witness non-identity point
pub q_point_non_id: Selector,
/// Lookup range check using 10-bit lookup table /// Lookup range check using 10-bit lookup table
pub lookup_config: LookupRangeCheckConfig<pallas::Base, { sinsemilla::K }>, pub lookup_config: LookupRangeCheckConfig<pallas::Base, { sinsemilla::K }>,
@ -249,6 +247,9 @@ impl EccChip {
let running_sum_config = let running_sum_config =
RunningSumConfig::configure(meta, q_mul_fixed_running_sum, advices[4]); RunningSumConfig::configure(meta, q_mul_fixed_running_sum, advices[4]);
// Create witness point gate
let witness_point = witness_point::Config::configure(meta, advices[0], advices[1]);
let config = EccConfig { let config = EccConfig {
advices, advices,
lagrange_coeffs, lagrange_coeffs,
@ -264,18 +265,11 @@ impl EccChip {
q_mul_fixed_short: meta.selector(), q_mul_fixed_short: meta.selector(),
q_mul_fixed_base_field: meta.selector(), q_mul_fixed_base_field: meta.selector(),
q_mul_fixed_running_sum, q_mul_fixed_running_sum,
q_point: meta.selector(), witness_point,
q_point_non_id: meta.selector(),
lookup_config: range_check, lookup_config: range_check,
running_sum_config, running_sum_config,
}; };
// Create witness point gate
{
let config: witness_point::Config = (&config).into();
config.create_gate(meta);
}
// Create incomplete point addition gate // Create incomplete point addition gate
{ {
let config: add_incomplete::Config = (&config).into(); let config: add_incomplete::Config = (&config).into();
@ -408,7 +402,7 @@ impl EccInstructions<pallas::Affine> for EccChip {
layouter: &mut impl Layouter<pallas::Base>, layouter: &mut impl Layouter<pallas::Base>,
value: Option<pallas::Affine>, value: Option<pallas::Affine>,
) -> Result<Self::Point, Error> { ) -> Result<Self::Point, Error> {
let config: witness_point::Config = self.config().into(); let config = self.config().witness_point;
layouter.assign_region( layouter.assign_region(
|| "witness point", || "witness point",
|mut region| config.point(value, 0, &mut region), |mut region| config.point(value, 0, &mut region),
@ -420,7 +414,7 @@ impl EccInstructions<pallas::Affine> for EccChip {
layouter: &mut impl Layouter<pallas::Base>, layouter: &mut impl Layouter<pallas::Base>,
value: Option<pallas::Affine>, value: Option<pallas::Affine>,
) -> Result<Self::NonIdentityPoint, Error> { ) -> Result<Self::NonIdentityPoint, Error> {
let config: witness_point::Config = self.config().into(); let config = self.config().witness_point;
layouter.assign_region( layouter.assign_region(
|| "witness non-identity point", || "witness non-identity point",
|mut region| config.point_non_id(value, 0, &mut region), |mut region| config.point_non_id(value, 0, &mut region),

View File

@ -1,4 +1,4 @@
use super::{CellValue, EccConfig, EccPoint, NonIdentityEccPoint, Var}; use super::{CellValue, EccPoint, NonIdentityEccPoint, Var};
use group::prime::PrimeCurveAffine; use group::prime::PrimeCurveAffine;
@ -9,7 +9,7 @@ use halo2::{
}; };
use pasta_curves::{arithmetic::CurveAffine, pallas}; use pasta_curves::{arithmetic::CurveAffine, pallas};
#[derive(Clone, Debug)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Config { pub struct Config {
q_point: Selector, q_point: Selector,
q_point_non_id: Selector, q_point_non_id: Selector,
@ -19,19 +19,25 @@ pub struct Config {
pub y: Column<Advice>, pub y: Column<Advice>,
} }
impl From<&EccConfig> for Config { impl Config {
fn from(ecc_config: &EccConfig) -> Self { pub(super) fn configure(
Self { meta: &mut ConstraintSystem<pallas::Base>,
q_point: ecc_config.q_point, x: Column<Advice>,
q_point_non_id: ecc_config.q_point_non_id, y: Column<Advice>,
x: ecc_config.advices[0], ) -> Self {
y: ecc_config.advices[1], let config = Self {
} q_point: meta.selector(),
} q_point_non_id: meta.selector(),
x,
y,
};
config.create_gate(meta);
config
} }
impl Config { fn create_gate(&self, meta: &mut ConstraintSystem<pallas::Base>) {
pub(super) fn create_gate(&self, meta: &mut ConstraintSystem<pallas::Base>) {
let curve_eqn = |meta: &mut VirtualCells<pallas::Base>| { let curve_eqn = |meta: &mut VirtualCells<pallas::Base>| {
let x = meta.query_advice(self.x, Rotation::cur()); let x = meta.query_advice(self.x, Rotation::cur());
let y = meta.query_advice(self.y, Rotation::cur()); let y = meta.query_advice(self.y, Rotation::cur());

File diff suppressed because it is too large Load Diff