@@ -10,9 +10,11 @@ use alloy_trie::root::ordered_trie_root_with_encoder;
1010use eyre:: OptionExt ;
1111use io:: EvmSketchInput ;
1212use reth_chainspec:: ChainSpec ;
13+ use reth_consensus:: HeaderValidator ;
14+ use reth_ethereum_consensus:: EthBeaconConsensus ;
1315use reth_evm:: { ConfigureEvm , EvmEnv } ;
1416use reth_evm_ethereum:: { EthEvm , EthEvmConfig } ;
15- use reth_primitives:: Header ;
17+ use reth_primitives:: { Header , SealedHeader } ;
1618use revm:: {
1719 context:: TxEnv , database:: CacheDB , inspector:: NoOpInspector , Context , MainBuilder , MainContext ,
1820} ;
@@ -156,7 +158,7 @@ pub struct ClientExecutor<'a> {
156158 /// The block anchor.
157159 pub anchor : & ' a Anchor ,
158160 /// The genesis block specification.
159- pub genesis : & ' a Genesis ,
161+ pub chain_spec : Arc < ChainSpec > ,
160162 /// The database that the executor uses to access state.
161163 pub witness_db : TrieDB < ' a > ,
162164 /// All logs in the block.
@@ -166,16 +168,24 @@ pub struct ClientExecutor<'a> {
166168impl < ' a > ClientExecutor < ' a > {
167169 /// Instantiates a new [`ClientExecutor`]
168170 pub fn new ( state_sketch : & ' a EvmSketchInput ) -> Result < Self , ClientError > {
169- assert_eq ! (
170- state_sketch. anchor. header( ) . state_root,
171- state_sketch. state. state_root( ) ,
172- "State root mismatch"
173- ) ;
171+ let chain_spec = Arc :: new ( ChainSpec :: try_from ( & state_sketch. genesis ) . unwrap ( ) ) ;
172+ let validator = EthBeaconConsensus :: new ( chain_spec. clone ( ) ) ;
173+ let header = state_sketch. anchor . header ( ) ;
174+
175+ validator
176+ . validate_header ( & SealedHeader :: new_unhashed ( header. clone ( ) ) )
177+ . expect ( "the header in not valid" ) ;
178+
179+ assert_eq ! ( header. state_root, state_sketch. state. state_root( ) , "State root mismatch" ) ;
174180
175181 // verify that ancestors form a valid chain
176- let mut previous_header = state_sketch . anchor . header ( ) ;
182+ let mut previous_header = header;
177183 for ancestor in & state_sketch. ancestor_headers {
178184 let ancestor_hash = ancestor. hash_slow ( ) ;
185+
186+ validator
187+ . validate_header ( & SealedHeader :: new_unhashed ( ancestor. clone ( ) ) )
188+ . unwrap_or_else ( |_| panic ! ( "the ancestor {} header in not valid" , ancestor. number) ) ;
179189 assert_eq ! (
180190 previous_header. parent_hash, ancestor_hash,
181191 "block {} is not the parent of {}" ,
@@ -200,7 +210,7 @@ impl<'a> ClientExecutor<'a> {
200210
201211 Ok ( Self {
202212 anchor : & state_sketch. anchor ,
203- genesis : & state_sketch . genesis ,
213+ chain_spec ,
204214 witness_db : state_sketch. witness_db ( ) ?,
205215 logs,
206216 } )
@@ -211,7 +221,7 @@ impl<'a> ClientExecutor<'a> {
211221 /// Storage accesses are already validated against the `witness_db`'s state root.
212222 pub fn execute ( & self , call : ContractInput ) -> eyre:: Result < ContractPublicValues > {
213223 let cache_db = CacheDB :: new ( & self . witness_db ) ;
214- let mut evm = new_evm ( cache_db, self . anchor . header ( ) , U256 :: ZERO , self . genesis ) ;
224+ let mut evm = new_evm ( cache_db, self . anchor . header ( ) , U256 :: ZERO , self . chain_spec . clone ( ) ) ;
215225 let tx_output = evm. transact ( & call) ?;
216226 let tx_output_bytes = tx_output. result . output ( ) . ok_or_eyre ( "Error decoding result" ) ?;
217227 let resolved = self . anchor . resolve ( ) ;
@@ -247,13 +257,11 @@ pub fn new_evm<DB>(
247257 db : DB ,
248258 header : & Header ,
249259 difficulty : U256 ,
250- genesis : & Genesis ,
260+ chain_spec : Arc < ChainSpec > ,
251261) -> EthEvm < DB , NoOpInspector >
252262where
253263 DB : Database ,
254264{
255- let chain_spec = Arc :: new ( ChainSpec :: try_from ( genesis) . unwrap ( ) ) ;
256-
257265 let EvmEnv { cfg_env, mut block_env, .. } = EthEvmConfig :: new ( chain_spec) . evm_env ( header) ;
258266
259267 // Set the base fee to 0 to enable 0 gas price transactions.
0 commit comments