@@ -68,141 +68,131 @@ impl Config {
68
68
}
69
69
70
70
pub ( crate ) fn create_gate < F : FieldExt > ( & self , meta : & mut ConstraintSystem < F > ) {
71
- let q_add = meta. query_selector ( self . q_add , Rotation :: cur ( ) ) ;
72
- let x_p = meta. query_advice ( self . x_p , Rotation :: cur ( ) ) ;
73
- let y_p = meta. query_advice ( self . y_p , Rotation :: cur ( ) ) ;
74
- let x_q = meta. query_advice ( self . x_qr , Rotation :: cur ( ) ) ;
75
- let y_q = meta. query_advice ( self . y_qr , Rotation :: cur ( ) ) ;
76
- let x_r = meta. query_advice ( self . x_qr , Rotation :: next ( ) ) ;
77
- let y_r = meta. query_advice ( self . y_qr , Rotation :: next ( ) ) ;
78
- let lambda = meta. query_advice ( self . lambda , Rotation :: cur ( ) ) ;
79
-
80
- // α = inv0(x_q - x_p)
81
- let alpha = meta. query_advice ( self . alpha , Rotation :: cur ( ) ) ;
82
- // β = inv0(x_p)
83
- let beta = meta. query_advice ( self . beta , Rotation :: cur ( ) ) ;
84
- // γ = inv0(x_q)
85
- let gamma = meta. query_advice ( self . gamma , Rotation :: cur ( ) ) ;
86
- // δ = inv0(y_p + y_q) if x_q = x_p, 0 otherwise
87
- let delta = meta. query_advice ( self . delta , Rotation :: cur ( ) ) ;
88
-
89
- // Useful composite expressions
90
- // α ⋅(x_q - x_p)
91
- let if_alpha = ( x_q. clone ( ) - x_p. clone ( ) ) * alpha;
92
- // β ⋅ x_p
93
- let if_beta = x_p. clone ( ) * beta;
94
- // γ ⋅ x_q
95
- let if_gamma = x_q. clone ( ) * gamma;
96
- // δ ⋅(y_p + y_q)
97
- let if_delta = ( y_q. clone ( ) + y_p. clone ( ) ) * delta;
98
-
99
- // Useful constants
100
- let one = Expression :: Constant ( F :: one ( ) ) ;
101
- let two = Expression :: Constant ( F :: from_u64 ( 2 ) ) ;
102
- let three = Expression :: Constant ( F :: from_u64 ( 3 ) ) ;
103
-
104
- // Handle cases in incomplete addition
105
- {
106
- meta. create_gate (
107
- "(x_q − x_p)⋅((x_q − x_p)⋅λ − (y_q−y_p))=0" ,
108
- |_| {
109
- let x_q_minus_x_p = x_q. clone ( ) - x_p. clone ( ) ; // (x_q − x_p)
110
-
111
- let y_q_minus_y_p = y_q. clone ( ) - y_p. clone ( ) ; // (y_q − y_p)
112
- let incomplete = x_q_minus_x_p. clone ( ) * lambda. clone ( ) - y_q_minus_y_p; // (x_q − x_p)⋅λ − (y_q−y_p)
113
-
114
- // q_add ⋅(x_q − x_p)⋅((x_q − x_p)⋅λ − (y_q−y_p))
115
- q_add. clone ( ) * x_q_minus_x_p * incomplete
116
- } ,
117
- ) ;
118
-
119
- meta. create_gate ( "(1 - (x_q - x_p)⋅α)⋅(2y_p ⋅λ - 3x_p^2) = 0" , |_| {
71
+ meta. create_gate ( "complete addition gates" , |meta| {
72
+ let q_add = meta. query_selector ( self . q_add , Rotation :: cur ( ) ) ;
73
+ let x_p = meta. query_advice ( self . x_p , Rotation :: cur ( ) ) ;
74
+ let y_p = meta. query_advice ( self . y_p , Rotation :: cur ( ) ) ;
75
+ let x_q = meta. query_advice ( self . x_qr , Rotation :: cur ( ) ) ;
76
+ let y_q = meta. query_advice ( self . y_qr , Rotation :: cur ( ) ) ;
77
+ let x_r = meta. query_advice ( self . x_qr , Rotation :: next ( ) ) ;
78
+ let y_r = meta. query_advice ( self . y_qr , Rotation :: next ( ) ) ;
79
+ let lambda = meta. query_advice ( self . lambda , Rotation :: cur ( ) ) ;
80
+
81
+ // α = inv0(x_q - x_p)
82
+ let alpha = meta. query_advice ( self . alpha , Rotation :: cur ( ) ) ;
83
+ // β = inv0(x_p)
84
+ let beta = meta. query_advice ( self . beta , Rotation :: cur ( ) ) ;
85
+ // γ = inv0(x_q)
86
+ let gamma = meta. query_advice ( self . gamma , Rotation :: cur ( ) ) ;
87
+ // δ = inv0(y_p + y_q) if x_q = x_p, 0 otherwise
88
+ let delta = meta. query_advice ( self . delta , Rotation :: cur ( ) ) ;
89
+
90
+ // Useful composite expressions
91
+ // α ⋅(x_q - x_p)
92
+ let if_alpha = ( x_q. clone ( ) - x_p. clone ( ) ) * alpha;
93
+ // β ⋅ x_p
94
+ let if_beta = x_p. clone ( ) * beta;
95
+ // γ ⋅ x_q
96
+ let if_gamma = x_q. clone ( ) * gamma;
97
+ // δ ⋅(y_p + y_q)
98
+ let if_delta = ( y_q. clone ( ) + y_p. clone ( ) ) * delta;
99
+
100
+ // Useful constants
101
+ let one = Expression :: Constant ( F :: one ( ) ) ;
102
+ let two = Expression :: Constant ( F :: from_u64 ( 2 ) ) ;
103
+ let three = Expression :: Constant ( F :: from_u64 ( 3 ) ) ;
104
+
105
+ // (x_q − x_p)⋅((x_q − x_p)⋅λ − (y_q−y_p)) = 0
106
+ let poly1 = {
107
+ let x_q_minus_x_p = x_q. clone ( ) - x_p. clone ( ) ; // (x_q − x_p)
108
+
109
+ let y_q_minus_y_p = y_q. clone ( ) - y_p. clone ( ) ; // (y_q − y_p)
110
+ let incomplete = x_q_minus_x_p. clone ( ) * lambda. clone ( ) - y_q_minus_y_p; // (x_q − x_p)⋅λ − (y_q−y_p)
111
+
112
+ // q_add ⋅(x_q − x_p)⋅((x_q − x_p)⋅λ − (y_q−y_p))
113
+ x_q_minus_x_p * incomplete
114
+ } ;
115
+
116
+ // (1 - (x_q - x_p)⋅α)⋅(2y_p ⋅λ - 3x_p^2) = 0
117
+ let poly2 = {
120
118
let three_x_p_sq = three * x_p. clone ( ) * x_p. clone ( ) ; // 3x_p^2
121
- let two_y_p = two. clone ( ) * y_p. clone ( ) ; // 2y_p
119
+ let two_y_p = two * y_p. clone ( ) ; // 2y_p
122
120
let tangent_line = two_y_p * lambda. clone ( ) - three_x_p_sq; // (2y_p ⋅λ - 3x_p^2)
123
121
124
122
// q_add ⋅(1 - (x_q - x_p)⋅α)⋅(2y_p ⋅λ - 3x_p^2)
125
- q_add. clone ( ) * ( one. clone ( ) - if_alpha. clone ( ) ) * tangent_line
126
- } ) ;
127
-
128
- meta. create_gate (
129
- "x_p⋅x_q⋅(x_q - x_p)⋅(λ^2 - x_p - x_q - x_r) = 0" ,
130
- |_| {
131
- let x_q_minus_x_p = x_q. clone ( ) - x_p. clone ( ) ; // (x_q - x_p)
132
- let secant_line =
133
- lambda. clone ( ) * lambda. clone ( ) - x_p. clone ( ) - x_q. clone ( ) - x_r. clone ( ) ; // (λ^2 - x_p - x_q - x_r)
134
-
135
- // q_add ⋅ x_p⋅x_q⋅(x_q - x_p)⋅(λ^2 - x_p - x_q - x_r)
136
- q_add. clone ( ) * x_p. clone ( ) * x_q. clone ( ) * x_q_minus_x_p * secant_line
137
- } ,
138
- ) ;
139
-
140
- meta. create_gate (
141
- "x_p⋅x_q⋅(x_q - x_p)⋅(λ ⋅(x_p - x_r) - y_p - y_r) = 0" ,
142
- |_| {
143
- let x_q_minus_x_p = x_q. clone ( ) - x_p. clone ( ) ; // (x_q - x_p)
144
- let x_p_minus_x_r = x_p. clone ( ) - x_r. clone ( ) ; // (x_p - x_r)
145
-
146
- // q_add ⋅ x_p⋅x_q⋅(x_q - x_p)⋅(λ ⋅(x_p - x_r) - y_p - y_r)
147
- q_add. clone ( )
148
- * x_p. clone ( )
149
- * x_q. clone ( )
150
- * x_q_minus_x_p
151
- * ( lambda. clone ( ) * x_p_minus_x_r - y_p. clone ( ) - y_r. clone ( ) )
152
- } ,
153
- ) ;
154
-
155
- meta. create_gate (
156
- "x_p⋅x_q⋅(y_q + y_p)⋅(λ^2 - x_p - x_q - x_r) = 0" ,
157
- |_| {
158
- let y_q_plus_y_p = y_q. clone ( ) + y_p. clone ( ) ; // (y_q + y_p)
159
- let incomplete =
160
- lambda. clone ( ) * lambda. clone ( ) - x_p. clone ( ) - x_q. clone ( ) - x_r. clone ( ) ; // (λ^2 - x_p - x_q - x_r)
161
-
162
- // q_add ⋅ x_p⋅x_q⋅(y_q + y_p)⋅(λ^2 - x_p - x_q - x_r)
163
- q_add. clone ( ) * x_p. clone ( ) * x_q. clone ( ) * y_q_plus_y_p * incomplete
164
- } ,
165
- ) ;
166
-
167
- meta. create_gate (
168
- "x_p⋅x_q⋅(y_q + y_p)⋅(λ ⋅(x_p - x_r) - y_p - y_r) = 0" ,
169
- |_| {
170
- let y_q_plus_y_p = y_q. clone ( ) + y_p. clone ( ) ; // (y_q + y_p)
171
- let x_p_minus_x_r = x_p. clone ( ) - x_r. clone ( ) ; // (x_p - x_r)
172
-
173
- // q_add ⋅ x_p⋅x_q⋅(y_q + y_p)⋅(λ ⋅(x_p - x_r) - y_p - y_r)
174
- q_add. clone ( )
175
- * x_p. clone ( )
176
- * x_q. clone ( )
177
- * y_q_plus_y_p
178
- * ( lambda. clone ( ) * x_p_minus_x_r - y_p. clone ( ) - y_r. clone ( ) )
179
- } ,
180
- ) ;
181
-
182
- meta. create_gate ( "(1 - x_p * β) * (x_r - x_q) = 0" , |_| {
183
- q_add. clone ( ) * ( one. clone ( ) - if_beta. clone ( ) ) * ( x_r. clone ( ) - x_q. clone ( ) )
184
- } ) ;
185
-
186
- meta. create_gate ( "(1 - x_p * β) * (y_r - y_q) = 0" , |_| {
187
- q_add. clone ( ) * ( one. clone ( ) - if_beta) * ( y_r. clone ( ) - y_q. clone ( ) )
188
- } ) ;
189
-
190
- meta. create_gate ( "(1 - x_q * γ) * (x_r - x_p) = 0" , |_| {
191
- q_add. clone ( ) * ( one. clone ( ) - if_gamma. clone ( ) ) * ( x_r. clone ( ) - x_p. clone ( ) )
192
- } ) ;
193
-
194
- meta. create_gate ( "(1 - x_q * γ) * (y_r - y_p) = 0" , |_| {
195
- q_add. clone ( ) * ( one. clone ( ) - if_gamma) * ( y_r. clone ( ) - y_p. clone ( ) )
196
- } ) ;
197
-
198
- meta. create_gate ( "((1 - (x_q - x_p) * α - (y_q + y_p) * δ)) * x_r" , |_| {
199
- q_add. clone ( ) * ( one. clone ( ) - if_alpha. clone ( ) - if_delta. clone ( ) ) * x_r. clone ( )
200
- } ) ;
201
-
202
- meta. create_gate ( "((1 - (x_q - x_p) * α - (y_q + y_p) * δ)) * y_r" , |_| {
203
- q_add * ( one - if_alpha - if_delta) * y_r
204
- } ) ;
205
- }
123
+ ( one. clone ( ) - if_alpha. clone ( ) ) * tangent_line
124
+ } ;
125
+
126
+ // x_p⋅x_q⋅(x_q - x_p)⋅(λ^2 - x_p - x_q - x_r) = 0
127
+ let poly3 = {
128
+ let x_q_minus_x_p = x_q. clone ( ) - x_p. clone ( ) ; // (x_q - x_p)
129
+ let secant_line =
130
+ lambda. clone ( ) * lambda. clone ( ) - x_p. clone ( ) - x_q. clone ( ) - x_r. clone ( ) ; // (λ^2 - x_p - x_q - x_r)
131
+
132
+ // x_p⋅x_q⋅(x_q - x_p)⋅(λ^2 - x_p - x_q - x_r)
133
+ x_p. clone ( ) * x_q. clone ( ) * x_q_minus_x_p * secant_line
134
+ } ;
135
+
136
+ // x_p⋅x_q⋅(x_q - x_p)⋅(λ ⋅(x_p - x_r) - y_p - y_r) = 0
137
+ let poly4 = {
138
+ let x_q_minus_x_p = x_q. clone ( ) - x_p. clone ( ) ; // (x_q - x_p)
139
+ let x_p_minus_x_r = x_p. clone ( ) - x_r. clone ( ) ; // (x_p - x_r)
140
+
141
+ // x_p⋅x_q⋅(x_q - x_p)⋅(λ ⋅(x_p - x_r) - y_p - y_r)
142
+ x_p. clone ( )
143
+ * x_q. clone ( )
144
+ * x_q_minus_x_p
145
+ * ( lambda. clone ( ) * x_p_minus_x_r - y_p. clone ( ) - y_r. clone ( ) )
146
+ } ;
147
+
148
+ // x_p⋅x_q⋅(y_q + y_p)⋅(λ^2 - x_p - x_q - x_r) = 0
149
+ let poly5 = {
150
+ let y_q_plus_y_p = y_q. clone ( ) + y_p. clone ( ) ; // (y_q + y_p)
151
+ let incomplete =
152
+ lambda. clone ( ) * lambda. clone ( ) - x_p. clone ( ) - x_q. clone ( ) - x_r. clone ( ) ; // (λ^2 - x_p - x_q - x_r)
153
+
154
+ // x_p⋅x_q⋅(y_q + y_p)⋅(λ^2 - x_p - x_q - x_r)
155
+ x_p. clone ( ) * x_q. clone ( ) * y_q_plus_y_p * incomplete
156
+ } ;
157
+
158
+ // x_p⋅x_q⋅(y_q + y_p)⋅(λ ⋅(x_p - x_r) - y_p - y_r) = 0
159
+ let poly6 = {
160
+ let y_q_plus_y_p = y_q. clone ( ) + y_p. clone ( ) ; // (y_q + y_p)
161
+ let x_p_minus_x_r = x_p. clone ( ) - x_r. clone ( ) ; // (x_p - x_r)
162
+
163
+ // x_p⋅x_q⋅(y_q + y_p)⋅(λ ⋅(x_p - x_r) - y_p - y_r)
164
+ x_p. clone ( )
165
+ * x_q. clone ( )
166
+ * y_q_plus_y_p
167
+ * ( lambda * x_p_minus_x_r - y_p. clone ( ) - y_r. clone ( ) )
168
+ } ;
169
+
170
+ // (1 - x_p * β) * (x_r - x_q) = 0
171
+ let poly7 = ( one. clone ( ) - if_beta. clone ( ) ) * ( x_r. clone ( ) - x_q) ;
172
+
173
+ // (1 - x_p * β) * (y_r - y_q) = 0
174
+ let poly8 = ( one. clone ( ) - if_beta) * ( y_r. clone ( ) - y_q) ;
175
+
176
+ // (1 - x_q * γ) * (x_r - x_p) = 0
177
+ let poly9 = ( one. clone ( ) - if_gamma. clone ( ) ) * ( x_r. clone ( ) - x_p) ;
178
+
179
+ // (1 - x_q * γ) * (y_r - y_p) = 0
180
+ let poly10 = ( one. clone ( ) - if_gamma) * ( y_r. clone ( ) - y_p) ;
181
+
182
+ // ((1 - (x_q - x_p) * α - (y_q + y_p) * δ)) * x_r
183
+ let poly11 = ( one. clone ( ) - if_alpha. clone ( ) - if_delta. clone ( ) ) * x_r;
184
+
185
+ // ((1 - (x_q - x_p) * α - (y_q + y_p) * δ)) * y_r
186
+ let poly12 = ( one - if_alpha - if_delta) * y_r;
187
+
188
+ [
189
+ poly1, poly2, poly3, poly4, poly5, poly6, poly7, poly8, poly9, poly10, poly11,
190
+ poly12,
191
+ ]
192
+ . iter ( )
193
+ . map ( |poly| q_add. clone ( ) * poly. clone ( ) )
194
+ . collect ( )
195
+ } ) ;
206
196
}
207
197
208
198
pub ( super ) fn assign_region < C : CurveAffine > (
@@ -406,6 +396,7 @@ pub mod tests {
406
396
407
397
use crate :: circuit:: gadget:: ecc:: { EccInstructions , Point } ;
408
398
399
+ #[ allow( clippy:: too_many_arguments) ]
409
400
pub fn test_add < C : CurveAffine , EccChip : EccInstructions < C > + Clone + Eq + std:: fmt:: Debug > (
410
401
chip : EccChip ,
411
402
mut layouter : impl Layouter < C :: Base > ,
@@ -467,7 +458,7 @@ pub mod tests {
467
458
// (x, y) + ((ζ^2)x, -y)
468
459
let endo_2_p_neg = ( -p_val) . to_curve ( ) . endo ( ) . endo ( ) ;
469
460
let endo_2_p_neg = Point :: new (
470
- chip. clone ( ) ,
461
+ chip,
471
462
layouter. namespace ( || "point" ) ,
472
463
Some ( endo_2_p_neg. to_affine ( ) ) ,
473
464
) ?;
0 commit comments