pub struct LEVM;Expand description
The struct implements the following functions: LEVM::execute_block LEVM::execute_tx LEVM::get_state_transitions LEVM::process_withdrawals
Implementations§
Source§impl LEVM
impl LEVM
Sourcepub fn rerun_block(
db: &mut GeneralizedDatabase,
block: &Block,
stop_index: Option<usize>,
vm_type: VMType,
crypto: &dyn Crypto,
) -> Result<(), EvmError>
pub fn rerun_block( db: &mut GeneralizedDatabase, block: &Block, stop_index: Option<usize>, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<(), EvmError>
Execute all transactions of the block up until a certain transaction specified in stop_index.
The goal is to just mutate the state up to that point, without needing to process transaction receipts or requests.
Sourcepub fn trace_tx_prestate(
db: &mut GeneralizedDatabase,
block_header: &BlockHeader,
tx: &Transaction,
diff_mode: bool,
include_empty: bool,
vm_type: VMType,
crypto: &dyn Crypto,
) -> Result<PrestateResult, EvmError>
pub fn trace_tx_prestate( db: &mut GeneralizedDatabase, block_header: &BlockHeader, tx: &Transaction, diff_mode: bool, include_empty: bool, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<PrestateResult, EvmError>
Executes tx and returns the prestateTracer result. diff_mode toggles between
pre-only and pre+post output. include_empty keeps entries that would otherwise
be all-default (must be false in diff mode). Assumes db already reflects all
prior txs in the block.
Sourcepub fn trace_tx_opcodes(
db: &mut GeneralizedDatabase,
block_header: &BlockHeader,
tx: &Transaction,
cfg: OpcodeTracerConfig,
vm_type: VMType,
crypto: &dyn Crypto,
) -> Result<OpcodeTraceResult, EvmError>
pub fn trace_tx_opcodes( db: &mut GeneralizedDatabase, block_header: &BlockHeader, tx: &Transaction, cfg: OpcodeTracerConfig, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<OpcodeTraceResult, EvmError>
Run transaction with opcode (EIP-3155) tracer activated.
Sourcepub fn trace_tx_calls(
db: &mut GeneralizedDatabase,
block_header: &BlockHeader,
tx: &Transaction,
only_top_call: bool,
with_log: bool,
vm_type: VMType,
crypto: &dyn Crypto,
) -> Result<CallTrace, EvmError>
pub fn trace_tx_calls( db: &mut GeneralizedDatabase, block_header: &BlockHeader, tx: &Transaction, only_top_call: bool, with_log: bool, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<CallTrace, EvmError>
Run transaction with callTracer activated.
Source§impl LEVM
impl LEVM
Sourcepub fn execute_block(
block: &Block,
db: &mut GeneralizedDatabase,
vm_type: VMType,
crypto: &dyn Crypto,
) -> Result<(BlockExecutionResult, Option<BlockAccessList>), EvmError>
pub fn execute_block( block: &Block, db: &mut GeneralizedDatabase, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<(BlockExecutionResult, Option<BlockAccessList>), EvmError>
Execute a block and return the execution result.
Also records and returns the Block Access List (EIP-7928) for Amsterdam+ forks.
The BAL will be None for pre-Amsterdam forks.
Sourcepub fn execute_block_pipeline(
block: &Block,
db: &mut GeneralizedDatabase,
vm_type: VMType,
merkleizer: Option<Sender<Vec<AccountUpdate>>>,
queue_length: &AtomicUsize,
crypto: &dyn Crypto,
header_bal: Option<&BlockAccessList>,
bal_parallel_exec_enabled: bool,
) -> Result<(BlockExecutionResult, Option<BlockAccessList>), EvmError>
pub fn execute_block_pipeline( block: &Block, db: &mut GeneralizedDatabase, vm_type: VMType, merkleizer: Option<Sender<Vec<AccountUpdate>>>, queue_length: &AtomicUsize, crypto: &dyn Crypto, header_bal: Option<&BlockAccessList>, bal_parallel_exec_enabled: bool, ) -> Result<(BlockExecutionResult, Option<BlockAccessList>), EvmError>
merkleizer is Some on the streaming (non-BAL) path; the BAL validation path
passes None because the caller merkleizes optimistically from the input BAL and
the EVM-side bal_to_account_updates send is then redundant work.
Sourcepub fn warm_block(
block: &Block,
store: Arc<dyn Database>,
vm_type: VMType,
crypto: &dyn Crypto,
cancelled: &AtomicBool,
) -> Result<(), EvmError>
pub fn warm_block( block: &Block, store: Arc<dyn Database>, vm_type: VMType, crypto: &dyn Crypto, cancelled: &AtomicBool, ) -> Result<(), EvmError>
Pre-warms state by executing all transactions in parallel, grouped by sender.
Transactions from the same sender are executed sequentially within their group to ensure correct nonce and balance propagation. Different sender groups run in parallel. This approach (inspired by Nethermind’s per-sender prewarmer) improves warmup accuracy by avoiding nonce mismatches within sender groups.
The store parameter should be a CachingDatabase-wrapped store so that
parallel workers can benefit from shared caching. The same cache should
be used by the sequential execution phase.
Sourcepub fn bal_storage_slots(bal: &BlockAccessList) -> Vec<(Address, H256)>
pub fn bal_storage_slots(bal: &BlockAccessList) -> Vec<(Address, H256)>
Flattened (address, slot) storage worklist for a BAL, in natural account order (slots grouped per account for storage-trie locality).
Sourcepub fn warm_block_from_bal(
bal: &BlockAccessList,
store: Arc<dyn Database>,
cancelled: &AtomicBool,
) -> Result<(), EvmError>
pub fn warm_block_from_bal( bal: &BlockAccessList, store: Arc<dyn Database>, cancelled: &AtomicBool, ) -> Result<(), EvmError>
Concurrent block warmer for the BAL path: prefetches account states and contract code while execution runs.
Storage slots are deliberately NOT warmed here. They are prefetched
synchronously before the executor starts (see bal_storage_slots and the
call site in blockchain.rs); warming them concurrently here let the
executor race the warmer to the trie for SSTORE original values and cost
~22% of CPU. Keep storage warming synchronous and up front.
pub fn execute_tx( tx: &Transaction, tx_sender: Address, block_header: &BlockHeader, db: &mut GeneralizedDatabase, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<ExecutionReport, EvmError>
pub fn undo_last_tx(db: &mut GeneralizedDatabase) -> Result<(), EvmError>
pub fn simulate_tx_from_generic( tx: &GenericTransaction, block_header: &BlockHeader, db: &mut GeneralizedDatabase, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<ExecutionResult, EvmError>
pub fn get_state_transitions( db: &mut GeneralizedDatabase, ) -> Result<Vec<AccountUpdate>, EvmError>
pub fn get_state_transitions_tx( db: &mut GeneralizedDatabase, ) -> Result<Vec<AccountUpdate>, EvmError>
pub fn process_withdrawals( db: &mut GeneralizedDatabase, withdrawals: &[Withdrawal], ) -> Result<(), EvmError>
pub fn beacon_root_contract_call( block_header: &BlockHeader, db: &mut GeneralizedDatabase, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<(), EvmError>
pub fn process_block_hash_history( block_header: &BlockHeader, db: &mut GeneralizedDatabase, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<(), EvmError>
pub fn create_access_list( tx: GenericTransaction, header: &BlockHeader, db: &mut GeneralizedDatabase, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<(ExecutionResult, AccessList), VMError>
pub fn prepare_block( block: &Block, db: &mut GeneralizedDatabase, vm_type: VMType, crypto: &dyn Crypto, ) -> Result<(), EvmError>
Trait Implementations§
Auto Trait Implementations§
impl Freeze for LEVM
impl RefUnwindSafe for LEVM
impl Send for LEVM
impl Sync for LEVM
impl Unpin for LEVM
impl UnsafeUnpin for LEVM
impl UnwindSafe for LEVM
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.