@@ -86,7 +86,10 @@ impl Prover {
8686 if read_env_var ( "SAVE_TRACE" , false ) {
8787 save_trace ( batch_index, block_traces) ;
8888 }
89- save_batch_header ( block_traces, batch_index) ;
89+ if !save_batch_header ( block_traces, batch_index) {
90+ save_trace ( batch_index, block_traces) ;
91+ continue ;
92+ }
9093
9194 // Step3. Generate evm proof
9295 log:: info!( "Generate evm proof" ) ;
@@ -113,24 +116,40 @@ impl Prover {
113116 }
114117}
115118
116- fn save_batch_header ( blocks : & mut Vec < BlockTrace > , batch_index : u64 ) {
117- blocks. iter_mut ( ) . for_each ( |blobk| blobk. flatten ( ) ) ;
118- let batch_info = EVMVerifier :: verify ( blocks) . unwrap ( ) ;
119- let blob_info = morph_executor_host:: get_blob_info ( blocks) . unwrap ( ) ;
120- let ( versioned_hash, _) = BlobVerifier :: verify ( & blob_info, blocks. len ( ) ) . unwrap ( ) ;
121-
122- // Save batch_header
123- // | batch_data_hash | versioned_hash | sequencer_root |
124- // |-----------------|----------------|----------------|
125- // | bytes32 | bytes32 | bytes32 |
126- let mut batch_header: Vec < u8 > = Vec :: with_capacity ( 96 ) ;
127- batch_header. extend_from_slice ( & batch_info. data_hash ( ) . 0 ) ;
128- batch_header. extend_from_slice ( & versioned_hash. 0 ) ;
129- batch_header. extend_from_slice ( & batch_info. sequencer_root ( ) . 0 ) ;
119+ fn save_batch_header ( blocks : & mut Vec < BlockTrace > , batch_index : u64 ) -> bool {
130120 let proof_dir = PROVER_PROOF_DIR . to_string ( ) + format ! ( "/batch_{}" , batch_index) . as_str ( ) ;
131121 std:: fs:: create_dir_all ( & proof_dir) . expect ( "failed to create proof path" ) ;
132- let mut batch_file = File :: create ( format ! ( "{}/batch_header.data" , proof_dir) ) . unwrap ( ) ;
133- batch_file. write_all ( & batch_header[ ..] ) . expect ( "failed to batch_header" ) ;
122+ blocks. iter_mut ( ) . for_each ( |block| block. flatten ( ) ) ;
123+ let verify_result = EVMVerifier :: verify ( blocks) ;
124+
125+ if let Ok ( batch_info) = verify_result {
126+ let blob_info = morph_executor_host:: get_blob_info ( blocks) . unwrap ( ) ;
127+ let ( versioned_hash, _) = BlobVerifier :: verify ( & blob_info, blocks. len ( ) ) . unwrap ( ) ;
128+
129+ // Save batch_header
130+ // | batch_data_hash | versioned_hash | sequencer_root |
131+ // |-----------------|----------------|----------------|
132+ // | bytes32 | bytes32 | bytes32 |
133+ let mut batch_header: Vec < u8 > = Vec :: with_capacity ( 96 ) ;
134+ batch_header. extend_from_slice ( & batch_info. data_hash ( ) . 0 ) ;
135+ batch_header. extend_from_slice ( & versioned_hash. 0 ) ;
136+ batch_header. extend_from_slice ( & batch_info. sequencer_root ( ) . 0 ) ;
137+ let mut batch_file = File :: create ( format ! ( "{}/batch_header.data" , proof_dir) ) . unwrap ( ) ;
138+ batch_file. write_all ( & batch_header[ ..] ) . expect ( "failed to batch_header" ) ;
139+ true
140+ } else {
141+ let e = verify_result. unwrap_err ( ) ;
142+ let error_data = serde_json:: json!( {
143+ "error_code" : "EVM_EXECUTE_NOT_EXPECTED" ,
144+ "error_msg" : e. to_string( )
145+ } ) ;
146+ let mut batch_file = File :: create ( format ! ( "{}/execute_result.json" , proof_dir) ) . unwrap ( ) ;
147+ batch_file
148+ . write_all ( serde_json:: to_string_pretty ( & error_data) . unwrap ( ) . as_bytes ( ) )
149+ . expect ( "failed to write error" ) ;
150+ log:: error!( "EVM verification failed for batch {}: {}" , batch_index, e) ;
151+ false
152+ }
134153}
135154
136155fn save_proof ( batch_index : u64 , proof : EvmProofFixture ) {
@@ -191,3 +210,19 @@ fn save_trace(batch_index: u64, chunk_traces: &Vec<BlockTrace>) {
191210 serde_json:: to_writer_pretty ( writer, & chunk_traces) . unwrap ( ) ;
192211 log:: info!( "chunk_traces of batch_index = {:#?} saved" , batch_index) ;
193212}
213+
214+ #[ test]
215+ fn test_save_execute ( ) {
216+ let batch_index = 102u64 ;
217+
218+ let mut blocks = load_trace ( "../../testdata/viridian/eip7702_traces.json" ) ;
219+ println ! ( "blocks.len(): {:?}" , blocks. len( ) ) ;
220+ let traces = blocks. first_mut ( ) . unwrap ( ) ;
221+
222+ if !save_batch_header ( traces, batch_index) {
223+ save_trace ( batch_index, traces) ;
224+ println ! ( "save_batch_header error" ) ;
225+ } else {
226+ println ! ( "save_batch_header success" ) ;
227+ }
228+ }
0 commit comments