mirror of https://github.com/zcash/orchard.git
chip::add_incomplete: Refactor add_incomplete::Config.
This is also used in mul_fixed.
This commit is contained in:
parent
9d8fee29c7
commit
13faedc7cc
|
@ -139,7 +139,7 @@ pub struct EccConfig {
|
||||||
pub fixed_z: Column<Fixed>,
|
pub fixed_z: Column<Fixed>,
|
||||||
|
|
||||||
/// Incomplete addition
|
/// Incomplete addition
|
||||||
pub q_add_incomplete: Selector,
|
add_incomplete: add_incomplete::Config,
|
||||||
|
|
||||||
/// Complete addition
|
/// Complete addition
|
||||||
pub q_add: Selector,
|
pub q_add: Selector,
|
||||||
|
@ -249,12 +249,15 @@ impl EccChip {
|
||||||
|
|
||||||
// Create witness point gate
|
// Create witness point gate
|
||||||
let witness_point = witness_point::Config::configure(meta, advices[0], advices[1]);
|
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 {
|
let config = EccConfig {
|
||||||
advices,
|
advices,
|
||||||
lagrange_coeffs,
|
lagrange_coeffs,
|
||||||
fixed_z: meta.fixed_column(),
|
fixed_z: meta.fixed_column(),
|
||||||
q_add_incomplete: meta.selector(),
|
add_incomplete,
|
||||||
q_add: meta.selector(),
|
q_add: meta.selector(),
|
||||||
q_mul_hi: (meta.selector(), meta.selector(), meta.selector()),
|
q_mul_hi: (meta.selector(), meta.selector(), meta.selector()),
|
||||||
q_mul_lo: (meta.selector(), meta.selector(), meta.selector()),
|
q_mul_lo: (meta.selector(), meta.selector(), meta.selector()),
|
||||||
|
@ -270,12 +273,6 @@ impl EccChip {
|
||||||
running_sum_config,
|
running_sum_config,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create incomplete point addition gate
|
|
||||||
{
|
|
||||||
let config: add_incomplete::Config = (&config).into();
|
|
||||||
config.create_gate(meta);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create complete point addition gate
|
// Create complete point addition gate
|
||||||
{
|
{
|
||||||
let add_config: add::Config = (&config).into();
|
let add_config: add::Config = (&config).into();
|
||||||
|
@ -432,7 +429,7 @@ impl EccInstructions<pallas::Affine> for EccChip {
|
||||||
a: &Self::NonIdentityPoint,
|
a: &Self::NonIdentityPoint,
|
||||||
b: &Self::NonIdentityPoint,
|
b: &Self::NonIdentityPoint,
|
||||||
) -> Result<Self::NonIdentityPoint, Error> {
|
) -> Result<Self::NonIdentityPoint, Error> {
|
||||||
let config: add_incomplete::Config = self.config().into();
|
let config = self.config().add_incomplete;
|
||||||
layouter.assign_region(
|
layouter.assign_region(
|
||||||
|| "incomplete point addition",
|
|| "incomplete point addition",
|
||||||
|mut region| config.assign_region(a, b, 0, &mut region),
|
|mut region| config.assign_region(a, b, 0, &mut region),
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use std::{array, collections::HashSet};
|
use std::{array, collections::HashSet};
|
||||||
|
|
||||||
use super::{copy, CellValue, EccConfig, NonIdentityEccPoint, Var};
|
use super::{copy, CellValue, NonIdentityEccPoint, Var};
|
||||||
use group::Curve;
|
use group::Curve;
|
||||||
use halo2::{
|
use halo2::{
|
||||||
circuit::Region,
|
circuit::Region,
|
||||||
|
@ -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_add_incomplete: Selector,
|
q_add_incomplete: Selector,
|
||||||
// x-coordinate of P in P + Q = R
|
// x-coordinate of P in P + Q = R
|
||||||
|
@ -22,24 +22,37 @@ pub struct Config {
|
||||||
pub y_qr: Column<Advice>,
|
pub y_qr: Column<Advice>,
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
impl Config {
|
||||||
|
pub(super) fn configure(
|
||||||
|
meta: &mut ConstraintSystem<pallas::Base>,
|
||||||
|
x_p: Column<Advice>,
|
||||||
|
y_p: Column<Advice>,
|
||||||
|
x_qr: Column<Advice>,
|
||||||
|
y_qr: Column<Advice>,
|
||||||
|
) -> 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<Column<Advice>> {
|
pub(crate) fn advice_columns(&self) -> HashSet<Column<Advice>> {
|
||||||
core::array::IntoIter::new([self.x_p, self.y_p, self.x_qr, self.y_qr]).collect()
|
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<pallas::Base>) {
|
fn create_gate(&self, meta: &mut ConstraintSystem<pallas::Base>) {
|
||||||
meta.create_gate("incomplete addition gates", |meta| {
|
meta.create_gate("incomplete addition gates", |meta| {
|
||||||
let q_add_incomplete = meta.query_selector(self.q_add_incomplete);
|
let q_add_incomplete = meta.query_selector(self.q_add_incomplete);
|
||||||
let x_p = meta.query_advice(self.x_p, Rotation::cur());
|
let x_p = meta.query_advice(self.x_p, Rotation::cur());
|
||||||
|
|
|
@ -108,7 +108,7 @@ impl<const NUM_WINDOWS: usize> From<&EccConfig> for Config<NUM_WINDOWS> {
|
||||||
window: ecc_config.advices[4],
|
window: ecc_config.advices[4],
|
||||||
u: ecc_config.advices[5],
|
u: ecc_config.advices[5],
|
||||||
add_config: ecc_config.into(),
|
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`.
|
// Check relationships between this config and `add_config`.
|
||||||
|
|
Loading…
Reference in New Issue