Crate example_my_evm

Source
Expand description

§Custom EVM Implementation Example: MyEvm

This example demonstrates how to create a custom EVM variant that modifies core behavior, specifically by disabling the beneficiary reward mechanism.

§Core Components

To implement a custom EVM variant, two key components are needed:

  1. A custom EVM struct (crate::MyEvm in crate::evm) that implements revm::handler::EvmTr
  2. A custom handler (MyHandler) in crate::handler that controls execution behavior and implements revm::handler::Handler

Basic usage after implementing these two components:

let mut my_evm = MyEvm::new(Context::mainnet(), ());
let _res = MyHandler::default().run(&mut my_evm);

§Adding Inspector Support

To enable transaction inspection capabilities, implement two additional traits:

This allows integration with revm::Inspector for transaction tracing:

let mut my_evm = MyEvm::new(Context::mainnet(), revm::inspector::NoOpInspector);
let _res = MyHandler::default().inspect_run(&mut my_evm);

§High-Level Execution APIs

The example includes several trait implementations in crate::api that provide convenient high-level interfaces:

§revm::ExecuteEvm

Provides a simplified interface that abstracts away handler complexity:

let mut my_evm = MyEvm::new(Context::mainnet(), ());
// Execute a new transaction
let _result_and_state = my_evm.transact(TxEnv::default());
// Replay the last transaction
let _res_and_state = my_evm.replay();

§revm::ExecuteCommitEvm

Extends revm::ExecuteEvm with database commit functionality. Requires the database to implement revm::DatabaseCommit:

let mut my_evm = MyEvm::new(Context::mainnet().with_db(InMemoryDB::default()), ());
let _res = my_evm.transact_commit(TxEnv::default());

§revm::InspectEvm

Extends revm::ExecuteEvm with inspection methods that allow monitoring execution without committing changes:

let mut my_evm = MyEvm::new(Context::mainnet(), revm::inspector::NoOpInspector);
// Inspect without committing
let _res = my_evm.inspect_replay();
// Inspect and commit
let _res = my_evm.inspect_commit_replay();

Re-exports§

pub use evm::*;
pub use handler::*;

Modules§

api
evm
handler