feat: EvmEnvConfig trait (#6051)

This commit is contained in:
Dan Cline
2024-01-25 17:40:12 -05:00
committed by GitHub
parent abe3358b36
commit acccf1441e
63 changed files with 1003 additions and 391 deletions

View File

@ -18,6 +18,7 @@ reth-interfaces.workspace = true
reth-db.workspace = true
reth-trie.workspace = true
reth-nippy-jar.workspace = true
reth-node-api.workspace = true
revm.workspace = true

View File

@ -11,6 +11,7 @@ use crate::{
};
use reth_db::{database::Database, init_db, models::StoredBlockBodyIndices, DatabaseEnv};
use reth_interfaces::{provider::ProviderResult, RethError, RethResult};
use reth_node_api::EvmEnvConfig;
use reth_primitives::{
snapshot::HighestSnapshots,
stage::{StageCheckpoint, StageId},
@ -437,22 +438,30 @@ impl<DB: Database> StageCheckpointReader for ProviderFactory<DB> {
}
impl<DB: Database> EvmEnvProvider for ProviderFactory<DB> {
fn fill_env_at(
fn fill_env_at<EvmConfig>(
&self,
cfg: &mut CfgEnv,
block_env: &mut BlockEnv,
at: BlockHashOrNumber,
) -> ProviderResult<()> {
self.provider()?.fill_env_at(cfg, block_env, at)
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
self.provider()?.fill_env_at(cfg, block_env, at, evm_config)
}
fn fill_env_with_header(
fn fill_env_with_header<EvmConfig>(
&self,
cfg: &mut CfgEnv,
block_env: &mut BlockEnv,
header: &Header,
) -> ProviderResult<()> {
self.provider()?.fill_env_with_header(cfg, block_env, header)
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
self.provider()?.fill_env_with_header(cfg, block_env, header, evm_config)
}
fn fill_block_env_at(
@ -471,12 +480,28 @@ impl<DB: Database> EvmEnvProvider for ProviderFactory<DB> {
self.provider()?.fill_block_env_with_header(block_env, header)
}
fn fill_cfg_env_at(&self, cfg: &mut CfgEnv, at: BlockHashOrNumber) -> ProviderResult<()> {
self.provider()?.fill_cfg_env_at(cfg, at)
fn fill_cfg_env_at<EvmConfig>(
&self,
cfg: &mut CfgEnv,
at: BlockHashOrNumber,
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
self.provider()?.fill_cfg_env_at(cfg, at, evm_config)
}
fn fill_cfg_env_with_header(&self, cfg: &mut CfgEnv, header: &Header) -> ProviderResult<()> {
self.provider()?.fill_cfg_env_with_header(cfg, header)
fn fill_cfg_env_with_header<EvmConfig>(
&self,
cfg: &mut CfgEnv,
header: &Header,
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
self.provider()?.fill_cfg_env_with_header(cfg, header, evm_config)
}
}

View File

@ -31,12 +31,10 @@ use reth_interfaces::{
provider::{ProviderResult, RootMismatch},
RethError, RethResult,
};
use reth_node_api::EvmEnvConfig;
use reth_primitives::{
keccak256,
revm::{
config::revm_spec,
env::{fill_block_env, fill_cfg_and_block_env, fill_cfg_env},
},
revm::{config::revm_spec, env::fill_block_env},
stage::{StageCheckpoint, StageId},
trie::Nibbles,
Account, Address, Block, BlockHash, BlockHashOrNumber, BlockNumber, BlockWithSenders,
@ -1729,27 +1727,41 @@ impl<TX: DbTx> WithdrawalsProvider for DatabaseProvider<TX> {
}
impl<TX: DbTx> EvmEnvProvider for DatabaseProvider<TX> {
fn fill_env_at(
fn fill_env_at<EvmConfig>(
&self,
cfg: &mut CfgEnv,
block_env: &mut BlockEnv,
at: BlockHashOrNumber,
) -> ProviderResult<()> {
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
let hash = self.convert_number(at)?.ok_or(ProviderError::HeaderNotFound(at))?;
let header = self.header(&hash)?.ok_or(ProviderError::HeaderNotFound(at))?;
self.fill_env_with_header(cfg, block_env, &header)
self.fill_env_with_header(cfg, block_env, &header, evm_config)
}
fn fill_env_with_header(
fn fill_env_with_header<EvmConfig>(
&self,
cfg: &mut CfgEnv,
block_env: &mut BlockEnv,
header: &Header,
) -> ProviderResult<()> {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
let total_difficulty = self
.header_td_by_number(header.number)?
.ok_or_else(|| ProviderError::HeaderNotFound(header.number.into()))?;
fill_cfg_and_block_env(cfg, block_env, &self.chain_spec, header, total_difficulty);
EvmConfig::fill_cfg_and_block_env(
cfg,
block_env,
&self.chain_spec,
header,
total_difficulty,
);
Ok(())
}
@ -1788,17 +1800,33 @@ impl<TX: DbTx> EvmEnvProvider for DatabaseProvider<TX> {
Ok(())
}
fn fill_cfg_env_at(&self, cfg: &mut CfgEnv, at: BlockHashOrNumber) -> ProviderResult<()> {
fn fill_cfg_env_at<EvmConfig>(
&self,
cfg: &mut CfgEnv,
at: BlockHashOrNumber,
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
let hash = self.convert_number(at)?.ok_or(ProviderError::HeaderNotFound(at))?;
let header = self.header(&hash)?.ok_or(ProviderError::HeaderNotFound(at))?;
self.fill_cfg_env_with_header(cfg, &header)
self.fill_cfg_env_with_header(cfg, &header, evm_config)
}
fn fill_cfg_env_with_header(&self, cfg: &mut CfgEnv, header: &Header) -> ProviderResult<()> {
fn fill_cfg_env_with_header<EvmConfig>(
&self,
cfg: &mut CfgEnv,
header: &Header,
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
let total_difficulty = self
.header_td_by_number(header.number)?
.ok_or_else(|| ProviderError::HeaderNotFound(header.number.into()))?;
fill_cfg_env(cfg, &self.chain_spec, header, total_difficulty);
EvmConfig::fill_cfg_env(cfg, &self.chain_spec, header, total_difficulty);
Ok(())
}
}

View File

@ -13,6 +13,7 @@ use reth_interfaces::{
provider::ProviderResult,
RethError, RethResult,
};
use reth_node_api::EvmEnvConfig;
use reth_primitives::{
stage::{StageCheckpoint, StageId},
Account, Address, Block, BlockHash, BlockHashOrNumber, BlockId, BlockNumHash, BlockNumber,
@ -456,22 +457,30 @@ where
DB: Database,
Tree: Send + Sync,
{
fn fill_env_at(
fn fill_env_at<EvmConfig>(
&self,
cfg: &mut CfgEnv,
block_env: &mut BlockEnv,
at: BlockHashOrNumber,
) -> ProviderResult<()> {
self.database.provider()?.fill_env_at(cfg, block_env, at)
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
self.database.provider()?.fill_env_at(cfg, block_env, at, evm_config)
}
fn fill_env_with_header(
fn fill_env_with_header<EvmConfig>(
&self,
cfg: &mut CfgEnv,
block_env: &mut BlockEnv,
header: &Header,
) -> ProviderResult<()> {
self.database.provider()?.fill_env_with_header(cfg, block_env, header)
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
self.database.provider()?.fill_env_with_header(cfg, block_env, header, evm_config)
}
fn fill_block_env_at(
@ -490,12 +499,28 @@ where
self.database.provider()?.fill_block_env_with_header(block_env, header)
}
fn fill_cfg_env_at(&self, cfg: &mut CfgEnv, at: BlockHashOrNumber) -> ProviderResult<()> {
self.database.provider()?.fill_cfg_env_at(cfg, at)
fn fill_cfg_env_at<EvmConfig>(
&self,
cfg: &mut CfgEnv,
at: BlockHashOrNumber,
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
self.database.provider()?.fill_cfg_env_at(cfg, at, evm_config)
}
fn fill_cfg_env_with_header(&self, cfg: &mut CfgEnv, header: &Header) -> ProviderResult<()> {
self.database.provider()?.fill_cfg_env_with_header(cfg, header)
fn fill_cfg_env_with_header<EvmConfig>(
&self,
cfg: &mut CfgEnv,
header: &Header,
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
self.database.provider()?.fill_cfg_env_with_header(cfg, header, evm_config)
}
}

View File

@ -9,6 +9,7 @@ use crate::{
use parking_lot::Mutex;
use reth_db::models::{AccountBeforeTx, StoredBlockBodyIndices};
use reth_interfaces::provider::{ProviderError, ProviderResult};
use reth_node_api::EvmEnvConfig;
use reth_primitives::{
keccak256, trie::AccountProof, Account, Address, Block, BlockHash, BlockHashOrNumber, BlockId,
BlockNumber, BlockWithSenders, Bytecode, Bytes, ChainInfo, ChainSpec, Header, Receipt,
@ -554,21 +555,29 @@ impl StateProvider for MockEthProvider {
}
impl EvmEnvProvider for MockEthProvider {
fn fill_env_at(
fn fill_env_at<EvmConfig>(
&self,
_cfg: &mut CfgEnv,
_block_env: &mut BlockEnv,
_at: BlockHashOrNumber,
) -> ProviderResult<()> {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
Ok(())
}
fn fill_env_with_header(
fn fill_env_with_header<EvmConfig>(
&self,
_cfg: &mut CfgEnv,
_block_env: &mut BlockEnv,
_header: &Header,
) -> ProviderResult<()> {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
Ok(())
}
@ -588,11 +597,27 @@ impl EvmEnvProvider for MockEthProvider {
Ok(())
}
fn fill_cfg_env_at(&self, _cfg: &mut CfgEnv, _at: BlockHashOrNumber) -> ProviderResult<()> {
fn fill_cfg_env_at<EvmConfig>(
&self,
_cfg: &mut CfgEnv,
_at: BlockHashOrNumber,
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
Ok(())
}
fn fill_cfg_env_with_header(&self, _cfg: &mut CfgEnv, _header: &Header) -> ProviderResult<()> {
fn fill_cfg_env_with_header<EvmConfig>(
&self,
_cfg: &mut CfgEnv,
_header: &Header,
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
Ok(())
}
}

View File

@ -9,6 +9,7 @@ use crate::{
};
use reth_db::models::{AccountBeforeTx, StoredBlockBodyIndices};
use reth_interfaces::provider::ProviderResult;
use reth_node_api::EvmEnvConfig;
use reth_primitives::{
stage::{StageCheckpoint, StageId},
trie::AccountProof,
@ -314,21 +315,29 @@ impl StateProvider for NoopProvider {
}
impl EvmEnvProvider for NoopProvider {
fn fill_env_at(
fn fill_env_at<EvmConfig>(
&self,
_cfg: &mut CfgEnv,
_block_env: &mut BlockEnv,
_at: BlockHashOrNumber,
) -> ProviderResult<()> {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
Ok(())
}
fn fill_env_with_header(
fn fill_env_with_header<EvmConfig>(
&self,
_cfg: &mut CfgEnv,
_block_env: &mut BlockEnv,
_header: &Header,
) -> ProviderResult<()> {
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
Ok(())
}
@ -348,11 +357,27 @@ impl EvmEnvProvider for NoopProvider {
Ok(())
}
fn fill_cfg_env_at(&self, _cfg: &mut CfgEnv, _at: BlockHashOrNumber) -> ProviderResult<()> {
fn fill_cfg_env_at<EvmConfig>(
&self,
_cfg: &mut CfgEnv,
_at: BlockHashOrNumber,
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
Ok(())
}
fn fill_cfg_env_with_header(&self, _cfg: &mut CfgEnv, _header: &Header) -> ProviderResult<()> {
fn fill_cfg_env_with_header<EvmConfig>(
&self,
_cfg: &mut CfgEnv,
_header: &Header,
_evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig,
{
Ok(())
}
}

View File

@ -1,4 +1,5 @@
use reth_interfaces::provider::ProviderResult;
use reth_node_api::EvmEnvConfig;
use reth_primitives::{BlockHashOrNumber, Header};
use revm::primitives::{BlockEnv, CfgEnv};
@ -10,28 +11,41 @@ use revm::primitives::{BlockEnv, CfgEnv};
pub trait EvmEnvProvider: Send + Sync {
/// Fills the [CfgEnv] and [BlockEnv] fields with values specific to the given
/// [BlockHashOrNumber].
fn fill_env_at(
fn fill_env_at<EvmConfig>(
&self,
cfg: &mut CfgEnv,
block_env: &mut BlockEnv,
at: BlockHashOrNumber,
) -> ProviderResult<()>;
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig;
/// Fills the default [CfgEnv] and [BlockEnv] fields with values specific to the given [Header].
fn env_with_header(&self, header: &Header) -> ProviderResult<(CfgEnv, BlockEnv)> {
fn env_with_header<EvmConfig>(
&self,
header: &Header,
evm_config: EvmConfig,
) -> ProviderResult<(CfgEnv, BlockEnv)>
where
EvmConfig: EvmEnvConfig,
{
let mut cfg = CfgEnv::default();
let mut block_env = BlockEnv::default();
self.fill_env_with_header(&mut cfg, &mut block_env, header)?;
self.fill_env_with_header::<EvmConfig>(&mut cfg, &mut block_env, header, evm_config)?;
Ok((cfg, block_env))
}
/// Fills the [CfgEnv] and [BlockEnv] fields with values specific to the given [Header].
fn fill_env_with_header(
fn fill_env_with_header<EvmConfig>(
&self,
cfg: &mut CfgEnv,
block_env: &mut BlockEnv,
header: &Header,
) -> ProviderResult<()>;
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig;
/// Fills the [BlockEnv] fields with values specific to the given [BlockHashOrNumber].
fn fill_block_env_at(
@ -48,8 +62,22 @@ pub trait EvmEnvProvider: Send + Sync {
) -> ProviderResult<()>;
/// Fills the [CfgEnv] fields with values specific to the given [BlockHashOrNumber].
fn fill_cfg_env_at(&self, cfg: &mut CfgEnv, at: BlockHashOrNumber) -> ProviderResult<()>;
fn fill_cfg_env_at<EvmConfig>(
&self,
cfg: &mut CfgEnv,
at: BlockHashOrNumber,
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig;
/// Fills the [CfgEnv] fields with values specific to the given [Header].
fn fill_cfg_env_with_header(&self, cfg: &mut CfgEnv, header: &Header) -> ProviderResult<()>;
fn fill_cfg_env_with_header<EvmConfig>(
&self,
cfg: &mut CfgEnv,
header: &Header,
evm_config: EvmConfig,
) -> ProviderResult<()>
where
EvmConfig: EvmEnvConfig;
}