@@ -197,6 +197,8 @@ pub struct RunConfig {
197197 pub app : Option < String > ,
198198 // Run RISC-V simulation
199199 pub do_riscv_run : bool ,
200+ // Run the prover input generation stop. Must be enabled if [do_riscv_run] is enabled.
201+ pub do_prover_input_run : bool ,
200202 // Whether to check that storage diff hashes from forward and proof runs match
201203 // Only to be used when state-diffs-pi feature is enabled in the binary and
202204 // do_riscv_run is true
@@ -223,6 +225,7 @@ impl Default for RunConfig {
223225 RunConfig {
224226 app : Some ( "for_tests" . to_string ( ) ) ,
225227 do_riscv_run,
228+ do_prover_input_run : true ,
226229 check_storage_diff_hashes : do_riscv_run, // Enable storage diff hash checks when doing RISC-V run
227230 check_revm_consistency,
228231 profiler_config : None ,
@@ -781,6 +784,7 @@ impl<const RANDOMIZED_TREE: bool> Chain<RANDOMIZED_TREE> {
781784 witness_output_file,
782785 app,
783786 do_riscv_run,
787+ do_prover_input_run,
784788 check_storage_diff_hashes,
785789 check_revm_consistency : _,
786790 update_state_after_block_execution,
@@ -837,17 +841,6 @@ impl<const RANDOMIZED_TREE: bool> Chain<RANDOMIZED_TREE> {
837841 false ,
838842 ) ;
839843
840- let prover_input_oracle = oracle_factory. create_forward_oracle (
841- block_metadata,
842- self . state_tree . clone ( ) ,
843- self . preimage_source . clone ( ) ,
844- tx_source. clone ( ) ,
845- Some ( proof_data) ,
846- Some ( da_commitment_scheme) ,
847- false ,
848- true ,
849- ) ;
850-
851844 #[ cfg( feature = "simulate_witness_gen" ) ]
852845 let source_for_witness_bench = {
853846 oracle_factory. create_proof_oracle (
@@ -874,50 +867,72 @@ impl<const RANDOMIZED_TREE: bool> Chain<RANDOMIZED_TREE> {
874867 validator,
875868 ) ?;
876869
877- let mut result_keeper_prover_input = ProverInputResultKeeper :: new ( NoopTxCallback ) ;
878-
879- let copy_source = ReadWitnessSource :: new ( prover_input_oracle ) ;
880- let mut tracer = NopTracer :: default ( ) ;
881- let mut validator = NopTxValidator ;
882- let prover_input_forward = {
883- // Avoid capturing markers from the second run, as it would duplicate them.
884- # [ cfg ( feature = "cycle_marker" ) ]
885- let snapshot = cycle_marker :: snapshot ( ) ;
886- let result = run_prover_input_no_panic :: < BasicBootloaderProvingExecutionConfig > (
887- copy_source ,
888- & mut result_keeper_prover_input ,
889- & mut tracer ,
890- & mut validator ,
870+ let block_output : BlockOutput = result_keeper . into ( ) ;
871+
872+ let ( prover_input_forward , pubdata , has_filtered_by_validator ) = if do_prover_input_run {
873+ let mut result_keeper_prover_input = ProverInputResultKeeper :: new ( NoopTxCallback ) ;
874+
875+ let prover_input_oracle = oracle_factory . create_forward_oracle (
876+ block_metadata ,
877+ self . state_tree . clone ( ) ,
878+ self . preimage_source . clone ( ) ,
879+ tx_source . clone ( ) ,
880+ Some ( proof_data ) ,
881+ Some ( da_commitment_scheme ) ,
882+ false ,
883+ true ,
891884 ) ;
892- #[ cfg( feature = "cycle_marker" ) ]
893- cycle_marker:: revert ( snapshot) ;
894- result?
895- } ;
885+ let copy_source = ReadWitnessSource :: new ( prover_input_oracle) ;
886+ let mut tracer = NopTracer :: default ( ) ;
887+ let mut validator = NopTxValidator ;
888+ let prover_input_forward = {
889+ // Avoid capturing markers from the second run, as it would duplicate them.
890+ #[ cfg( feature = "cycle_marker" ) ]
891+ let snapshot = cycle_marker:: snapshot ( ) ;
892+ let result = run_prover_input_no_panic :: < BasicBootloaderProvingExecutionConfig > (
893+ copy_source,
894+ & mut result_keeper_prover_input,
895+ & mut tracer,
896+ & mut validator,
897+ ) ;
898+ #[ cfg( feature = "cycle_marker" ) ]
899+ cycle_marker:: revert ( snapshot) ;
900+ result?
901+ } ;
896902
897- if let Some ( path) = witness_output_file {
898- let mut file = File :: create ( & path) . expect ( "should create file" ) ;
899- let witness: Vec < u8 > = prover_input_forward
900- . iter ( )
901- . flat_map ( |x| x. to_be_bytes ( ) )
902- . collect ( ) ;
903- let hex = hex:: encode ( witness) ;
904- file. write_all ( hex. as_bytes ( ) )
905- . expect ( "should write to file" ) ;
906- }
903+ if let Some ( path) = witness_output_file {
904+ let mut file = File :: create ( & path) . expect ( "should create file" ) ;
905+ let witness: Vec < u8 > = prover_input_forward
906+ . iter ( )
907+ . flat_map ( |x| x. to_be_bytes ( ) )
908+ . collect ( ) ;
909+ let hex = hex:: encode ( witness) ;
910+ file. write_all ( hex. as_bytes ( ) )
911+ . expect ( "should write to file" ) ;
912+ }
907913
908- let block_output: BlockOutput = result_keeper. into ( ) ;
909- let pubdata = result_keeper_prover_input. pubdata . clone ( ) ;
910- let prover_input_block_output: BlockOutput = result_keeper_prover_input. into ( ) ;
911- let has_filtered_by_validator = has_validator_filtered_tx ( & block_output) ;
912- if has_filtered_by_validator {
913- warn ! (
914- "Skipping forward/prover-input output equivalence checks because the custom \
914+ let pubdata = result_keeper_prover_input. pubdata . clone ( ) ;
915+ let prover_input_block_output: BlockOutput = result_keeper_prover_input. into ( ) ;
916+ let has_filtered_by_validator = has_validator_filtered_tx ( & block_output) ;
917+ if has_filtered_by_validator {
918+ warn ! (
919+ "Skipping forward/prover-input output equivalence checks because the custom \
915920 validator filtered at least one transaction, and prover-input replay uses \
916921 NopTxValidator"
917- ) ;
922+ ) ;
923+ } else {
924+ assert_block_outputs_match ( & block_output, & prover_input_block_output) ;
925+ }
926+ ( prover_input_forward, pubdata, has_filtered_by_validator)
918927 } else {
919- assert_block_outputs_match ( & block_output, & prover_input_block_output) ;
920- }
928+ // We use the forward prover input run outputs to validate the risc-v run,
929+ // so we check consistency in config
930+ assert ! (
931+ !do_riscv_run,
932+ "Native prover input run should be performed if risc v run is enabled"
933+ ) ;
934+ ( vec ! [ ] , vec ! [ ] , false )
935+ } ;
921936
922937 trace ! (
923938 "{}Block output:{} \n {:#?}" ,
0 commit comments