Skip to content

Commit 678bc05

Browse files
authored
refactor(core): further decouple LEVM and rEVM implementations. (#2179)
**Motivation** Separate code from LEVM and rEVM implementations and try not to expose rEVM specific logic outside of vm crate. **Description** - Moved levm specific code to `backends/levm/...` - Moved revm specific coed to `backens/revm/...`
1 parent 2187998 commit 678bc05

File tree

27 files changed

+725
-631
lines changed

27 files changed

+725
-631
lines changed

cmd/ef_tests/state/runner/revm_runner.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use ethrex_levm::{
1515
};
1616
use ethrex_storage::{error::StoreError, AccountUpdate};
1717
use ethrex_vm::{
18-
backends::{self},
19-
db::{EvmState, StoreWrapper},
18+
backends::{self, revm::db::EvmState},
19+
db::StoreWrapper,
2020
fork_to_spec_id, RevmAddress, RevmU256,
2121
};
2222
use revm::{

cmd/ef_tests/state/utils.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ use crate::{
44
};
55
use ethrex_common::{types::Genesis, H256, U256};
66
use ethrex_storage::{EngineType, Store};
7-
use ethrex_vm::db::{evm_state, EvmState, StoreWrapper};
7+
use ethrex_vm::{
8+
backends::revm::db::{evm_state, EvmState},
9+
db::StoreWrapper,
10+
};
811
use spinoff::Spinner;
912

1013
/// Loads initial state, used for REVM as it contains EvmState.

crates/blockchain/blockchain.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use tracing::{error, info, warn};
3333

3434
#[derive(Debug)]
3535
pub struct Blockchain {
36-
evm_engine: EvmEngine,
36+
pub evm_engine: EvmEngine,
3737
storage: Store,
3838
pub mempool: Mempool,
3939
}

crates/l2/proposer/prover_server.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use ethrex_l2_sdk::calldata::{encode_calldata, Value};
1818
use ethrex_rpc::clients::eth::{eth_sender::Overrides, EthClient, WrappedTransaction};
1919
use ethrex_storage::Store;
2020
use ethrex_vm::{
21+
backends::revm::execution_db::{ExecutionDB, ToExecDB},
2122
db::StoreWrapper,
22-
execution_db::{ExecutionDB, ToExecDB},
2323
EvmError,
2424
};
2525
use secp256k1::SecretKey;

crates/l2/prover/bench/src/cache.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::{
44
};
55

66
use ethrex_common::types::{Block, BlockHeader};
7-
use ethrex_vm::execution_db::ExecutionDB;
7+
use ethrex_vm::backends::revm::execution_db::ExecutionDB;
88

99
use serde::{Deserialize, Serialize};
1010

crates/l2/prover/bench/src/rpc/db.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,10 @@ impl ToExecDB for RpcDB {
261261
fn to_exec_db(
262262
&self,
263263
block: &Block,
264-
) -> Result<ethrex_vm::execution_db::ExecutionDB, ethrex_vm::errors::ExecutionDBError> {
264+
) -> Result<
265+
ethrex_vm::backends::revm::execution_db::ExecutionDB,
266+
ethrex_vm::errors::ExecutionDBError,
267+
> {
265268
// TODO: Simplify this function and potentially merge with the implementation for
266269
// StoreWrapper.
267270

crates/l2/prover/tests/perf_zkvm.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use tracing::info;
77

88
use ethrex_prover_lib::prover::{Prover, Risc0Prover, Sp1Prover};
99
use ethrex_storage::{EngineType, Store};
10-
use ethrex_vm::{db::StoreWrapper, execution_db::ToExecDB};
10+
use ethrex_vm::{backends::revm::execution_db::ToExecDB, db::StoreWrapper};
1111
use zkvm_interface::io::ProgramInput;
1212

1313
#[tokio::test]

crates/l2/prover/zkvm/interface/risc0/src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use risc0_zkvm::guest::env;
22

33
use ethrex_blockchain::{validate_block, validate_gas_used};
4-
use ethrex_vm::{backends::revm::REVM, db::EvmState};
4+
use ethrex_vm::{backends::revm::db::EvmState, backends::revm::REVM};
55

66
use zkvm_interface::{
77
io::{ProgramInput, ProgramOutput},

crates/l2/prover/zkvm/interface/sp1/Cargo.lock

+18-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/l2/prover/zkvm/interface/sp1/src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#![no_main]
22

33
use ethrex_blockchain::{validate_block, validate_gas_used};
4-
use ethrex_vm::{backends::revm::REVM, db::EvmState};
4+
use ethrex_vm::{backends::revm::db::EvmState, backends::revm::REVM};
55
use zkvm_interface::{
66
io::{ProgramInput, ProgramOutput},
77
trie::{update_tries, verify_db},

crates/l2/prover/zkvm/interface/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub mod io {
2020
types::{Block, BlockHeader},
2121
H256,
2222
};
23-
use ethrex_vm::execution_db::ExecutionDB;
23+
use ethrex_vm::backends::revm::execution_db::ExecutionDB;
2424
use serde::{de::DeserializeOwned, Deserialize, Serialize};
2525
use serde_with::{serde_as, DeserializeAs, SerializeAs};
2626

@@ -84,7 +84,7 @@ pub mod trie {
8484
use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode, error::RLPDecodeError};
8585
use ethrex_storage::{hash_address, hash_key, AccountUpdate};
8686
use ethrex_trie::{Trie, TrieError};
87-
use ethrex_vm::execution_db::ExecutionDB;
87+
use ethrex_vm::backends::revm::execution_db::ExecutionDB;
8888
use thiserror::Error;
8989

9090
#[derive(Debug, Error)]

crates/l2/utils/prover/save_state.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ pub fn block_number_has_all_proofs(block_number: u64) -> Result<bool, SaveStateE
387387
mod tests {
388388
use ethrex_blockchain::Blockchain;
389389
use ethrex_storage::{EngineType, Store};
390-
use ethrex_vm::execution_db::ExecutionDB;
390+
use ethrex_vm::backends::revm::execution_db::ExecutionDB;
391391
use risc0_zkvm::sha::Digest;
392392
use sp1_recursion_gnark_ffi::PlonkBn254Proof;
393393
use sp1_sdk::{client::ProverClientBuilder, HashableKey, Prover, SP1Proof, SP1PublicValues};

crates/l2/utils/test_data_io.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use ethrex_blockchain::Blockchain;
55
use ethrex_common::types::{Block, Genesis};
66
use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode};
77
use ethrex_storage::{EngineType, Store};
8-
use ethrex_vm::{db::StoreWrapper, execution_db::ToExecDB};
8+
use ethrex_vm::{backends::revm::execution_db::ToExecDB, db::StoreWrapper};
99
use tracing::info;
1010
use zkvm_interface::io::ProgramInput;
1111

crates/networking/rpc/eth/transaction.rs

+47-41
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::sync::Arc;
2+
13
#[cfg(feature = "based")]
24
use crate::utils::RpcRequest;
35
use crate::{
@@ -9,6 +11,7 @@ use crate::{
911
utils::RpcErr,
1012
RpcApiContext, RpcHandler,
1113
};
14+
use ethrex_blockchain::Blockchain;
1215
use ethrex_common::{
1316
types::{AccessListEntry, BlockHash, BlockHeader, BlockNumber, GenericTransaction, TxKind},
1417
H256, U256,
@@ -17,7 +20,10 @@ use ethrex_common::{
1720
use ethrex_rlp::encode::RLPEncode;
1821
use ethrex_storage::Store;
1922

20-
use ethrex_vm::{db::evm_state, ExecutionResult, SpecId};
23+
use ethrex_vm::{
24+
backends::{revm::execution_result::ExecutionResult, Evm},
25+
SpecId,
26+
};
2127
use serde::Serialize;
2228

2329
use serde_json::Value;
@@ -106,7 +112,13 @@ impl RpcHandler for CallRequest {
106112
_ => return Ok(Value::Null),
107113
};
108114
// Run transaction
109-
let result = simulate_tx(&self.transaction, &header, context.storage, SpecId::CANCUN)?;
115+
let result = simulate_tx(
116+
&self.transaction,
117+
&header,
118+
context.storage,
119+
context.blockchain,
120+
SpecId::CANCUN,
121+
)?;
110122
serde_json::to_value(format!("0x{:#x}", result.output()))
111123
.map_err(|error| RpcErr::Internal(error.to_string()))
112124
}
@@ -320,38 +332,16 @@ impl RpcHandler for CreateAccessListRequest {
320332
// Block not found
321333
_ => return Ok(Value::Null),
322334
};
335+
336+
let mut vm = Evm::new(
337+
context.blockchain.evm_engine,
338+
context.storage.clone(),
339+
header.compute_block_hash(),
340+
);
341+
323342
// Run transaction and obtain access list
324-
let (gas_used, access_list, error) = match ethrex_vm::create_access_list(
325-
&self.transaction,
326-
&header,
327-
&mut evm_state(context.storage, header.compute_block_hash()),
328-
SpecId::CANCUN,
329-
)? {
330-
(
331-
ExecutionResult::Success {
332-
reason: _,
333-
gas_used,
334-
gas_refunded: _,
335-
logs: _,
336-
output: _,
337-
},
338-
access_list,
339-
) => (gas_used, access_list, None),
340-
(
341-
ExecutionResult::Revert {
342-
gas_used,
343-
output: _,
344-
},
345-
access_list,
346-
) => (
347-
gas_used,
348-
access_list,
349-
Some("Transaction Reverted".to_string()),
350-
),
351-
(ExecutionResult::Halt { reason, gas_used }, access_list) => {
352-
(gas_used, access_list, Some(reason))
353-
}
354-
};
343+
let (gas_used, access_list, error) =
344+
vm.create_access_list(&self.transaction, &header, SpecId::CANCUN)?;
355345
let result = AccessListResult {
356346
access_list: access_list
357347
.into_iter()
@@ -431,6 +421,7 @@ impl RpcHandler for EstimateGasRequest {
431421
}
432422
fn handle(&self, context: RpcApiContext) -> Result<Value, RpcErr> {
433423
let storage = &context.storage;
424+
let blockchain = &context.blockchain;
434425
let block = self.block.clone().unwrap_or_default();
435426
info!("Requested estimate on block: {}", block);
436427
let block_header = match block.resolve_block_header(storage)? {
@@ -464,6 +455,7 @@ impl RpcHandler for EstimateGasRequest {
464455
&value_transfer_transaction,
465456
&block_header,
466457
storage.clone(),
458+
blockchain.clone(),
467459
spec_id,
468460
);
469461
if let Ok(ExecutionResult::Success { .. }) = result {
@@ -491,7 +483,13 @@ impl RpcHandler for EstimateGasRequest {
491483
// Check whether the execution is possible
492484
let mut transaction = transaction.clone();
493485
transaction.gas = Some(highest_gas_limit);
494-
let result = simulate_tx(&transaction, &block_header, storage.clone(), spec_id)?;
486+
let result = simulate_tx(
487+
&transaction,
488+
&block_header,
489+
storage.clone(),
490+
blockchain.clone(),
491+
spec_id,
492+
)?;
495493

496494
let gas_used = result.gas_used();
497495
let gas_refunded = result.gas_refunded();
@@ -514,7 +512,13 @@ impl RpcHandler for EstimateGasRequest {
514512
}
515513
transaction.gas = Some(middle_gas_limit);
516514

517-
let result = simulate_tx(&transaction, &block_header, storage.clone(), spec_id);
515+
let result = simulate_tx(
516+
&transaction,
517+
&block_header,
518+
storage.clone(),
519+
blockchain.clone(),
520+
spec_id,
521+
);
518522
if let Ok(ExecutionResult::Success { .. }) = result {
519523
highest_gas_limit = middle_gas_limit;
520524
} else {
@@ -547,14 +551,16 @@ fn simulate_tx(
547551
transaction: &GenericTransaction,
548552
block_header: &BlockHeader,
549553
storage: Store,
554+
blockchain: Arc<Blockchain>,
550555
spec_id: SpecId,
551556
) -> Result<ExecutionResult, RpcErr> {
552-
match ethrex_vm::simulate_tx_from_generic(
553-
transaction,
554-
block_header,
555-
&mut evm_state(storage, block_header.compute_block_hash()),
556-
spec_id,
557-
)? {
557+
let mut vm = Evm::new(
558+
blockchain.evm_engine,
559+
storage.clone(),
560+
block_header.compute_block_hash(),
561+
);
562+
563+
match vm.simulate_tx_from_generic(transaction, block_header, spec_id)? {
558564
ExecutionResult::Revert {
559565
gas_used: _,
560566
output,

crates/vm/Cargo.toml

+8-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "ethrex-vm"
3-
version.workspace = true
4-
edition.workspace = true
3+
version = "0.1.0"
4+
edition = "2021"
55

66
[dependencies]
77
ethrex-common.workspace = true
@@ -11,18 +11,18 @@ ethrex-trie.workspace = true
1111
ethrex-rlp.workspace = true
1212

1313
revm = { version = "19.0.0", features = [
14-
"serde",
15-
"std",
16-
"serde-json",
17-
"optional_no_base_fee",
18-
"optional_block_gas_limit",
14+
"serde",
15+
"std",
16+
"serde-json",
17+
"optional_no_base_fee",
18+
"optional_block_gas_limit",
1919
], default-features = false }
2020

2121
# These dependencies must be kept up to date with the corresponding revm version, otherwise errors may pop up because of trait implementation mismatches
2222
revm-inspectors = { version = "0.15.0" }
2323
derive_more = { version = "1.0.0", features = ["full"] }
2424
revm-primitives = { version = "15.2.0", features = [
25-
"std",
25+
"std",
2626
], default-features = false }
2727
bytes.workspace = true
2828
thiserror.workspace = true
@@ -44,6 +44,3 @@ default = []
4444
l2 = []
4545
c-kzg = ["revm/c-kzg", "ethrex-levm/c-kzg", "ethrex-common/c-kzg"]
4646
blst = ["revm/blst"]
47-
48-
[profile.test]
49-
opt-level = 3

0 commit comments

Comments
 (0)