Skip to content

Commit 8b08de2

Browse files
authored
Merge pull request #181 from o1-labs/expr-ec-ops
Complete EC addition gate
2 parents f7c139f + 49454f1 commit 8b08de2

File tree

16 files changed

+492
-523
lines changed

16 files changed

+492
-523
lines changed

circuits/plonk-15-wires/src/expr.rs

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ pub enum Column {
124124
impl Column {
125125
fn domain(&self) -> Domain {
126126
match self {
127+
Column::Index(GateType::CompleteAdd) => Domain::D4,
127128
_ => Domain::D8,
128129
}
129130
}
@@ -641,7 +642,7 @@ impl<'a, F: FftField> EvalResult<'a, F> {
641642

642643
let n = res_domain.1.size as usize;
643644
let v: Vec<_> = (0..n).into_par_iter().map(|i| {
644-
es1.evals[(scale1 * i + (d1 as usize) * s1) % es1.evals.len()]
645+
es1.evals[(scale1 * i + (d1 as usize) * s1) % es1.evals.len()]
645646
+ es2.evals[(scale2 * i + (d2 as usize) * s2) % es2.evals.len()]
646647
}).collect();
647648

@@ -790,23 +791,16 @@ impl<'a, F: FftField> EvalResult<'a, F> {
790791

791792
EvalResult::init(
792793
res_domain,
793-
|i| es1.evals[(scale1 * i + (d1 as usize) * s1) % es1.evals.len()] * es2.evals[(scale2 * i + (d2 as usize) * s2) % es1.evals.len()])
794+
|i| {
795+
es1.evals[(scale1 * i + (d1 as usize) * s1) % es1.evals.len()]
796+
* es2.evals[(scale2 * i + (d2 as usize) * s2) % es2.evals.len()]
797+
})
794798
}
795799
}
796800
}
797801

798802
}
799803

