mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: EvmEnvConfig trait (#6051)
This commit is contained in:
@ -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
|
||||
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user