1
- use integration:: test_util:: { gen_and_verify_batch_proofs, PARAMS_DIR } ;
1
+ use integration:: test_util:: {
2
+ gen_and_verify_batch_proofs, load_batch, load_block_traces_for_test, PARAMS_DIR ,
3
+ } ;
2
4
use prover:: {
3
- aggregator:: Prover , proof:: from_json_file, utils:: init_env_and_log, ChunkHash , ChunkProof ,
5
+ aggregator:: Prover ,
6
+ config:: LayerId ,
7
+ proof:: from_json_file,
8
+ utils:: { chunk_trace_to_witness_block, init_env_and_log} ,
9
+ BatchHash , BatchProof , ChunkHash , ChunkProof , CompressionCircuit ,
4
10
} ;
5
11
use serde_derive:: { Deserialize , Serialize } ;
6
12
use std:: { env, fs, path:: PathBuf } ;
7
13
8
- #[ cfg( feature = "prove_verify" ) ]
14
+ // #[cfg(feature = "prove_verify")]
9
15
#[ test]
10
16
fn test_batch_prove_verify ( ) {
11
17
let output_dir = init_env_and_log ( "batch_tests" ) ;
12
18
log:: info!( "Initialized ENV and created output-dir {output_dir}" ) ;
13
19
14
- let chunk_hashes_proofs = load_chunk_hashes_and_proofs ( "tests/test_data" , "1" , & output_dir ) ;
15
- let mut batch_prover = new_batch_prover ( & output_dir ) ;
16
- prove_and_verify_batch ( & output_dir , & mut batch_prover , chunk_hashes_proofs ) ;
17
- }
20
+ // let batch_task = "tests/test_data/full_proof_1.json" ;
21
+ let batch_task = "tests/test_data/batch_task_69776.json" ;
22
+ let assets_dir = "assets" ;
23
+ let chunk_hashes_proofs = load_batch_proving_task ( batch_task , & output_dir ) ;
18
24
19
- #[ cfg( feature = "prove_verify" ) ]
20
- #[ test]
21
- fn test_batches_with_each_chunk_num_prove_verify ( ) {
22
- let output_dir = init_env_and_log ( "batches_with_each_chunk_num_tests" ) ;
23
- log:: info!( "Initialized ENV and created output-dir {output_dir}" ) ;
25
+ env:: set_var ( "AGG_VK_FILENAME" , "agg_vk.vkey" ) ;
26
+ env:: set_var ( "CHUNK_PROTOCOL_FILENAME" , "chunk.protocol" ) ;
27
+ let mut batch_prover = Prover :: from_dirs ( PARAMS_DIR , assets_dir) ;
28
+ log:: info!( "Constructed batch prover" ) ;
24
29
25
- let chunk_hashes_proofs = load_chunk_hashes_and_proofs ( "tests/test_data" , "2" , & output_dir ) ;
26
- let mut batch_prover = new_batch_prover ( & output_dir ) ;
30
+ let chunk_num = chunk_hashes_proofs . len ( ) ;
31
+ log :: info! ( "Prove batch BEGIN: chunk_num = {chunk_num}" ) ;
27
32
28
- // Iterate over chunk proofs to test with 1 - 15 chunks (in a batch).
29
- for i in 0 ..chunk_hashes_proofs. len ( ) {
30
- let mut output_dir = PathBuf :: from ( & output_dir) ;
31
- output_dir. push ( format ! ( "batch_{}" , i + 1 ) ) ;
32
- fs:: create_dir_all ( & output_dir) . unwrap ( ) ;
33
+ // Load or generate aggregation snark (layer-3).
34
+ let layer3_snark = batch_prover
35
+ . load_or_gen_last_agg_snark ( "agg" , chunk_hashes_proofs, Some ( & output_dir) )
36
+ . unwrap ( ) ;
33
37
34
- prove_and_verify_batch (
35
- & output_dir. to_string_lossy ( ) ,
36
- & mut batch_prover,
37
- chunk_hashes_proofs[ ..=i] . to_vec ( ) ,
38
- ) ;
39
- }
38
+ let layer_id = LayerId :: Layer4 ;
39
+
40
+ let id = layer_id. id ( ) ;
41
+ let degree = layer_id. degree ( ) ;
42
+ // Load or generate compression snark.
43
+ let normal_proof = batch_prover
44
+ . inner
45
+ . load_or_gen_comp_snark (
46
+ "normal" ,
47
+ id,
48
+ true ,
49
+ degree,
50
+ layer3_snark. clone ( ) ,
51
+ Some ( & output_dir) ,
52
+ )
53
+ . unwrap ( ) ;
54
+ log:: info!( "Generated compression snark: {id}" ) ;
55
+
56
+ let evm_proof = batch_prover
57
+ . inner
58
+ . load_or_gen_comp_evm_proof ( "evm" , id, true , degree, layer3_snark, Some ( & output_dir) )
59
+ . unwrap ( ) ;
60
+ log:: info!( "Generated EVM proof: {id}" ) ;
61
+
62
+ let config_path = layer_id. config_path ( ) ;
63
+
64
+ env:: set_var ( "COMPRESSION_CONFIG" , config_path) ;
65
+ let vk = evm_proof. proof . vk :: < CompressionCircuit > ( ) ;
66
+
67
+ let params = batch_prover. inner . params ( degree) . clone ( ) ;
68
+ let verifier = prover:: common:: Verifier :: < CompressionCircuit > :: new ( params, vk) ;
69
+ log:: info!( "Constructed common verifier" ) ;
70
+
71
+ assert ! ( verifier. verify_snark( normal_proof) ) ;
72
+ log:: info!( "Verified normal proof: {id}" ) ;
73
+
74
+ verifier. evm_verify ( & evm_proof, Some ( & output_dir) ) ;
75
+ log:: info!( "Verified EVM proof: {id}" ) ;
76
+
77
+ let batch_proof = BatchProof :: from ( evm_proof. proof ) ;
78
+ batch_proof. dump ( & output_dir, "agg" ) . unwrap ( ) ;
79
+ batch_proof. clone ( ) . assert_calldata ( ) ;
80
+
81
+ let verifier = prover:: aggregator:: Verifier :: from_dirs ( PARAMS_DIR , assets_dir) ;
82
+ log:: info!( "Constructed aggregator verifier" ) ;
83
+
84
+ assert ! ( verifier. verify_agg_evm_proof( batch_proof) ) ;
85
+ log:: info!( "Verified batch proof" ) ;
86
+
87
+ log:: info!( "Prove batch END: chunk_num = {chunk_num}" ) ;
40
88
}
89
+
41
90
#[ derive( Debug , Deserialize , Serialize ) ]
42
91
struct BatchTaskDetail {
43
92
chunk_infos : Vec < ChunkHash > ,
44
93
chunk_proofs : Vec < ChunkProof > ,
45
94
}
46
95
47
- fn load_chunk_hashes_and_proofs (
48
- dir : & str ,
49
- filename : & str ,
50
- output_dir : & str ,
51
- ) -> Vec < ( ChunkHash , ChunkProof ) > {
52
- let batch_task_detail: BatchTaskDetail = from_json_file ( dir, filename) . unwrap ( ) ;
96
+ fn load_batch_proving_task ( filename : & str , output_dir : & str ) -> Vec < ( ChunkHash , ChunkProof ) > {
97
+ let batch_task_detail: BatchTaskDetail = from_json_file ( filename) . unwrap ( ) ;
53
98
let chunk_hashes = batch_task_detail. chunk_infos ;
54
99
let chunk_proofs = batch_task_detail. chunk_proofs ;
55
100
@@ -59,13 +104,13 @@ fn load_chunk_hashes_and_proofs(
59
104
. zip ( chunk_proofs[ ..] . iter ( ) . cloned ( ) )
60
105
. collect ( ) ;
61
106
62
- // Dump chunk-procotol for further batch-proving.
63
- chunk_hashes_proofs
64
- . first ( )
65
- . unwrap ( )
66
- . 1
67
- . dump ( output_dir, "0" )
68
- . unwrap ( ) ;
107
+ let dump_protocol = false ;
108
+ if dump_protocol {
109
+ log :: info! ( "dumping first chunk protocol to {output_dir}/chunk_protocol" ) ;
110
+ let chunk_protocol = & chunk_hashes_proofs . first ( ) . unwrap ( ) . 1 . protocol ;
111
+ // Dump chunk-procotol for further batch-proving.
112
+ prover :: proof :: dump_data ( output_dir, "chunk.protocol" , & chunk_protocol ) ;
113
+ }
69
114
70
115
log:: info!(
71
116
"Loaded chunk-hashes and chunk-proofs: total = {}" ,
@@ -74,29 +119,48 @@ fn load_chunk_hashes_and_proofs(
74
119
chunk_hashes_proofs
75
120
}
76
121
77
- fn new_batch_prover ( assets_dir : & str ) -> Prover {
78
- env :: set_var ( "AGG_VK_FILENAME" , "vk_batch_agg.vkey" ) ;
79
- env :: set_var ( "CHUNK_PROTOCOL_FILENAME" , "chunk_chunk_0.protocol ") ;
80
- let prover = Prover :: from_dirs ( PARAMS_DIR , assets_dir ) ;
81
- log :: info! ( "Constructed batch prover" ) ;
122
+ # [ test ]
123
+ fn test_batch_pi_consistency ( ) {
124
+ let output_dir = init_env_and_log ( "batch_pi ") ;
125
+ log :: info! ( "Initialized ENV and created output-dir {output_dir}" ) ;
126
+ let trace_paths = load_batch ( ) . unwrap ( ) ;
82
127
83
- prover
84
- }
128
+ let max_num_snarks = 15 ;
129
+ let chunk_traces: Vec < _ > = trace_paths
130
+ . iter ( )
131
+ . map ( |trace_path| {
132
+ env:: set_var ( "TRACE_PATH" , trace_path) ;
133
+ load_block_traces_for_test ( ) . 1
134
+ } )
135
+ . collect ( ) ;
85
136
86
- fn prove_and_verify_batch (
87
- output_dir : & str ,
88
- batch_prover : & mut Prover ,
89
- chunk_hashes_proofs : Vec < ( ChunkHash , ChunkProof ) > ,
90
- ) {
91
- let chunk_num = chunk_hashes_proofs. len ( ) ;
92
- log:: info!( "Prove batch BEGIN: chunk_num = {chunk_num}" ) ;
137
+ let mut chunk_hashes: Vec < ChunkHash > = chunk_traces
138
+ . into_iter ( )
139
+ . enumerate ( )
140
+ . map ( |( _i, chunk_trace) | {
141
+ let witness_block = chunk_trace_to_witness_block ( chunk_trace. clone ( ) ) . unwrap ( ) ;
142
+ ChunkHash :: from_witness_block ( & witness_block, false )
143
+ } )
144
+ . collect ( ) ;
93
145
94
- // Load or generate aggregation snark (layer-3).
95
- let layer3_snark = batch_prover
96
- . load_or_gen_last_agg_snark ( "agg" , chunk_hashes_proofs , Some ( output_dir ) )
97
- . unwrap ( ) ;
146
+ let real_chunk_count = chunk_hashes . len ( ) ;
147
+ if real_chunk_count < max_num_snarks {
148
+ let mut padding_chunk_hash = chunk_hashes . last ( ) . unwrap ( ) . clone ( ) ;
149
+ padding_chunk_hash . is_padding = true ;
98
150
99
- gen_and_verify_batch_proofs ( batch_prover, layer3_snark, output_dir) ;
151
+ // Extend to MAX_AGG_SNARKS for both chunk hashes and layer-2 snarks.
152
+ chunk_hashes
153
+ . extend ( std:: iter:: repeat ( padding_chunk_hash) . take ( max_num_snarks - real_chunk_count) ) ;
154
+ }
100
155
101
- log:: info!( "Prove batch END: chunk_num = {chunk_num}" ) ;
156
+ let batch_hash = BatchHash :: construct ( & chunk_hashes) ;
157
+ let blob = batch_hash. blob_assignments ( ) ;
158
+
159
+ let challenge = blob. challenge ;
160
+ let evaluation = blob. evaluation ;
161
+ println ! ( "blob.challenge: {challenge:x}" ) ;
162
+ println ! ( "blob.evaluation: {evaluation:x}" ) ;
163
+ for ( i, elem) in blob. coefficients . iter ( ) . enumerate ( ) {
164
+ println ! ( "blob.coeffs[{}]: {elem:x}" , i) ;
165
+ }
102
166
}
0 commit comments