11use super :: { AccountMatch , StateTest , StateTestResult } ;
22use crate :: config:: TestSuite ;
3- use bus_mapping:: circuit_input_builder:: { CircuitInputBuilder , CircuitsParams , PrecompileEcParams } ;
3+ use bus_mapping:: {
4+ circuit_input_builder:: { CircuitInputBuilder , CircuitsParams , PrecompileEcParams } ,
5+ state_db:: CodeDB ,
6+ } ;
47use eth_types:: {
5- geth_types, geth_types:: TxType , Address , Bytes , GethExecTrace , ToBigEndian , U256 , U64 ,
8+ geth_types, geth_types:: TxType , Address , Bytes , GethExecTrace , ToBigEndian , ToWord , H256 , U256 ,
9+ U64 ,
610} ;
711use ethers_core:: {
812 types:: { transaction:: eip2718:: TypedTransaction , TransactionRequest } ,
@@ -43,6 +47,9 @@ pub enum StateTestError {
4347 SkipTestMaxSteps ( usize ) ,
4448 #[ error( "SkipTestSelfDestruct" ) ]
4549 SkipTestSelfDestruct ,
50+ #[ error( "SkipTestDifficulty" ) ]
51+ // scroll evm always returns 0 for "difficulty" opcode
52+ SkipTestDifficulty ,
4653 #[ error( "SkipTestBalanceOverflow" ) ]
4754 SkipTestBalanceOverflow ,
4855 #[ error( "Exception(expected:{expected:?}, found:{found:?})" ) ]
@@ -53,12 +60,15 @@ impl StateTestError {
5360 pub fn is_skip ( & self ) -> bool {
5461 // Avoid lint `variant is never constructed` if no feature skip-self-destruct.
5562 let _ = StateTestError :: SkipTestSelfDestruct ;
63+ let _ = StateTestError :: SkipTestDifficulty ;
5664
5765 matches ! (
5866 self ,
5967 StateTestError :: SkipTestMaxSteps ( _)
6068 | StateTestError :: SkipTestMaxGasLimit ( _)
6169 | StateTestError :: SkipTestSelfDestruct
70+ | StateTestError :: SkipTestBalanceOverflow
71+ | StateTestError :: SkipTestDifficulty
6272 )
6373 }
6474}
@@ -214,12 +224,22 @@ fn check_geth_traces(
214224 verbose : bool ,
215225) -> Result < ( ) , StateTestError > {
216226 #[ cfg( feature = "skip-self-destruct" ) ]
227+ if geth_traces. iter ( ) . any ( |gt| {
228+ gt. struct_logs . iter ( ) . any ( |sl| {
229+ sl. op == eth_types:: evm_types:: OpcodeId :: SELFDESTRUCT
230+ || sl. op == eth_types:: evm_types:: OpcodeId :: INVALID ( 0xff )
231+ } )
232+ } ) {
233+ return Err ( StateTestError :: SkipTestSelfDestruct ) ;
234+ }
235+
236+ #[ cfg( feature = "scroll" ) ]
217237 if geth_traces. iter ( ) . any ( |gt| {
218238 gt. struct_logs
219239 . iter ( )
220- . any ( |sl| sl. op == eth_types:: evm_types:: OpcodeId :: SELFDESTRUCT )
240+ . any ( |sl| sl. op == eth_types:: evm_types:: OpcodeId :: DIFFICULTY )
221241 } ) {
222- return Err ( StateTestError :: SkipTestSelfDestruct ) ;
242+ return Err ( StateTestError :: SkipTestDifficulty ) ;
223243 }
224244
225245 if geth_traces[ 0 ] . struct_logs . len ( ) as u64 > suite. max_steps {
@@ -508,22 +528,22 @@ pub fn run_test(
508528
509529 #[ cfg( feature = "scroll" ) ]
510530 let result = trace_config_to_witness_block_l2 (
511- trace_config,
531+ trace_config. clone ( ) ,
512532 st,
513533 suite,
514534 circuits_params,
515535 circuits_config. verbose ,
516536 ) ?;
517537 #[ cfg( not( feature = "scroll" ) ) ]
518538 let result = trace_config_to_witness_block_l1 (
519- trace_config,
539+ trace_config. clone ( ) ,
520540 st,
521541 suite,
522542 circuits_params,
523543 circuits_config. verbose ,
524544 ) ?;
525545
526- let ( witness_block, builder) = match result {
546+ let ( witness_block, mut builder) = match result {
527547 Some ( ( witness_block, builder) ) => ( witness_block, builder) ,
528548 None => return Ok ( ( ) ) ,
529549 } ;
@@ -545,6 +565,35 @@ pub fn run_test(
545565 prover. assert_satisfied_par ( ) ;
546566 } ;
547567
568+ //#[cfg(feature = "scroll")]
569+ {
570+ // fill these "untouched" storage slots
571+ // It is better to fill these info after (instead of before) bus-mapping re-exec.
572+ // To prevent these data being used unexpectedly.
573+ for account in trace_config. accounts . values ( ) {
574+ builder. code_db . insert ( account. code . to_vec ( ) ) ;
575+ let ( exist, acc_in_local_sdb) = builder. sdb . get_account_mut ( & account. address ) ;
576+ if !exist {
577+ // modified from bus-mapping/src/mock.rs
578+ let keccak_code_hash = H256 ( keccak256 ( account. code . to_vec ( ) ) ) ;
579+ let code_hash = CodeDB :: hash ( & account. code . to_vec ( ) ) ;
580+ * acc_in_local_sdb = bus_mapping:: state_db:: Account {
581+ nonce : account. nonce ,
582+ balance : account. balance ,
583+ storage : account. storage . clone ( ) ,
584+ code_hash,
585+ keccak_code_hash,
586+ code_size : account. code . len ( ) . to_word ( ) ,
587+ } ;
588+ } else {
589+ for ( k, v) in & account. storage {
590+ if !acc_in_local_sdb. storage . contains_key ( k) {
591+ acc_in_local_sdb. storage . insert ( * k, * v) ;
592+ }
593+ }
594+ }
595+ }
596+ }
548597 check_post ( & builder, & post) ?;
549598
550599 Ok ( ( ) )
0 commit comments