11use alloy_consensus:: { transaction:: SignerRecoverable , BlockHeader , Transaction } ;
2- use alloy_network:: { BlockResponse , Network } ;
3- use alloy_provider:: Provider ;
2+ use alloy_network:: { BlockResponse , Ethereum , Network } ;
3+ use alloy_primitives:: map:: HashMap ;
4+ use alloy_provider:: { DynProvider , Provider , ProviderBuilder } ;
45use anyhow:: { bail, Context } ;
56use morph_revm:: MorphTxEnv ;
67use prover_executor_core:: MorphExecutor ;
7- use prover_primitives:: { MorphTxEnvelope , B256 } ;
8- use prover_storage:: basic_rpc_db:: { BasicRpcDb , RpcDb } ;
8+ use prover_mpt:: EthereumState ;
9+ use prover_primitives:: { types:: BlockTrace , Block , MorphTxEnvelope , B256 } ;
10+ use prover_storage:: {
11+ basic_rpc_db:: { BasicRpcDb , RpcDb } ,
12+ trace_to_execution_witness, TrieDB ,
13+ } ;
14+ use prover_utils:: provider:: { get_block_trace, get_block_traces} ;
915use reth_trie:: { HashedPostState , KeccakKeyHasher } ;
1016use revm:: {
1117 context:: BlockEnv ,
12- database:: { BundleState , State } ,
13- ExecuteEvm ,
18+ database:: { states:: bundle_state:: BundleRetention , BundleState , State } ,
19+ state:: Bytecode ,
20+ ExecuteCommitEvm , ExecuteEvm ,
1421} ;
1522
1623/// An executor that fetches data from a [Provider] to execute blocks in the [ClientExecutor].
@@ -38,10 +45,11 @@ impl HostExecutor {
3845
3946 // Init db.
4047 let rpc_db = BasicRpcDb :: new ( provider. clone ( ) , block_number, B256 :: default ( ) ) ;
41- let bundle_state = BundleState :: default ( ) ;
48+
49+ // let (trie_db, mut orgin_state) = build_trie_db(block_number, provider).await.unwrap();
4250 let state = State :: builder ( )
4351 . with_database_ref ( & rpc_db)
44- . with_bundle_prestate ( bundle_state )
52+ . with_bundle_update ( )
4553 . without_state_clear ( )
4654 . build ( ) ;
4755 let block_env = BlockEnv :: default ( ) ;
@@ -51,7 +59,7 @@ impl HostExecutor {
5159 // Execute transactions in block.
5260 for tx in evm_txns {
5361 let recovered_from = tx. recover_signer ( ) . context ( "tx recover signer error" ) ?;
54- let tx = revm:: context:: TxEnv {
62+ let tx_env = revm:: context:: TxEnv {
5563 caller : recovered_from,
5664 nonce : tx. nonce ( ) ,
5765 gas_price : tx. gas_price ( ) . unwrap_or_default ( ) ,
@@ -62,22 +70,19 @@ impl HostExecutor {
6270 ..Default :: default ( )
6371 } ;
6472 let morph_tx =
65- MorphTxEnv { inner : tx , rlp_bytes : Default :: default ( ) , fee_token_id : 1u16 } ;
73+ MorphTxEnv { inner : tx_env , rlp_bytes : Some ( tx . rlp ( ) ) , .. Default :: default ( ) } ;
6674
67- let _rt = evm. inner . transact ( morph_tx) . context ( "tx transact error" ) ?;
75+ let _rt = evm. inner . transact_commit ( morph_tx) . context ( "tx transact error" ) ?;
6876 }
77+ evm. inner . ctx . journaled_state . database . merge_transitions ( BundleRetention :: Reverts ) ;
6978 let bundle_state = evm. inner . ctx . journaled_state . database . take_bundle ( ) ;
70- let state = rpc_db. state ( & bundle_state) . await ?;
71- drop ( evm) ;
72- // drop(rpc_db);
79+ let mut state = rpc_db. state ( & bundle_state) . await ?;
7380 // Verify post state root.
74-
7581 let hashed_post_state =
7682 HashedPostState :: from_bundle_state :: < KeccakKeyHasher > ( & bundle_state. state ) ;
77- let mut mutated_state = state. clone ( ) ;
78- mutated_state. update ( & hashed_post_state) ;
83+ state. update ( & hashed_post_state) ;
7984
80- let computed_state_root = mutated_state . state_root ( ) ;
85+ let computed_state_root = state . state_root ( ) ;
8186 let expected_state_root = block. header ( ) . state_root ( ) ;
8287 if computed_state_root != expected_state_root {
8388 bail ! (
@@ -88,6 +93,32 @@ impl HostExecutor {
8893 }
8994}
9095
96+ // async fn build_trie_db<P, N>(
97+ // block_number: u64,
98+ // provider: &P,
99+ // ) -> Result<(TrieDB<'_>, EthereumState), String>
100+ // where
101+ // P: Provider<N> + Clone + std::fmt::Debug,
102+ // N: Network,
103+ // {
104+ // let trace = get_block_trace::<BlockTrace, P, N>(block_number, &provider).await.unwrap();
105+ // let witness = trace_to_execution_witness(&trace).unwrap();
106+ // let state = EthereumState::from_execution_witness(&witness, trace.root_before());
107+ // let bytecodes =
108+ // witness.codes.into_iter().map(|code| Bytecode::new_raw(code)).collect::<Vec<_>>();
109+ // let bytecodes_by_hash =
110+ // bytecodes.iter().map(|code| (code.hash_slow(), code)).collect::<HashMap<_, _>>();
111+ // let block_hashes: HashMap<u64, B256> = HashMap::with_hasher(Default::default());
112+ // let statea= state.clone();
113+ // Ok((TrieDB::new(&state.clone(), block_hashes, bytecodes_by_hash), statea))
114+ // }
115+
91116fn _to_prover_tx ( _txns : & Vec < alloy_rpc_types:: Transaction > ) -> Vec < MorphTxEnvelope > {
92117 vec ! [ ]
93118}
119+
120+ #[ test]
121+ fn test_execute_host ( ) {
122+ let provider =
123+ ProviderBuilder :: new ( ) . connect_http ( "http://127.0.0.1:8545" . parse ( ) . unwrap ( ) ) . erased ( ) ;
124+ }
0 commit comments