@@ -20,70 +20,87 @@ use rand::rngs::OsRng;
20
20
21
21
#[ ignore = "Due to high memory requirement" ]
22
22
#[ test]
23
- fn test_root_circuit ( ) {
24
- let ( params, protocol, proof , instance , rwtable_columns) = {
23
+ fn test_root_circuit_multiple_chunk ( ) {
24
+ let ( params, protocol, proofs , instances , rwtable_columns) = {
25
25
// Preprocess
26
26
const TEST_MOCK_RANDOMNESS : u64 = 0x100 ;
27
27
let circuits_params = FixedCParams {
28
- total_chunks : 1 ,
28
+ total_chunks : 3 ,
29
29
max_txs : 1 ,
30
30
max_withdrawals : 5 ,
31
31
max_calldata : 32 ,
32
- max_rws : 256 ,
32
+ max_rws : 100 ,
33
33
max_copy_rows : 256 ,
34
34
max_exp_steps : 256 ,
35
35
max_bytecode : 512 ,
36
- max_evm_rows : 0 ,
36
+ max_evm_rows : 1 << 12 ,
37
37
max_keccak_rows : 0 ,
38
38
} ;
39
- let ( k, circuit , instance , _) =
39
+ let ( k, circuits , instances , _) =
40
40
SuperCircuit :: < _ > :: build ( block_1tx ( ) , circuits_params, TEST_MOCK_RANDOMNESS . into ( ) )
41
41
. unwrap ( ) ;
42
+ assert ! ( circuits. len( ) > 0 ) ;
43
+ assert ! ( circuits. len( ) == instances. len( ) ) ;
42
44
43
45
// get chronological_rwtable and byaddr_rwtable columns index
44
46
let mut cs = ConstraintSystem :: default ( ) ;
45
- let config = SuperCircuit :: configure_with_params ( & mut cs, circuit . params ( ) ) ;
47
+ let config = SuperCircuit :: configure_with_params ( & mut cs, circuits [ 0 ] . params ( ) ) ;
46
48
let rwtable_columns = config. get_rwtable_columns ( ) ;
47
49
48
50
let params = ParamsKZG :: < Bn256 > :: setup ( k, OsRng ) ;
49
- let pk = keygen_pk ( & params, keygen_vk ( & params, & circuit) . unwrap ( ) , & circuit) . unwrap ( ) ;
51
+ let pk = keygen_pk (
52
+ & params,
53
+ keygen_vk ( & params, & circuits[ 0 ] ) . unwrap ( ) ,
54
+ & circuits[ 0 ] ,
55
+ )
56
+ . unwrap ( ) ;
50
57
let protocol = compile (
51
58
& params,
52
59
pk. get_vk ( ) ,
53
60
Config :: kzg ( )
54
- . with_num_instance ( instance . iter ( ) . map ( |instance| instance. len ( ) ) . collect ( ) ) ,
61
+ . with_num_instance ( instances [ 0 ] . iter ( ) . map ( |instance| instance. len ( ) ) . collect ( ) ) ,
55
62
) ;
56
63
57
- // Create proof
58
- let proof = {
59
- let mut transcript = PoseidonTranscript :: new ( Vec :: new ( ) ) ;
60
- create_proof :: < KZGCommitmentScheme < _ > , ProverGWC < _ > , _ , _ , _ , _ > (
61
- & params,
62
- & pk,
63
- & [ circuit] ,
64
- & [ & instance. iter ( ) . map ( Vec :: as_slice) . collect_vec ( ) ] ,
65
- OsRng ,
66
- & mut transcript,
67
- )
68
- . unwrap ( ) ;
69
- transcript. finalize ( )
70
- } ;
71
-
72
- ( params, protocol, proof, instance, rwtable_columns)
64
+ let proofs: Vec < Vec < u8 > > = circuits
65
+ . into_iter ( )
66
+ . zip ( instances. iter ( ) )
67
+ . map ( |( circuit, instance) | {
68
+ // Create proof
69
+ let proof = {
70
+ let mut transcript = PoseidonTranscript :: new ( Vec :: new ( ) ) ;
71
+ create_proof :: < KZGCommitmentScheme < _ > , ProverGWC < _ > , _ , _ , _ , _ > (
72
+ & params,
73
+ & pk,
74
+ & [ circuit] ,
75
+ & [ & instance. iter ( ) . map ( Vec :: as_slice) . collect_vec ( ) ] ,
76
+ OsRng ,
77
+ & mut transcript,
78
+ )
79
+ . unwrap ( ) ;
80
+ transcript. finalize ( )
81
+ } ;
82
+ proof
83
+ } )
84
+ . collect ( ) ;
85
+ ( params, protocol, proofs, instances, rwtable_columns)
73
86
} ;
74
87
75
88
let user_challenge = UserChallenge {
76
89
column_indexes : rwtable_columns,
77
90
num_challenges : 2 , // alpha, gamma
78
91
} ;
92
+ let snark_witnesses: Vec < _ > = proofs
93
+ . iter ( )
94
+ . zip ( instances. iter ( ) )
95
+ . map ( |( proof, instance) | {
96
+ SnarkWitness :: new ( & protocol, Value :: known ( & instance) , Value :: known ( & proof) )
97
+ } )
98
+ . collect ( ) ;
99
+
79
100
let root_circuit = RootCircuit :: < Bn256 , Gwc < _ > > :: new (
80
101
& params,
81
102
& protocol,
82
- vec ! [ SnarkWitness :: new(
83
- & protocol,
84
- Value :: known( & instance) ,
85
- Value :: known( & proof) ,
86
- ) ] ,
103
+ snark_witnesses,
87
104
Some ( & user_challenge) ,
88
105
)
89
106
. unwrap ( ) ;
0 commit comments