@@ -18,7 +18,7 @@ use num_bigint::{BigInt, Sign};
18
18
use std:: { iter:: successors, sync:: LazyLock } ;
19
19
20
20
use crate :: {
21
- blob:: BLOB_WIDTH ,
21
+ blob:: { BLOB_WIDTH , N_BYTES_U256 } ,
22
22
constants:: { BITS , LIMBS } ,
23
23
} ;
24
24
@@ -103,7 +103,6 @@ impl BarycentricEvaluationConfig {
103
103
ctx : & mut Context < Fr > ,
104
104
blob : & [ U256 ; BLOB_WIDTH ] ,
105
105
challenge_digest : U256 ,
106
- evaluation : U256 ,
107
106
) -> AssignedBarycentricEvaluationConfig {
108
107
// some constants for later use.
109
108
let one = self . scalar . load_constant ( ctx, fe_to_biguint ( & Fr :: one ( ) ) ) ;
@@ -180,57 +179,6 @@ impl BarycentricEvaluationConfig {
180
179
QuantumCell :: Existing ( challenge_crt. truncation . limbs [ 2 ] ) ,
181
180
) ;
182
181
183
- ////////////////////////////////////////////////////////////////////////////////////////
184
- ////////////////////////////////// PRECHECKS y /////////////////////////////////////////
185
- ////////////////////////////////////////////////////////////////////////////////////////
186
- let evaluation_le = self . scalar . range ( ) . gate . assign_witnesses (
187
- ctx,
188
- evaluation
189
- . to_le_bytes ( )
190
- . iter ( )
191
- . map ( |& x| Value :: known ( Fr :: from ( x as u64 ) ) ) ,
192
- ) ;
193
- let evaluation_scalar = Scalar :: from_raw ( evaluation. 0 ) ;
194
- let evaluation_crt = self
195
- . scalar
196
- . load_private ( ctx, Value :: known ( fe_to_biguint ( & evaluation_scalar) . into ( ) ) ) ;
197
- let evaluation_limb1 = self . scalar . range ( ) . gate . inner_product (
198
- ctx,
199
- evaluation_le[ 0 ..11 ]
200
- . iter ( )
201
- . map ( |& x| QuantumCell :: Existing ( x) ) ,
202
- powers_of_256[ 0 ..11 ] . to_vec ( ) ,
203
- ) ;
204
- let evaluation_limb2 = self . scalar . range ( ) . gate . inner_product (
205
- ctx,
206
- evaluation_le[ 11 ..22 ]
207
- . iter ( )
208
- . map ( |& x| QuantumCell :: Existing ( x) ) ,
209
- powers_of_256[ 0 ..11 ] . to_vec ( ) ,
210
- ) ;
211
- let evaluation_limb3 = self . scalar . range ( ) . gate . inner_product (
212
- ctx,
213
- evaluation_le[ 22 ..32 ]
214
- . iter ( )
215
- . map ( |& x| QuantumCell :: Existing ( x) ) ,
216
- powers_of_256[ 0 ..11 ] . to_vec ( ) ,
217
- ) ;
218
- self . scalar . range ( ) . gate . assert_equal (
219
- ctx,
220
- QuantumCell :: Existing ( evaluation_limb1) ,
221
- QuantumCell :: Existing ( evaluation_crt. truncation . limbs [ 0 ] ) ,
222
- ) ;
223
- self . scalar . range ( ) . gate . assert_equal (
224
- ctx,
225
- QuantumCell :: Existing ( evaluation_limb2) ,
226
- QuantumCell :: Existing ( evaluation_crt. truncation . limbs [ 1 ] ) ,
227
- ) ;
228
- self . scalar . range ( ) . gate . assert_equal (
229
- ctx,
230
- QuantumCell :: Existing ( evaluation_limb3) ,
231
- QuantumCell :: Existing ( evaluation_crt. truncation . limbs [ 2 ] ) ,
232
- ) ;
233
-
234
182
////////////////////////////////////////////////////////////////////////////////////////
235
183
////////////////////////////// BARYCENTRIC EVALUATION //////////////////////////////////
236
184
////////////////////////////////////////////////////////////////////////////////////////
@@ -317,9 +265,65 @@ impl BarycentricEvaluationConfig {
317
265
evaluation_computed = self . scalar . mul ( ctx, & evaluation_computed, & factor) ;
318
266
evaluation_computed = self . scalar . carry_mod ( ctx, & evaluation_computed) ;
319
267
320
- // computed evaluation matches the expected evaluation.
321
- self . scalar
322
- . assert_equal ( ctx, & evaluation_computed, & evaluation_crt) ;
268
+ ////////////////////////////////////////////////////////////////////////////////////////
269
+ ////////////////////////////////// PRECHECKS y /////////////////////////////////////////
270
+ ////////////////////////////////////////////////////////////////////////////////////////
271
+ let evaluation_le_bytes = evaluation_computed
272
+ . value
273
+ . map ( |x| {
274
+ x. to_bytes_le ( )
275
+ . 1
276
+ . into_iter ( )
277
+ . chain ( std:: iter:: repeat ( 0u8 ) )
278
+ . map ( u64:: from)
279
+ . map ( Fr :: from)
280
+ . take ( N_BYTES_U256 )
281
+ . collect_vec ( )
282
+ } )
283
+ . transpose_vec ( N_BYTES_U256 ) ;
284
+
285
+ let evaluation_le = self
286
+ . scalar
287
+ . range ( )
288
+ . gate
289
+ . assign_witnesses ( ctx, evaluation_le_bytes) ;
290
+
291
+ let evaluation_limb1 = self . scalar . range ( ) . gate . inner_product (
292
+ ctx,
293
+ evaluation_le[ 0 ..11 ]
294
+ . iter ( )
295
+ . map ( |& x| QuantumCell :: Existing ( x) ) ,
296
+ powers_of_256[ 0 ..11 ] . to_vec ( ) ,
297
+ ) ;
298
+ let evaluation_limb2 = self . scalar . range ( ) . gate . inner_product (
299
+ ctx,
300
+ evaluation_le[ 11 ..22 ]
301
+ . iter ( )
302
+ . map ( |& x| QuantumCell :: Existing ( x) ) ,
303
+ powers_of_256[ 0 ..11 ] . to_vec ( ) ,
304
+ ) ;
305
+ let evaluation_limb3 = self . scalar . range ( ) . gate . inner_product (
306
+ ctx,
307
+ evaluation_le[ 22 ..32 ]
308
+ . iter ( )
309
+ . map ( |& x| QuantumCell :: Existing ( x) ) ,
310
+ powers_of_256[ 0 ..11 ] . to_vec ( ) ,
311
+ ) ;
312
+ self . scalar . range ( ) . gate . assert_equal (
313
+ ctx,
314
+ QuantumCell :: Existing ( evaluation_limb1) ,
315
+ QuantumCell :: Existing ( evaluation_computed. truncation . limbs [ 0 ] ) ,
316
+ ) ;
317
+ self . scalar . range ( ) . gate . assert_equal (
318
+ ctx,
319
+ QuantumCell :: Existing ( evaluation_limb2) ,
320
+ QuantumCell :: Existing ( evaluation_computed. truncation . limbs [ 1 ] ) ,
321
+ ) ;
322
+ self . scalar . range ( ) . gate . assert_equal (
323
+ ctx,
324
+ QuantumCell :: Existing ( evaluation_limb3) ,
325
+ QuantumCell :: Existing ( evaluation_computed. truncation . limbs [ 2 ] ) ,
326
+ ) ;
323
327
324
328
////////////////////////////////////////////////////////////////////////////////////////
325
329
////////////////////////////////////// EXPORT //////////////////////////////////////////
0 commit comments