pub struct EvmEnvBuilder<P, F, S, B> { /* private fields */ }
host
only.Expand description
Builder for constructing an EvmEnv instance on the host.
The EvmEnvBuilder is used to configure and create an EvmEnv, which is the environment in which the Ethereum Virtual Machine (EVM) operates. This builder provides flexibility in setting up the EVM environment by allowing configuration of RPC endpoints, block numbers, and other parameters.
§Usage
The builder can be created using EvmEnv::builder(). Various configurations can be chained to
customize the environment before calling the build
function to create the final EvmEnv.
Implementations§
Source§impl<S> EvmEnvBuilder<(), EthEvmFactory, S, ()>
impl<S> EvmEnvBuilder<(), EthEvmFactory, S, ()>
Sourcepub fn rpc(
self,
url: Url,
) -> EvmEnvBuilder<RootProvider<Ethereum>, EthEvmFactory, S, ()>
pub fn rpc( self, url: Url, ) -> EvmEnvBuilder<RootProvider<Ethereum>, EthEvmFactory, S, ()>
Sets the Ethereum HTTP RPC endpoint that will be used by the EvmEnv.
Source§impl<F: EvmFactory, S> EvmEnvBuilder<(), F, S, ()>
impl<F: EvmFactory, S> EvmEnvBuilder<(), F, S, ()>
Source§impl<P, F: EvmFactory, B> EvmEnvBuilder<P, F, (), B>
impl<P, F: EvmFactory, B> EvmEnvBuilder<P, F, (), B>
Sourcepub fn chain_spec(
self,
chain_spec: &ChainSpec<F::Spec>,
) -> EvmEnvBuilder<P, F, &ChainSpec<F::Spec>, B>
pub fn chain_spec( self, chain_spec: &ChainSpec<F::Spec>, ) -> EvmEnvBuilder<P, F, &ChainSpec<F::Spec>, B>
Source§impl<P, S> EvmEnvBuilder<P, EthEvmFactory, S, ()>
impl<P, S> EvmEnvBuilder<P, EthEvmFactory, S, ()>
Sourcepub fn beacon_api(self, url: Url) -> EvmEnvBuilder<P, EthEvmFactory, S, Beacon>
pub fn beacon_api(self, url: Url) -> EvmEnvBuilder<P, EthEvmFactory, S, Beacon>
Source§impl<P, F, S, B> EvmEnvBuilder<P, F, S, B>
impl<P, F, S, B> EvmEnvBuilder<P, F, S, B>
Sourcepub fn block_number(self, number: u64) -> Self
pub fn block_number(self, number: u64) -> Self
Sets the block number to be used for the EVM execution.
Sourcepub fn block_number_or_tag(self, block: BlockNumberOrTag) -> Self
pub fn block_number_or_tag(self, block: BlockNumberOrTag) -> Self
Sets the block number or block tag (“latest”, “earliest”, “pending”) to be used for the EVM execution.
Sourcepub fn block_hash(self, hash: B256) -> Self
pub fn block_hash(self, hash: B256) -> Self
Sets the block hash to be used for the EVM execution.
Sourcepub fn eip1186_proof_chunk_size(self, chunk_size: usize) -> Self
pub fn eip1186_proof_chunk_size(self, chunk_size: usize) -> Self
Sets the chunk size for eth_getProof
calls (EIP-1186).
This configures the number of storage keys to request in a single call. The default is 1000, but this can be adjusted based on the RPC node configuration.
Source§impl<P, F: EvmFactory> EvmEnvBuilder<P, F, &ChainSpec<F::Spec>, ()>
impl<P, F: EvmFactory> EvmEnvBuilder<P, F, &ChainSpec<F::Spec>, ()>
Sourcepub async fn build<N>(
self,
) -> Result<EvmEnv<ProofDb<ProviderDb<N, P>>, F, HostCommit<()>>>
pub async fn build<N>( self, ) -> Result<EvmEnv<ProofDb<ProviderDb<N, P>>, F, HostCommit<()>>>
Builds and returns an EvmEnv with the configured settings that commits to a block hash.
Source§impl<P, S> EvmEnvBuilder<P, EthEvmFactory, S, Beacon>
impl<P, S> EvmEnvBuilder<P, EthEvmFactory, S, Beacon>
Sourcepub fn consensus_commitment(self) -> Self
pub fn consensus_commitment(self) -> Self
Configures the environment builder to generate consensus commitments.
A consensus commitment contains the beacon block root indexed directly by its slot number. This is in contrast to the default mechanism, which relies on timestamps for lookups, for verification using the EIP-4788 beacon root contract deployed at the execution layer.
The use of slot-based indexing is particularly beneficial for verification methods that have direct access to the state of the beacon chain, such as systems using beacon light clients. This allows the commitment to be verified directly against the state of the consensus layer.
§Example
let builder = EthEvmEnv::builder()
.rpc(Url::parse("https://ethereum-rpc.publicnode.com")?)
.beacon_api(Url::parse("https://ethereum-beacon-api.publicnode.com")?)
.chain_spec(Ð_MAINNET_CHAIN_SPEC)
// Configure the builder to use slot-indexed consensus commitments.
.consensus_commitment();
// The resulting 'env' will be configured to generate a consensus commitment
// (beacon root indexed by slot) when processing blocks or state.
let env = builder.build().await?;
Sourcepub fn commitment_block_hash(
self,
hash: BlockHash,
) -> EvmEnvBuilder<P, EthEvmFactory, S, History>
pub fn commitment_block_hash( self, hash: BlockHash, ) -> EvmEnvBuilder<P, EthEvmFactory, S, History>
Sets the block hash for the commitment block, which can be different from the execution block.
This allows for historical state execution while maintaining security through a more recent commitment. The commitment block must be more recent than the execution block.
Note that this feature requires a Beacon chain RPC provider, as it relies on EIP-4788.
§Example
let commitment_hash = B256::from_str("0x1234...")?;
let builder = EthEvmEnv::builder()
.rpc(Url::parse("https://ethereum-rpc.publicnode.com")?)
.beacon_api(Url::parse("https://ethereum-beacon-api.publicnode.com")?)
.block_number(1_000_000) // execute against historical state
.commitment_block_hash(commitment_hash) // commit to recent block
.chain_spec(Ð_MAINNET_CHAIN_SPEC);
let env = builder.build().await?;
Sourcepub fn commitment_block_number_or_tag(
self,
block: BlockNumberOrTag,
) -> EvmEnvBuilder<P, EthEvmFactory, S, History>
pub fn commitment_block_number_or_tag( self, block: BlockNumberOrTag, ) -> EvmEnvBuilder<P, EthEvmFactory, S, History>
Sets the block number or block tag (“latest”, “earliest”, “pending”) for the commitment.
See EvmEnvBuilder::commitment_block_hash for detailed documentation.
Sourcepub fn commitment_block_number(
self,
number: BlockNumber,
) -> EvmEnvBuilder<P, EthEvmFactory, S, History>
pub fn commitment_block_number( self, number: BlockNumber, ) -> EvmEnvBuilder<P, EthEvmFactory, S, History>
Sets the block number for the commitment.
See EvmEnvBuilder::commitment_block_hash for detailed documentation.
Source§impl<P> EvmEnvBuilder<P, EthEvmFactory, &ChainSpec<<EthEvmFactory as EvmFactory>::Spec>, Beacon>
impl<P> EvmEnvBuilder<P, EthEvmFactory, &ChainSpec<<EthEvmFactory as EvmFactory>::Spec>, Beacon>
Sourcepub async fn build(
self,
) -> Result<EthEvmEnv<ProofDb<ProviderDb<Ethereum, P>>, HostCommit<BeaconCommit>>>where
P: Provider<Ethereum>,
pub async fn build(
self,
) -> Result<EthEvmEnv<ProofDb<ProviderDb<Ethereum, P>>, HostCommit<BeaconCommit>>>where
P: Provider<Ethereum>,
Builds and returns an EvmEnv with the configured settings that commits to a beacon root.
Source§impl<P> EvmEnvBuilder<P, EthEvmFactory, &ChainSpec<<EthEvmFactory as EvmFactory>::Spec>, History>
impl<P> EvmEnvBuilder<P, EthEvmFactory, &ChainSpec<<EthEvmFactory as EvmFactory>::Spec>, History>
Sourcepub fn consensus_commitment(self) -> Self
pub fn consensus_commitment(self) -> Self
Configures the environment builder to generate consensus commitments.
See EvmEnvBuilder<P, EthBlockHeader, Beacon>::consensus_commitment for more info.
Sourcepub async fn build(
self,
) -> Result<EthEvmEnv<ProofDb<ProviderDb<Ethereum, P>>, HostCommit<HistoryCommit>>>where
P: Provider<Ethereum>,
pub async fn build(
self,
) -> Result<EthEvmEnv<ProofDb<ProviderDb<Ethereum, P>>, HostCommit<HistoryCommit>>>where
P: Provider<Ethereum>,
Builds and returns an EvmEnv with the configured settings, using a dedicated commitment block that is different from the execution block.
Trait Implementations§
Auto Trait Implementations§
impl<P, F, S, B> Freeze for EvmEnvBuilder<P, F, S, B>
impl<P, F, S, B> RefUnwindSafe for EvmEnvBuilder<P, F, S, B>
impl<P, F, S, B> Send for EvmEnvBuilder<P, F, S, B>
impl<P, F, S, B> Sync for EvmEnvBuilder<P, F, S, B>
impl<P, F, S, B> Unpin for EvmEnvBuilder<P, F, S, B>
impl<P, F, S, B> UnwindSafe for EvmEnvBuilder<P, F, S, B>
Blanket Implementations§
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
§fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
TxEnv
] from a transaction and a sender address.§impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
§fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
TxEnv
] from a transaction, its sender, and encoded transaction bytes.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.