@@ -10,6 +10,7 @@ use multilinear_extensions::{
10
10
util:: ceil_log2,
11
11
virtual_poly:: { VPAuxInfo , build_eq_x_r_vec_sequential, eq_eval} ,
12
12
} ;
13
+ use p3:: field:: PrimeCharacteristicRing ;
13
14
use sumcheck:: structs:: { IOPProof , IOPVerifierState } ;
14
15
use transcript:: { ForkableTranscript , Transcript } ;
15
16
use witness:: next_pow2_instance_padding;
@@ -107,15 +108,18 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMVerifier<E, PCS>
107
108
}
108
109
}
109
110
110
- for ( name, ( _, proof) ) in vm_proof. opcode_proofs . iter ( ) {
111
- tracing:: debug!( "read {}'s commit" , name) ;
112
- PCS :: write_commitment ( & proof. wits_commit , & mut transcript)
113
- . map_err ( ZKVMError :: PCSError ) ?;
114
- }
115
- for ( name, ( _, proof) ) in vm_proof. table_proofs . iter ( ) {
116
- tracing:: debug!( "read {}'s commit" , name) ;
117
- PCS :: write_commitment ( & proof. wits_commit , & mut transcript)
118
- . map_err ( ZKVMError :: PCSError ) ?;
111
+ for ( circuit_name, _) in self . vk . circuit_vks . iter ( ) {
112
+ if let Some ( ( _, opcode_proof) ) = vm_proof. opcode_proofs . get ( circuit_name) {
113
+ tracing:: debug!( "read {}'s commit" , circuit_name) ;
114
+ PCS :: write_commitment ( & opcode_proof. wits_commit , & mut transcript)
115
+ . map_err ( ZKVMError :: PCSError ) ?;
116
+ } else if let Some ( ( _, table_proof) ) = vm_proof. table_proofs . get ( circuit_name) {
117
+ tracing:: debug!( "read {}'s commit" , circuit_name) ;
118
+ PCS :: write_commitment ( & table_proof. wits_commit , & mut transcript)
119
+ . map_err ( ZKVMError :: PCSError ) ?;
120
+ } else {
121
+ // all proof are optional
122
+ }
119
123
}
120
124
121
125
// alpha, beta
@@ -128,94 +132,84 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> ZKVMVerifier<E, PCS>
128
132
let dummy_table_item = challenges[ 0 ] ;
129
133
let mut dummy_table_item_multiplicity = 0 ;
130
134
let point_eval = PointAndEval :: default ( ) ;
131
- let mut transcripts = transcript. fork ( self . vk . circuit_vks . len ( ) ) ;
132
-
133
- for ( name, ( i, opcode_proof) ) in vm_proof. opcode_proofs {
134
- let transcript = & mut transcripts[ i] ;
135
-
136
- let circuit_vk = self
137
- . vk
138
- . circuit_vks
139
- . get ( & name)
140
- . ok_or ( ZKVMError :: VKNotFound ( name. clone ( ) ) ) ?;
141
- let _rand_point = self . verify_opcode_proof (
142
- & name,
143
- & self . vk . vp ,
144
- circuit_vk,
145
- & opcode_proof,
146
- pi_evals,
147
- transcript,
148
- NUM_FANIN ,
149
- & point_eval,
150
- & challenges,
151
- ) ?;
152
- tracing:: info!( "verified proof for opcode {}" , name) ;
153
-
154
- // getting the number of dummy padding item that we used in this opcode circuit
155
- let num_lks = circuit_vk. get_cs ( ) . lk_expressions . len ( ) ;
156
- let num_padded_lks_per_instance = next_pow2_instance_padding ( num_lks) - num_lks;
157
- let num_padded_instance =
158
- next_pow2_instance_padding ( opcode_proof. num_instances ) - opcode_proof. num_instances ;
159
- dummy_table_item_multiplicity += num_padded_lks_per_instance
160
- * opcode_proof. num_instances
161
- + num_lks. next_power_of_two ( ) * num_padded_instance;
162
-
163
- prod_r *= opcode_proof
164
- . record_r_out_evals
165
- . iter ( )
166
- . copied ( )
167
- . product :: < E > ( ) ;
168
- prod_w *= opcode_proof
169
- . record_w_out_evals
170
- . iter ( )
171
- . copied ( )
172
- . product :: < E > ( ) ;
173
-
174
- logup_sum += opcode_proof. lk_p1_out_eval * opcode_proof. lk_q1_out_eval . inverse ( ) ;
175
- logup_sum += opcode_proof. lk_p2_out_eval * opcode_proof. lk_q2_out_eval . inverse ( ) ;
176
- }
177
-
178
- for ( name, ( i, table_proof) ) in vm_proof. table_proofs {
179
- let transcript = & mut transcripts[ i] ;
180
-
181
- let circuit_vk = self
182
- . vk
183
- . circuit_vks
184
- . get ( & name)
185
- . ok_or ( ZKVMError :: VKNotFound ( name. clone ( ) ) ) ?;
186
- let _rand_point = self . verify_table_proof (
187
- & name,
188
- & self . vk . vp ,
189
- circuit_vk,
190
- & table_proof,
191
- & vm_proof. raw_pi ,
192
- & vm_proof. pi_evals ,
193
- transcript,
194
- NUM_FANIN_LOGUP ,
195
- & point_eval,
196
- & challenges,
197
- ) ?;
198
- tracing:: info!( "verified proof for table {}" , name) ;
199
-
200
- logup_sum = table_proof
201
- . lk_out_evals
202
- . iter ( )
203
- . fold ( logup_sum, |acc, [ p1, p2, q1, q2] | {
204
- acc - * p1 * q1. inverse ( ) - * p2 * q2. inverse ( )
205
- } ) ;
135
+ for ( index, ( circuit_name, circuit_vk) ) in self . vk . circuit_vks . iter ( ) . enumerate ( ) {
136
+ if let Some ( ( _, opcode_proof) ) = vm_proof. opcode_proofs . get ( circuit_name) {
137
+ transcript. append_field_element ( & E :: BaseField :: from_u64 ( index as u64 ) ) ;
138
+ let name = circuit_name;
139
+ let _rand_point = self . verify_opcode_proof (
140
+ name,
141
+ & self . vk . vp ,
142
+ circuit_vk,
143
+ opcode_proof,
144
+ pi_evals,
145
+ & mut transcript,
146
+ NUM_FANIN ,
147
+ & point_eval,
148
+ & challenges,
149
+ ) ?;
150
+ tracing:: info!( "verified proof for opcode {}" , name) ;
151
+
152
+ // getting the number of dummy padding item that we used in this opcode circuit
153
+ let num_lks = circuit_vk. get_cs ( ) . lk_expressions . len ( ) ;
154
+ let num_padded_lks_per_instance = next_pow2_instance_padding ( num_lks) - num_lks;
155
+ let num_padded_instance = next_pow2_instance_padding ( opcode_proof. num_instances )
156
+ - opcode_proof. num_instances ;
157
+ dummy_table_item_multiplicity += num_padded_lks_per_instance
158
+ * opcode_proof. num_instances
159
+ + num_lks. next_power_of_two ( ) * num_padded_instance;
160
+
161
+ prod_r *= opcode_proof
162
+ . record_r_out_evals
163
+ . iter ( )
164
+ . copied ( )
165
+ . product :: < E > ( ) ;
166
+ prod_w *= opcode_proof
167
+ . record_w_out_evals
168
+ . iter ( )
169
+ . copied ( )
170
+ . product :: < E > ( ) ;
171
+
172
+ logup_sum += opcode_proof. lk_p1_out_eval * opcode_proof. lk_q1_out_eval . inverse ( ) ;
173
+ logup_sum += opcode_proof. lk_p2_out_eval * opcode_proof. lk_q2_out_eval . inverse ( ) ;
174
+ } else if let Some ( ( _, table_proof) ) = vm_proof. table_proofs . get ( circuit_name) {
175
+ transcript. append_field_element ( & E :: BaseField :: from_u64 ( index as u64 ) ) ;
176
+ let name = circuit_name;
177
+ let _rand_point = self . verify_table_proof (
178
+ name,
179
+ & self . vk . vp ,
180
+ circuit_vk,
181
+ table_proof,
182
+ & vm_proof. raw_pi ,
183
+ & vm_proof. pi_evals ,
184
+ & mut transcript,
185
+ NUM_FANIN_LOGUP ,
186
+ & point_eval,
187
+ & challenges,
188
+ ) ?;
189
+ tracing:: info!( "verified proof for table {}" , name) ;
190
+
191
+ logup_sum = table_proof
192
+ . lk_out_evals
193
+ . iter ( )
194
+ . fold ( logup_sum, |acc, [ p1, p2, q1, q2] | {
195
+ acc - * p1 * q1. inverse ( ) - * p2 * q2. inverse ( )
196
+ } ) ;
206
197
207
- prod_w *= table_proof
208
- . w_out_evals
209
- . iter ( )
210
- . flatten ( )
211
- . copied ( )
212
- . product :: < E > ( ) ;
213
- prod_r *= table_proof
214
- . r_out_evals
215
- . iter ( )
216
- . flatten ( )
217
- . copied ( )
218
- . product :: < E > ( ) ;
198
+ prod_w *= table_proof
199
+ . w_out_evals
200
+ . iter ( )
201
+ . flatten ( )
202
+ . copied ( )
203
+ . product :: < E > ( ) ;
204
+ prod_r *= table_proof
205
+ . r_out_evals
206
+ . iter ( )
207
+ . flatten ( )
208
+ . copied ( )
209
+ . product :: < E > ( ) ;
210
+ } else {
211
+ // all proof are optional
212
+ }
219
213
}
220
214
logup_sum -= E :: from_u64 ( dummy_table_item_multiplicity as u64 ) * dummy_table_item. inverse ( ) ;
221
215
0 commit comments