3
3
use super :: * ;
4
4
use crate :: param:: ConfigParams as BatchCircuitConfigParams ;
5
5
use halo2_proofs:: {
6
- circuit:: { Layouter , SimpleFloorPlanner , Value } ,
6
+ circuit:: { Cell , Layouter , SimpleFloorPlanner , Value } ,
7
7
poly:: { commitment:: ParamsProver , kzg:: commitment:: ParamsKZG } ,
8
8
} ;
9
9
use snark_verifier:: {
@@ -26,9 +26,9 @@ use sv_halo2_base::{
26
26
gates:: GateInstructions , halo2_proofs, AssignedValue , Context , ContextParams ,
27
27
QuantumCell :: Existing ,
28
28
} ;
29
+
29
30
type Svk = KzgSuccinctVerifyingKey < G1Affine > ;
30
31
type Pcs = Kzg < Bn256 , Bdfg21 > ;
31
-
32
32
type As = KzgAs < Pcs > ;
33
33
34
34
fn select_accumulator < ' a > (
@@ -80,8 +80,6 @@ pub struct RecursionCircuit<ST> {
80
80
impl < ST : StateTransition > RecursionCircuit < ST > {
81
81
const PREPROCESSED_DIGEST_ROW : usize = 4 * LIMBS ;
82
82
const INITIAL_STATE_ROW : usize = Self :: PREPROCESSED_DIGEST_ROW + 1 ;
83
- //const STATE_ROW: usize = Self::INITIAL_STATE_ROW + ST;
84
- //const ROUND_ROW: usize = Self::STATE_ROW + ST;
85
83
86
84
pub fn new (
87
85
params : & ParamsKZG < Bn256 > ,
@@ -90,7 +88,6 @@ impl<ST: StateTransition> RecursionCircuit<ST> {
90
88
rng : impl Rng + Send ,
91
89
round : usize ,
92
90
) -> Self {
93
-
94
91
let svk = params. get_g ( ) [ 0 ] . into ( ) ;
95
92
let default_accumulator = KzgAccumulator :: new ( params. get_g ( ) [ 1 ] , params. get_g ( ) [ 0 ] ) ;
96
93
@@ -122,20 +119,26 @@ impl<ST: StateTransition> RecursionCircuit<ST> {
122
119
123
120
let init_instances = if round > 0 {
124
121
// pick from prev snark
125
- Vec :: from ( & previous. instances [ 0 ] [
126
- Self :: INITIAL_STATE_ROW ..Self :: INITIAL_STATE_ROW +ST :: num_transition_instance ( )
127
- ] )
122
+ Vec :: from (
123
+ & previous. instances [ 0 ] [ Self :: INITIAL_STATE_ROW
124
+ ..Self :: INITIAL_STATE_ROW + ST :: num_transition_instance ( ) ] ,
125
+ )
128
126
} else {
129
127
// pick from app
130
128
ST :: state_prev_indices ( )
131
- . into_iter ( ) . map ( |i|app. instances [ 0 ] [ i] )
132
- . collect :: < Vec < _ > > ( )
129
+ . into_iter ( )
130
+ . map ( |i| app. instances [ 0 ] [ i] )
131
+ . collect :: < Vec < _ > > ( )
133
132
} ;
134
133
135
134
let state_instances = ST :: state_indices ( )
136
- . into_iter ( ) . map ( |i|& app. instances [ 0 ] [ i] )
137
- . chain ( ST :: additional_indices ( ) . into_iter ( )
138
- . map ( |i|& app. instances [ 0 ] [ i] ) ) ;
135
+ . into_iter ( )
136
+ . map ( |i| & app. instances [ 0 ] [ i] )
137
+ . chain (
138
+ ST :: additional_indices ( )
139
+ . into_iter ( )
140
+ . map ( |i| & app. instances [ 0 ] [ i] ) ,
141
+ ) ;
139
142
140
143
let preprocessed_digest = {
141
144
let inputs = previous
@@ -150,6 +153,7 @@ impl<ST: StateTransition> RecursionCircuit<ST> {
150
153
hasher. update ( & inputs) ;
151
154
hasher. squeeze ( )
152
155
} ;
156
+
153
157
let instances = [
154
158
accumulator. lhs . x ,
155
159
accumulator. lhs . y ,
@@ -179,17 +183,6 @@ impl<ST: StateTransition> RecursionCircuit<ST> {
179
183
}
180
184
}
181
185
182
- // fn initial_snark(params: &ParamsKZG<Bn256>, vk: Option<&VerifyingKey<G1Affine>>) -> Snark {
183
- // let mut snark = gen_dummy_snark::<RecursionCircuit>(params, vk);
184
- // let g = params.get_g();
185
- // snark.instances = vec![[g[1].x, g[1].y, g[0].x, g[0].y]
186
- // .into_iter()
187
- // .flat_map(fe_to_limbs::<_, _, LIMBS, BITS>)
188
- // .chain([Fr::ZERO; 4])
189
- // .collect_vec()];
190
- // snark
191
- // }
192
-
193
186
fn as_proof ( & self ) -> Value < & [ u8 ] > {
194
187
self . as_proof . as_ref ( ) . map ( Vec :: as_slice)
195
188
}
@@ -209,7 +202,7 @@ impl<ST: StateTransition> RecursionCircuit<ST> {
209
202
Ok ( KzgAccumulator :: new ( lhs, rhs) )
210
203
}
211
204
212
- /// get the number of instance, help to refine the CircuitExt trait
205
+ /// Returns the number of instance cells in the Recursion Circuit , help to refine the CircuitExt trait
213
206
pub fn num_instance_fixed ( ) -> usize {
214
207
// [..lhs, ..rhs, preprocessed_digest, initial_state, state, round]
215
208
4 * LIMBS + 2 * ST :: num_transition_instance ( ) + ST :: num_additional_instance ( ) + 2
@@ -255,13 +248,12 @@ impl<ST: StateTransition> Circuit<Fr> for RecursionCircuit<ST> {
255
248
let main_gate = config. gate ( ) ;
256
249
257
250
let mut first_pass = halo2_base:: SKIP_FIRST_PASS ; // assume using simple floor planner
258
- let mut assigned_instances = Vec :: new ( ) ;
259
- layouter. assign_region (
251
+ let assigned_instances = layouter. assign_region (
260
252
|| "" ,
261
- |region| {
253
+ |region| -> Result < Vec < Cell > , Error > {
262
254
if first_pass {
263
255
first_pass = false ;
264
- return Ok ( ( ) ) ;
256
+ return Ok ( vec ! [ ] ) ;
265
257
}
266
258
let mut ctx = Context :: new (
267
259
region,
@@ -324,14 +316,14 @@ impl<ST: StateTransition> Circuit<Fr> for RecursionCircuit<ST> {
324
316
Some ( preprocessed_digest) ,
325
317
) ;
326
318
327
- let default_accmulator = self . load_default_accumulator ( & loader) ?;
319
+ let default_accumulator = self . load_default_accumulator ( & loader) ?;
328
320
let previous_accumulators = previous_accumulators
329
321
. iter ( )
330
322
. map ( |previous_accumulator| {
331
323
select_accumulator (
332
324
& loader,
333
325
& first_round,
334
- & default_accmulator ,
326
+ & default_accumulator ,
335
327
previous_accumulator,
336
328
)
337
329
} )
@@ -353,7 +345,9 @@ impl<ST: StateTransition> Circuit<Fr> for RecursionCircuit<ST> {
353
345
. iter ( )
354
346
. zip_eq ( previous_instances[ init_state_row_beg..state_row_beg] . iter ( ) )
355
347
. zip_eq (
356
- ST :: state_prev_indices ( ) . into_iter ( ) . map ( |i|& app_instances[ i] )
348
+ ST :: state_prev_indices ( )
349
+ . into_iter ( )
350
+ . map ( |i| & app_instances[ i] ) ,
357
351
)
358
352
. flat_map ( |( ( & st, & previous_st) , & app_inst) | {
359
353
[
@@ -375,10 +369,14 @@ impl<ST: StateTransition> Circuit<Fr> for RecursionCircuit<ST> {
375
369
let verify_app_state = state
376
370
. iter ( )
377
371
. zip_eq (
378
- ST :: state_indices ( ) . into_iter ( ) . map ( |i|& app_instances[ i] )
379
- . chain (
380
- ST :: additional_indices ( ) . into_iter ( ) . map ( |i|& app_instances[ i] )
381
- )
372
+ ST :: state_indices ( )
373
+ . into_iter ( )
374
+ . map ( |i| & app_instances[ i] )
375
+ . chain (
376
+ ST :: additional_indices ( )
377
+ . into_iter ( )
378
+ . map ( |i| & app_instances[ i] ) ,
379
+ ) ,
382
380
)
383
381
. map ( |( & st, & app_inst) | ( st, app_inst) )
384
382
. collect :: < Vec < _ > > ( ) ;
@@ -387,7 +385,9 @@ impl<ST: StateTransition> Circuit<Fr> for RecursionCircuit<ST> {
387
385
let verify_app_init_state = previous_instances[ state_row_beg..addition_state_beg]
388
386
. iter ( )
389
387
. zip_eq (
390
- ST :: state_prev_indices ( ) . into_iter ( ) . map ( |i|& app_instances[ i] )
388
+ ST :: state_prev_indices ( )
389
+ . into_iter ( )
390
+ . map ( |i| & app_instances[ i] ) ,
391
391
)
392
392
. map ( |( & st, & app_inst) | {
393
393
(
@@ -432,17 +432,15 @@ impl<ST: StateTransition> Circuit<Fr> for RecursionCircuit<ST> {
432
432
#[ cfg( feature = "display" ) ]
433
433
println ! ( "Advice columns used: {}" , ctx. advice_alloc[ 0 ] [ 0 ] . 0 + 1 ) ;
434
434
435
- assigned_instances. extend (
436
- [ lhs. x ( ) , lhs. y ( ) , rhs. x ( ) , rhs. y ( ) ]
437
- . into_iter ( )
438
- . flat_map ( |coordinate| coordinate. limbs ( ) )
439
- . chain ( iter:: once ( & preprocessed_digest) )
440
- . chain ( initial_state. iter ( ) )
441
- . chain ( state. iter ( ) )
442
- . chain ( iter:: once ( & round) )
443
- . map ( |assigned| assigned. cell ( ) ) ,
444
- ) ;
445
- Ok ( ( ) )
435
+ Ok ( [ lhs. x ( ) , lhs. y ( ) , rhs. x ( ) , rhs. y ( ) ]
436
+ . into_iter ( )
437
+ . flat_map ( |coordinate| coordinate. limbs ( ) )
438
+ . chain ( iter:: once ( & preprocessed_digest) )
439
+ . chain ( initial_state. iter ( ) )
440
+ . chain ( state. iter ( ) )
441
+ . chain ( iter:: once ( & round) )
442
+ . map ( |assigned| assigned. cell ( ) )
443
+ . collect ( ) )
446
444
} ,
447
445
) ?;
448
446
0 commit comments