diff --git a/Cargo.lock b/Cargo.lock index 755a515d28..ffd1abb446 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3404,6 +3404,7 @@ dependencies = [ "revm-database", "revm-database-interface", "revm-handler", + "revm-inspector", "revm-interpreter", "revm-precompile", "revm-primitives", @@ -3503,6 +3504,7 @@ dependencies = [ "revm-context", "revm-context-interface", "revm-database", + "revm-database-interface", "revm-interpreter", "revm-precompile", "revm-primitives", @@ -3517,7 +3519,14 @@ version = "1.0.0-alpha.1" dependencies = [ "auto_impl", "revm", + "revm-context", "revm-database", + "revm-database-interface", + "revm-handler", + "revm-interpreter", + "revm-precompile", + "revm-primitives", + "revm-state", "serde", "serde_json", ] diff --git a/crates/context/src/lib.rs b/crates/context/src/lib.rs index 92dac6bbac..1ffb0fc8b7 100644 --- a/crates/context/src/lib.rs +++ b/crates/context/src/lib.rs @@ -5,6 +5,8 @@ #[cfg(not(feature = "std"))] extern crate alloc as std; +pub use context_interface::*; + pub mod block; pub mod cfg; pub mod context; diff --git a/crates/database/src/lib.rs b/crates/database/src/lib.rs index 322ce95972..9e582e348e 100644 --- a/crates/database/src/lib.rs +++ b/crates/database/src/lib.rs @@ -7,6 +7,8 @@ extern crate alloc as std; #[cfg(feature = "alloydb")] mod alloydb; +pub use database_interface::*; + pub mod in_memory_db; pub mod states; diff --git a/crates/handler/Cargo.toml b/crates/handler/Cargo.toml index 1249467fa0..3692881fee 100644 --- a/crates/handler/Cargo.toml +++ b/crates/handler/Cargo.toml @@ -23,6 +23,7 @@ all = "warn" [dependencies] # revm +database-interface.workspace = true interpreter.workspace = true precompile.workspace = true context-interface.workspace = true diff --git a/crates/handler/src/evm.rs b/crates/handler/src/evm.rs new file mode 100644 index 0000000000..dcefc877e7 --- /dev/null +++ b/crates/handler/src/evm.rs @@ -0,0 +1,73 @@ +use crate::{instructions::EthInstructions, EthFrame, Handler, MainnetHandler, PrecompileProvider}; +use context::{ + result::{EVMError, ExecutionResult, HaltReason, InvalidTransaction, ResultAndState}, + setters::ContextSetters, + ContextTr, Database, Evm, Journal, +}; +use database_interface::DatabaseCommit; +use interpreter::{interpreter::EthInterpreter, InterpreterResult}; +use primitives::Log; +use state::EvmState; +use std::vec::Vec; + +/// Execute EVM transactions. +pub trait ExecuteEvm: ContextSetters { + type Output; + + fn transact_previous(&mut self) -> Self::Output; + + fn transact(&mut self, tx: Self::Tx) -> Self::Output { + self.set_tx(tx); + self.transact_previous() + } +} + +/// Execute EVM transactions and commit to the state. +/// TODO this trait can be implemented for all ExecuteEvm for specific Output/CommitOutput +pub trait ExecuteCommitEvm: ExecuteEvm { + type CommitOutput; + + fn transact_commit_previous(&mut self) -> Self::CommitOutput; + + fn transact_commit(&mut self, tx: Self::Tx) -> Self::CommitOutput { + self.set_tx(tx); + self.transact_commit_previous() + } +} + +impl ExecuteEvm + for Evm, PRECOMPILES> +where + CTX: ContextSetters + ContextTr)>>, + PRECOMPILES: PrecompileProvider, +{ + type Output = Result< + ResultAndState, + EVMError<::Error, InvalidTransaction>, + >; + + fn transact_previous(&mut self) -> Self::Output { + let mut t = MainnetHandler::<_, _, EthFrame<_, _, _>>::default(); + t.run(self) + } +} + +impl ExecuteCommitEvm + for Evm, PRECOMPILES> +where + CTX: ContextSetters + + ContextTr)>, Db: DatabaseCommit>, + PRECOMPILES: PrecompileProvider, +{ + type CommitOutput = Result< + ExecutionResult, + EVMError<::Error, InvalidTransaction>, + >; + + fn transact_commit_previous(&mut self) -> Self::CommitOutput { + self.transact_previous().map(|r| { + self.db().commit(r.state); + r.result + }) + } +} diff --git a/crates/handler/src/lib.rs b/crates/handler/src/lib.rs index dc3dd1b4a0..d8d76d58db 100644 --- a/crates/handler/src/lib.rs +++ b/crates/handler/src/lib.rs @@ -7,6 +7,7 @@ extern crate alloc as std; // Mainnet related handlers. +pub mod evm; pub mod execution; mod frame; mod frame_data; @@ -20,6 +21,7 @@ mod precompile_provider; pub mod validation; // Public exports +pub use evm::{ExecuteCommitEvm, ExecuteEvm}; pub use frame::{return_create, return_eofcreate, ContextTrDbError, EthFrame, Frame}; pub use frame_data::{FrameData, FrameResult}; pub use handler::{EvmTr, EvmTrError, Handler}; diff --git a/crates/inspector/Cargo.toml b/crates/inspector/Cargo.toml index f46942891b..5c728b079d 100644 --- a/crates/inspector/Cargo.toml +++ b/crates/inspector/Cargo.toml @@ -23,7 +23,14 @@ all = "warn" [dependencies] # revm -revm.workspace = true +context.workspace = true +database-interface.workspace = true +handler.workspace = true +precompile.workspace = true +primitives.workspace = true +state.workspace = true +interpreter.workspace = true + auto_impl.workspace = true # Optional diff --git a/crates/inspector/src/eip3155.rs b/crates/inspector/src/eip3155.rs index a351dff95f..a268d41746 100644 --- a/crates/inspector/src/eip3155.rs +++ b/crates/inspector/src/eip3155.rs @@ -1,18 +1,14 @@ use crate::inspectors::GasInspector; use crate::Inspector; -use revm::interpreter::interpreter_types::{RuntimeFlag, SubRoutineStack}; -use revm::{ - bytecode::opcode::OpCode, - context::Cfg, - context_interface::{ContextTr, Journal, Transaction}, - interpreter::{ - interpreter_types::{Jumps, LoopControl, MemoryTr, StackTr}, - CallInputs, CallOutcome, CreateInputs, CreateOutcome, Interpreter, InterpreterResult, - InterpreterTypes, Stack, - }, - primitives::{hex, HashMap, B256, U256}, +use context::{Cfg, ContextTr, Journal, Transaction}; +use interpreter::{ + interpreter_types::{Jumps, LoopControl, MemoryTr, RuntimeFlag, StackTr, SubRoutineStack}, + CallInputs, CallOutcome, CreateInputs, CreateOutcome, Interpreter, InterpreterResult, + InterpreterTypes, Stack, }; +use primitives::{hex, HashMap, B256, U256}; use serde::Serialize; +use state::bytecode::opcode::OpCode; use std::io::Write; /// [EIP-3155](https://eips.ethereum.org/EIPS/eip-3155) tracer [Inspector]. diff --git a/crates/inspector/src/gas.rs b/crates/inspector/src/gas.rs index af0da88d4c..318bc5b7cd 100644 --- a/crates/inspector/src/gas.rs +++ b/crates/inspector/src/gas.rs @@ -1,5 +1,5 @@ //! GasIspector. Helper Inspector to calculate gas for others. -use revm::interpreter::{CallOutcome, CreateOutcome, Gas}; +use interpreter::{CallOutcome, CreateOutcome, Gas}; /// Helper that keeps track of gas. #[allow(dead_code)] diff --git a/crates/inspector/src/inspect.rs b/crates/inspector/src/inspect.rs index 81301151a2..8012b8dec2 100644 --- a/crates/inspector/src/inspect.rs +++ b/crates/inspector/src/inspect.rs @@ -1,4 +1,5 @@ -use revm::{context::setters::ContextSetters, ExecuteCommitEvm, ExecuteEvm}; +use context::setters::ContextSetters; +use handler::evm::{ExecuteCommitEvm, ExecuteEvm}; pub trait InspectEvm: ExecuteEvm { type Inspector; diff --git a/crates/inspector/src/inspector.rs b/crates/inspector/src/inspector.rs index 5ad0558336..fc3db19732 100644 --- a/crates/inspector/src/inspector.rs +++ b/crates/inspector/src/inspector.rs @@ -1,22 +1,20 @@ use crate::{InspectorEvmTr, InspectorFrame}; use auto_impl::auto_impl; -use revm::{ - context::{Cfg, JournalEntry, JournaledState}, - context_interface::{result::ResultAndState, ContextTr, Database, Transaction}, - handler::{ - execution, EvmTr, Frame, FrameInitOrResult, FrameOrResult, FrameResult, Handler, - ItemOrResult, - }, - interpreter::{ - interpreter::EthInterpreter, - interpreter_types::{Jumps, LoopControl}, - table::InstructionTable, - CallInputs, CallOutcome, CreateInputs, CreateOutcome, EOFCreateInputs, FrameInput, Host, - InitialAndFloorGas, InstructionResult, Interpreter, InterpreterAction, InterpreterTypes, - }, - primitives::{Address, Log, U256}, - state::EvmState, +use context::{ + result::ResultAndState, Cfg, ContextTr, Database, JournalEntry, JournaledState, Transaction, }; +use handler::{ + execution, EvmTr, Frame, FrameInitOrResult, FrameOrResult, FrameResult, Handler, ItemOrResult, +}; +use interpreter::{ + interpreter::EthInterpreter, + interpreter_types::{Jumps, LoopControl}, + table::InstructionTable, + CallInputs, CallOutcome, CreateInputs, CreateOutcome, EOFCreateInputs, FrameInput, Host, + InitialAndFloorGas, InstructionResult, Interpreter, InterpreterAction, InterpreterTypes, +}; +use primitives::{Address, Log, U256}; +use state::EvmState; use std::{vec, vec::Vec}; /// EVM [Interpreter] callbacks. diff --git a/crates/inspector/src/mainnet_inspect.rs b/crates/inspector/src/mainnet_inspect.rs index 01005b7dd4..7ed9807d52 100644 --- a/crates/inspector/src/mainnet_inspect.rs +++ b/crates/inspector/src/mainnet_inspect.rs @@ -1,20 +1,17 @@ -use revm::{ - context::{setters::ContextSetters, Evm}, - context_interface::{ContextTr, Journal}, - handler::{ - instructions::EthInstructions, EthFrame, EvmTr, EvmTrError, Frame, FrameResult, Handler, - MainnetHandler, PrecompileProvider, - }, - interpreter::{interpreter::EthInterpreter, FrameInput, InterpreterResult}, - primitives::Log, - state::EvmState, - DatabaseCommit, +use context::{setters::ContextSetters, ContextTr, Evm, Journal}; +use database_interface::DatabaseCommit; +use handler::{ + instructions::EthInstructions, EthFrame, EvmTr, EvmTrError, Frame, FrameResult, Handler, + MainnetHandler, PrecompileProvider, }; +use interpreter::{interpreter::EthInterpreter, FrameInput, InterpreterResult}; +use primitives::Log; +use state::EvmState; use std::vec::Vec; use crate::{ - InspectCommitEvm, InspectEvm, Inspector, InspectorEvmTr, InspectorFrame, InspectorHandler, - JournalExt, + inspect::{InspectCommitEvm, InspectEvm}, + Inspector, InspectorEvmTr, InspectorFrame, InspectorHandler, JournalExt, }; impl InspectorHandler for MainnetHandler diff --git a/crates/inspector/src/noop.rs b/crates/inspector/src/noop.rs index a8c0cbe8c4..776dbe99f6 100644 --- a/crates/inspector/src/noop.rs +++ b/crates/inspector/src/noop.rs @@ -1,5 +1,5 @@ use crate::inspector::Inspector; -use revm::interpreter::InterpreterTypes; +use interpreter::InterpreterTypes; /// Dummy [Inspector], helpful as standalone replacement. #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] diff --git a/crates/inspector/src/traits.rs b/crates/inspector/src/traits.rs index bb822a6a99..fdee6c3df2 100644 --- a/crates/inspector/src/traits.rs +++ b/crates/inspector/src/traits.rs @@ -1,17 +1,14 @@ use crate::{inspect_instructions, Inspector, JournalExt}; -use revm::{ - context::{setters::ContextSetters, Evm}, - context_interface::ContextTr, - handler::{ - instructions::InstructionProvider, ContextTrDbError, EthFrame, EvmTr, Frame, - FrameInitOrResult, PrecompileProvider, - }, - interpreter::{ - interpreter::EthInterpreter, FrameInput, Interpreter, InterpreterAction, InterpreterResult, - InterpreterTypes, - }, - precompile::PrecompileErrors, +use context::{setters::ContextSetters, ContextTr, Evm}; +use handler::{ + instructions::InstructionProvider, ContextTrDbError, EthFrame, EvmTr, Frame, FrameInitOrResult, + PrecompileProvider, }; +use interpreter::{ + interpreter::EthInterpreter, FrameInput, Interpreter, InterpreterAction, InterpreterResult, + InterpreterTypes, +}; +use precompile::PrecompileErrors; /// Inspector EVM trait. pub trait InspectorEvmTr: EvmTr { diff --git a/crates/revm/Cargo.toml b/crates/revm/Cargo.toml index e89915339c..83e5fbe7aa 100644 --- a/crates/revm/Cargo.toml +++ b/crates/revm/Cargo.toml @@ -24,8 +24,10 @@ all = "warn" [dependencies] # revm interpreter.workspace = true +inspector.workspace = true precompile.workspace = true primitives.workspace = true +database.workspace = true database-interface.workspace = true state.workspace = true specification.workspace = true diff --git a/crates/revm/src/exec_inspect.rs b/crates/revm/src/exec_inspect.rs deleted file mode 100644 index 95025f7c5e..0000000000 --- a/crates/revm/src/exec_inspect.rs +++ /dev/null @@ -1,26 +0,0 @@ -use context::setters::ContextSetters; - -/// Execute EVM transactions. -pub trait ExecuteEvm: ContextSetters { - type Output; - - fn transact_previous(&mut self) -> Self::Output; - - fn transact(&mut self, tx: Self::Tx) -> Self::Output { - self.set_tx(tx); - self.transact_previous() - } -} - -/// Execute EVM transactions and commit to the state. -/// TODO this trait can be implemented for all ExecuteEvm for specific Output/CommitOutput -pub trait ExecuteCommitEvm: ExecuteEvm { - type CommitOutput; - - fn transact_commit_previous(&mut self) -> Self::CommitOutput; - - fn transact_commit(&mut self, tx: Self::Tx) -> Self::CommitOutput { - self.set_tx(tx); - self.transact_commit_previous() - } -} diff --git a/crates/revm/src/lib.rs b/crates/revm/src/lib.rs index cadc161584..c52888d53d 100644 --- a/crates/revm/src/lib.rs +++ b/crates/revm/src/lib.rs @@ -9,8 +9,10 @@ extern crate alloc as std; pub use bytecode; pub use context; pub use context_interface; +pub use database; pub use database_interface; pub use handler; +pub use inspector; pub use interpreter; pub use precompile; pub use primitives; @@ -19,14 +21,13 @@ pub use state; // Modules. -mod exec_inspect; mod mainnet_builder; -mod mainnet_exec; // Export items. pub use context::journaled_state::{JournalEntry, JournaledState}; pub use context::Context; pub use database_interface::{Database, DatabaseCommit, DatabaseRef}; -pub use exec_inspect::{ExecuteCommitEvm, ExecuteEvm}; +pub use handler::{ExecuteCommitEvm, ExecuteEvm}; +pub use inspector::{InspectCommitEvm, InspectEvm, Inspector}; pub use mainnet_builder::{MainBuilder, MainContext, MainnetEvm}; diff --git a/crates/revm/src/mainnet_builder.rs b/crates/revm/src/mainnet_builder.rs index ef0b6e2992..439c28069d 100644 --- a/crates/revm/src/mainnet_builder.rs +++ b/crates/revm/src/mainnet_builder.rs @@ -66,3 +66,58 @@ impl MainContext for Context ExecuteEvm - for Evm, PRECOMPILES> -where - CTX: ContextSetters + ContextTr)>>, - PRECOMPILES: PrecompileProvider, -{ - type Output = Result< - ResultAndState, - EVMError<::Error, InvalidTransaction>, - >; - - fn transact_previous(&mut self) -> Self::Output { - let mut t = MainnetHandler::<_, _, EthFrame<_, _, _>>::default(); - t.run(self) - } -} - -impl ExecuteCommitEvm - for Evm, PRECOMPILES> -where - CTX: ContextSetters - + ContextTr)>, Db: DatabaseCommit>, - PRECOMPILES: PrecompileProvider, -{ - type CommitOutput = Result< - ExecutionResult, - EVMError<::Error, InvalidTransaction>, - >; - - fn transact_commit_previous(&mut self) -> Self::CommitOutput { - self.transact_previous().map(|r| { - self.db().commit(r.state); - r.result - }) - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::{MainBuilder, MainContext}; - use alloy_eip7702::Authorization; - use alloy_signer::SignerSync; - use alloy_signer_local::PrivateKeySigner; - use bytecode::{ - opcode::{PUSH1, SSTORE}, - Bytecode, - }; - use context::Context; - use context_interface::TransactionType; - use database::{BenchmarkDB, EEADDRESS, FFADDRESS}; - use primitives::{TxKind, U256}; - use specification::hardfork::SpecId; - - #[test] - fn sanity_eip7702_tx() { - let signer = PrivateKeySigner::random(); - let auth = Authorization { - chain_id: U256::ZERO, - nonce: 0, - address: FFADDRESS, - }; - let signature = signer.sign_hash_sync(&auth.signature_hash()).unwrap(); - let auth = auth.into_signed(signature); - - let bytecode = Bytecode::new_legacy([PUSH1, 0x01, PUSH1, 0x01, SSTORE].into()); - - let ctx = Context::mainnet() - .modify_cfg_chained(|cfg| cfg.spec = SpecId::PRAGUE) - .with_db(BenchmarkDB::new_bytecode(bytecode)) - .modify_tx_chained(|tx| { - tx.tx_type = TransactionType::Eip7702.into(); - tx.gas_limit = 100_000; - tx.authorization_list = vec![auth]; - tx.caller = EEADDRESS; - tx.kind = TxKind::Call(signer.address()); - }); - - let mut evm = ctx.build_mainnet(); - - let ok = evm.transact_previous().unwrap(); - - let auth_acc = ok.state.get(&signer.address()).unwrap(); - assert_eq!(auth_acc.info.code, Some(Bytecode::new_eip7702(FFADDRESS))); - assert_eq!(auth_acc.info.nonce, 1); - assert_eq!( - auth_acc.storage.get(&U256::from(1)).unwrap().present_value, - U256::from(1) - ); - } -}