800-
/*
801-
fn eval_result_op<'a, 'b, 'c, F: FftField>(op: Op2, dom: (Domain, D<F>), x: EvalResult<'a, F>, y: EvalResult<'b, F>) -> EvalResult<'c, F> {
802-
match op {
803-
Op2::Mul => x.mul(y, dom),
804-
Op2::Add => x.add(y, dom),
805-
Op2::Sub => x.sub(y, dom),
806-
}
807-
}
808-
*/
809-
810804
fn get_domain<F: FftField>(d: Domain, env: &Environment<F>) -> D<F> {
811805
match d {
812806
Domain::D1 => env.domain.d1,
@@ -816,6 +810,18 @@ fn get_domain<F: FftField>(d: Domain, env: &Environment<F>) -> D<F> {
816810
}
817811
}
818812

813+
impl<F: Field> Expr<ConstantExpr<F>> {
814+
/// Combines multiple constraints `[c0, ..., cn]` into a single constraint
815+
/// `alpha^alpha0 * c0 + alpha^{alpha0 + 1} * c1 + ... + alpha^{alpha0 + n} * cn`.
816+
pub fn combine_constraints(alpha0: usize, cs: Vec<Self>) -> Self {
817+
let zero = Expr::<ConstantExpr<F>>::zero();
818+
cs.into_iter().zip(alpha0..).map(|(c, i)| {
819+
Expr::Constant(ConstantExpr::Alpha.pow(i)) * c
820+
}).fold(zero, |acc, x| acc + x)
821+
}
822+
823+
}
824+
819825
impl<F: FftField> Expr<ConstantExpr<F>> {
820826
/// Convenience function for constructing expressions from literal
821827
/// field elements.
@@ -875,15 +881,6 @@ impl<F: FftField> Expr<ConstantExpr<F>> {
875881
}
876882
}
877883

878-
/// Combines multiple constraints `[c0, ..., cn]` into a single constraint
879-
/// `alpha^alpha0 * c0 + alpha^{alpha0 + 1} * c1 + ... + alpha^{alpha0 + n} * cn`.
880-
pub fn combine_constraints(alpha0: usize, cs: Vec<Self>) -> Self {
881-
let zero = Expr::<ConstantExpr<F>>::zero();
882-
cs.into_iter().zip(alpha0..).map(|(c, i)| {
883-
Expr::Constant(ConstantExpr::Alpha.pow(i)) * c
884-
}).fold(zero, |acc, x| acc + x)
885-
}
886-
887884
/// The expression `beta`.
888885
pub fn beta() -> Self {
889886
Expr::Constant(ConstantExpr::Beta)

circuits/plonk-15-wires/src/gate.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,8 @@ pub enum GateType {
111111
Generic,
112112
/// Poseidon permutation gate
113113
Poseidon,
114-
/// EC addition in Affine form
115-
Add,
116-
/// EC point doubling in Affine form
117-
Double,
114+
/// Complete EC addition in Affine form
115+
CompleteAdd,
118116
/// EC variable base scalar multiplication
119117
Vbmul,
120118
/// EC variable base scalar multiplication with group endomorphim optimization
@@ -406,8 +404,7 @@ impl<F: FftField> CircuitGate<F> {
406404
Zero => Ok(()),
407405
Generic => self.verify_generic(witness),
408406
Poseidon => self.verify_poseidon(witness, cs),
409-
Add => self.verify_add(witness),
410-
Double => self.verify_double(witness),
407+
CompleteAdd => self.verify_complete_add(witness),
411408
Vbmul => self.verify_vbmul(witness),
412409
Endomul => self.verify_endomul(witness, cs),
413410
ChaCha0 | ChaCha1 | ChaCha2 | ChaChaFinal => panic!("todo")

circuits/plonk-15-wires/src/gates/addition.rs

Lines changed: 0 additions & 85 deletions
This file was deleted.

circuits/plonk-15-wires/src/gates/double.rs

Lines changed: 0 additions & 121 deletions
This file was deleted.

circuits/plonk-15-wires/src/gates/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
pub mod addition;
2-
pub mod double;
31
pub mod endosclmul;
42
pub mod generic;
53
pub mod poseidon;

circuits/plonk-15-wires/src/nolookup/constraints.rs

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,7 @@ pub struct ConstraintSystem<F: FftField> {
6969
// -----------------------------------
7070
/// EC point addition constraint selector polynomial
7171
#[serde_as(as = "o1_utils::serialization::SerdeAs")]
72-
pub addm: DP<F>,
73-
/// EC point doubling constraint selector polynomial
74-
#[serde_as(as = "o1_utils::serialization::SerdeAs")]
75-
pub doublem: DP<F>,
72+
pub complete_addm: DP<F>,
7673
/// mulm constraint selector polynomial
7774
#[serde_as(as = "o1_utils::serialization::SerdeAs")]
7875
pub mulm: DP<F>,
@@ -110,15 +107,9 @@ pub struct ConstraintSystem<F: FftField> {
110107

111108
// ECC arithmetic selector polynomials
112109
// -----------------------------------
113-
/// EC point addition selector evaluations w over domain.d4
114-
#[serde_as(as = "o1_utils::serialization::SerdeAs")]
115-
pub addl: E<F, D<F>>,
116-
/// EC point doubling selector evaluations w over domain.d8
117-
#[serde_as(as = "o1_utils::serialization::SerdeAs")]
118-
pub doubl8: E<F, D<F>>,
119-
/// EC point doubling selector evaluations w over domain.d4
110+
/// EC point addition selector evaluations w over domain.d2
120111
#[serde_as(as = "o1_utils::serialization::SerdeAs")]
121-
pub doubl4: E<F, D<F>>,
112+
pub complete_addl4: E<F, D<F>>,
122113
/// scalar multiplication selector evaluations over domain.d8
123114
#[serde_as(as = "o1_utils::serialization::SerdeAs")]
124115
pub mull8: E<F, D<F>>,
@@ -330,13 +321,8 @@ impl<F: FftField + SquareRootField> ConstraintSystem<F> {
330321
.interpolate();
331322

332323
// compute ECC arithmetic constraint polynomials
333-
let addm = E::<F, D<F>>::from_vec_and_domain(
334-
gates.iter().map(|gate| gate.add()).collect(),
335-
domain.d1,
336-
)
337-
.interpolate();
338-
let doublem = E::<F, D<F>>::from_vec_and_domain(
339-
gates.iter().map(|gate| gate.double()).collect(),
324+
let complete_addm = E::<F, D<F>>::from_vec_and_domain(
325+
gates.iter().map(|gate| F::from((gate.typ == GateType::CompleteAdd) as u64)).collect(),
340326
domain.d1,
341327
)
342328
.interpolate();
@@ -423,11 +409,9 @@ impl<F: FftField + SquareRootField> ConstraintSystem<F> {
423409
let ps8 = psm.evaluate_over_domain_by_ref(domain.d8);
424410

425411
// ECC arithmetic constraint polynomials
426-
let addl = addm.evaluate_over_domain_by_ref(domain.d4);
427-
let doubl8 = doublem.evaluate_over_domain_by_ref(domain.d8);
428-
let doubl4 = doublem.evaluate_over_domain_by_ref(domain.d4);
429412
let mull8 = mulm.evaluate_over_domain_by_ref(domain.d8);
430413
let emull = emulm.evaluate_over_domain_by_ref(domain.d8);
414+
let complete_addl4 = complete_addm.evaluate_over_domain_by_ref(domain.d4);
431415

432416
// constant polynomials
433417
let l1 = DP::from_coefficients_slice(&[F::zero(), F::one()])
@@ -497,11 +481,8 @@ impl<F: FftField + SquareRootField> ConstraintSystem<F> {
497481
coefficients8,
498482
ps8,
499483
psm,
500-
addl,
501-
addm,
502-
doubl8,
503-
doubl4,
504-
doublem,
484+
complete_addm,
485+
complete_addl4,
505486
mull8,
506487
mulm,
507488
emull,

0 commit comments

Comments
 (0)