@@ -5,7 +5,7 @@ use stwo_prover::{
55 constraint_framework:: TraceLocationAllocator ,
66 core:: {
77 backend:: simd:: SimdBackend ,
8- channel:: Blake2sChannel ,
8+ channel:: { Blake2sChannel , Channel } ,
99 fields:: qm31:: SecureField ,
1010 pcs:: { CommitmentSchemeProver , CommitmentSchemeVerifier , PcsConfig } ,
1111 poly:: circle:: { CanonicCoset , PolyOps } ,
@@ -14,9 +14,7 @@ use stwo_prover::{
1414 } ,
1515} ;
1616
17- use super :: trace:: eval:: {
18- INTERACTION_TRACE_IDX , ORIGINAL_TRACE_IDX , PREPROCESSED_TRACE_IDX , PROGRAM_TRACE_IDX ,
19- } ;
17+ use super :: trace:: eval:: { INTERACTION_TRACE_IDX , ORIGINAL_TRACE_IDX , PREPROCESSED_TRACE_IDX } ;
2018use super :: trace:: {
2119 program:: iter_program_steps, program_trace:: ProgramTracesBuilder , sidenote:: SideNote ,
2220 PreprocessedTraces , TracesBuilder ,
@@ -35,7 +33,7 @@ use crate::{
3533 RangeCheckChip , RegisterMemCheckChip , SllChip , SltChip , SltuChip , SraChip , SrlChip ,
3634 SubChip , SyscallChip , TimestampChip ,
3735 } ,
38- column:: PreprocessedColumn ,
36+ column:: { PreprocessedColumn , ProgramColumn } ,
3937 components:: { self , AllLookupElements } ,
4038 traits:: generate_interaction_trace,
4139} ;
@@ -112,6 +110,10 @@ impl<C: MachineChip + Sync> Machine<C> {
112110
113111 // Setup protocol.
114112 let prover_channel = & mut Blake2sChannel :: default ( ) ;
113+ for byte in view. view_associated_data ( ) . unwrap_or_default ( ) {
114+ prover_channel. mix_u64 ( byte. into ( ) ) ;
115+ }
116+
115117 let mut commitment_scheme =
116118 CommitmentSchemeProver :: < SimdBackend , Blake2sMerkleChannel > :: new ( config, & twiddles) ;
117119
@@ -142,8 +144,13 @@ impl<C: MachineChip + Sync> Machine<C> {
142144 let finalized_program_trace = program_traces. finalize ( ) ;
143145
144146 let mut tree_builder = commitment_scheme. tree_builder ( ) ;
145- let _preprocessed_trace_location =
146- tree_builder. extend_evals ( preprocessed_trace. clone ( ) . into_circle_evaluation ( ) ) ;
147+ let _preprocessed_trace_location = tree_builder. extend_evals (
148+ preprocessed_trace
149+ . clone ( )
150+ . into_circle_evaluation ( )
151+ . into_iter ( )
152+ . chain ( finalized_program_trace. clone ( ) . into_circle_evaluation ( ) ) ,
153+ ) ;
147154 tree_builder. commit ( prover_channel) ;
148155
149156 let mut tree_builder = commitment_scheme. tree_builder ( ) ;
@@ -165,12 +172,6 @@ impl<C: MachineChip + Sync> Machine<C> {
165172 let _interaction_trace_location = tree_builder. extend_evals ( interaction_trace) ;
166173 tree_builder. commit ( prover_channel) ;
167174
168- // Fill columns of the program trace.
169- let mut tree_builder = commitment_scheme. tree_builder ( ) ;
170- let _program_trace_location =
171- tree_builder. extend_evals ( finalized_program_trace. into_circle_evaluation ( ) ) ;
172- tree_builder. commit ( prover_channel) ;
173-
174175 let component = MachineComponent :: new (
175176 & mut TraceLocationAllocator :: default ( ) ,
176177 MachineEval :: < C > :: new ( log_size, lookup_elements) ,
@@ -192,6 +193,7 @@ impl<C: MachineChip + Sync> Machine<C> {
192193 pub fn verify (
193194 proof : Proof ,
194195 program_info : & ProgramInfo ,
196+ ad : & [ u8 ] ,
195197 init_memory : & [ MemoryInitializationEntry ] ,
196198 exit_code : & [ PublicOutputEntry ] ,
197199 output_memory : & [ PublicOutputEntry ] ,
@@ -210,12 +212,16 @@ impl<C: MachineChip + Sync> Machine<C> {
210212
211213 let config = PcsConfig :: default ( ) ;
212214 let verifier_channel = & mut Blake2sChannel :: default ( ) ;
215+ for & byte in ad {
216+ verifier_channel. mix_u64 ( byte. into ( ) ) ;
217+ }
218+
213219 let commitment_scheme = & mut CommitmentSchemeVerifier :: < Blake2sMerkleChannel > :: new ( config) ;
214220
215- // simulate the prover and compute expected commitment to preprocessed and program traces
221+ // simulate the prover and compute expected commitment to preprocessed trace
216222 {
217223 let config = PcsConfig :: default ( ) ;
218- let verifier_channel = & mut Blake2sChannel :: default ( ) ;
224+ let verifier_channel = & mut verifier_channel . clone ( ) ;
219225 let twiddles = SimdBackend :: precompute_twiddles (
220226 CanonicCoset :: new (
221227 log_size + LOG_CONSTRAINT_DEGREE + config. fri_config . log_blowup_factor ,
@@ -228,18 +234,6 @@ impl<C: MachineChip + Sync> Machine<C> {
228234 config, & twiddles,
229235 ) ;
230236 let preprocessed_trace = PreprocessedTraces :: new ( log_size) ;
231- let mut tree_builder = commitment_scheme. tree_builder ( ) ;
232- let _preprocessed_trace_location =
233- tree_builder. extend_evals ( preprocessed_trace. into_circle_evaluation ( ) ) ;
234- tree_builder. commit ( verifier_channel) ;
235-
236- let preprocessed_expected = commitment_scheme. roots ( ) [ PREPROCESSED_TRACE_IDX ] ;
237- let preprocessed = proof. commitments [ PREPROCESSED_TRACE_IDX ] ;
238- if preprocessed_expected != preprocessed {
239- return Err ( VerificationError :: InvalidStructure ( format ! ( "invalid commitment to preprocessed trace: \
240- expected {preprocessed_expected}, got {preprocessed}") ) ) ;
241- }
242-
243237 let program_trace = ProgramTracesBuilder :: new (
244238 log_size,
245239 program_info,
@@ -248,14 +242,21 @@ impl<C: MachineChip + Sync> Machine<C> {
248242 output_memory,
249243 )
250244 . finalize ( ) ;
245+
251246 let mut tree_builder = commitment_scheme. tree_builder ( ) ;
252- tree_builder. extend_evals ( program_trace. into_circle_evaluation ( ) ) ;
247+ let _preprocessed_trace_location = tree_builder. extend_evals (
248+ preprocessed_trace
249+ . into_circle_evaluation ( )
250+ . into_iter ( )
251+ . chain ( program_trace. into_circle_evaluation ( ) ) ,
252+ ) ;
253253 tree_builder. commit ( verifier_channel) ;
254- let program_expected = commitment_scheme. roots ( ) [ 1 ] ;
255- let program = proof. commitments [ PROGRAM_TRACE_IDX ] ;
256- if program_expected != program {
257- return Err ( VerificationError :: InvalidStructure ( format ! ( "invalid commitment to program trace: \
258- expected {program_expected}, got {program}") ) ) ;
254+
255+ let preprocessed_expected = commitment_scheme. roots ( ) [ PREPROCESSED_TRACE_IDX ] ;
256+ let preprocessed = proof. commitments [ PREPROCESSED_TRACE_IDX ] ;
257+ if preprocessed_expected != preprocessed {
258+ return Err ( VerificationError :: InvalidStructure ( format ! ( "invalid commitment to preprocessed trace: \
259+ expected {preprocessed_expected}, got {preprocessed}") ) ) ;
259260 }
260261 }
261262
@@ -270,7 +271,7 @@ impl<C: MachineChip + Sync> Machine<C> {
270271 . map_cols ( |_| log_size) ;
271272 // use the fact that preprocessed columns are only allowed to have [0] mask
272273 sizes[ PREPROCESSED_TRACE_IDX ] = std:: iter:: repeat ( log_size)
273- . take ( PreprocessedColumn :: COLUMNS_NUM )
274+ . take ( PreprocessedColumn :: COLUMNS_NUM + ProgramColumn :: COLUMNS_NUM )
274275 . collect ( ) ;
275276
276277 for idx in [ PREPROCESSED_TRACE_IDX , ORIGINAL_TRACE_IDX ] {
@@ -284,10 +285,12 @@ impl<C: MachineChip + Sync> Machine<C> {
284285 MachineEval :: < C > :: new ( log_size, lookup_elements) ,
285286 claimed_sum,
286287 ) ;
287- // TODO: prover must commit to the program trace before generating challenges.
288- for idx in [ INTERACTION_TRACE_IDX , PROGRAM_TRACE_IDX ] {
289- commitment_scheme. commit ( proof. commitments [ idx] , & sizes[ idx] , verifier_channel) ;
290- }
288+
289+ commitment_scheme. commit (
290+ proof. commitments [ INTERACTION_TRACE_IDX ] ,
291+ & sizes[ INTERACTION_TRACE_IDX ] ,
292+ verifier_channel,
293+ ) ;
291294
292295 verify ( & [ & component] , verifier_channel, commitment_scheme, proof)
293296 }
@@ -327,6 +330,7 @@ mod tests {
327330 Machine :: < BaseComponents > :: verify (
328331 proof,
329332 view. get_program_memory ( ) ,
333+ & [ ] ,
330334 view. get_initial_memory ( ) ,
331335 view. get_exit_code ( ) ,
332336 view. get_public_output ( ) ,
0 commit comments