chore: replace CacheDB with State<DB> in RPC crate (#19330)

Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
This commit is contained in:
josé v
2025-10-27 16:00:58 -06:00
committed by GitHub
parent 1581aaa615
commit 50e88c29be
8 changed files with 41 additions and 39 deletions

View File

@@ -25,10 +25,7 @@ use reth_evm::{
};
use reth_node_api::BlockBody;
use reth_primitives_traits::Recovered;
use reth_revm::{
database::StateProviderDatabase,
db::{CacheDB, State},
};
use reth_revm::{database::StateProviderDatabase, db::State};
use reth_rpc_convert::{RpcConvert, RpcTxReq};
use reth_rpc_eth_types::{
cache::db::{StateCacheDbRefMutWrapper, StateProviderTraitObjWrapper},
@@ -286,7 +283,8 @@ pub trait EthCall: EstimateCall + Call + LoadPendingBlock + LoadBlock + FullEthA
let this = self.clone();
self.spawn_with_state_at_block(at.into(), move |state| {
let mut all_results = Vec::with_capacity(bundles.len());
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db =
State::builder().with_database(StateProviderDatabase::new(state)).build();
if replay_block_txs {
// only need to replay the transactions in the block if not all transactions are
@@ -399,7 +397,7 @@ pub trait EthCall: EstimateCall + Call + LoadPendingBlock + LoadBlock + FullEthA
{
self.spawn_blocking_io_fut(move |this| async move {
let state = this.state_at_block_id(at).await?;
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db = State::builder().with_database(StateProviderDatabase::new(state)).build();
if let Some(state_overrides) = state_override {
apply_state_overrides(state_overrides, &mut db)
@@ -629,8 +627,9 @@ pub trait Call:
let this = self.clone();
self.spawn_blocking_io_fut(move |_| async move {
let state = this.state_at_block_id(at).await?;
let mut db =
CacheDB::new(StateProviderDatabase::new(StateProviderTraitObjWrapper(&state)));
let mut db = State::builder()
.with_database(StateProviderDatabase::new(StateProviderTraitObjWrapper(&state)))
.build();
let (evm_env, tx_env) =
this.prepare_call_env(evm_env, request, &mut db, overrides)?;
@@ -681,7 +680,8 @@ pub trait Call:
let this = self.clone();
self.spawn_with_state_at_block(parent_block.into(), move |state| {
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db =
State::builder().with_database(StateProviderDatabase::new(state)).build();
let block_txs = block.transactions_recovered();
// replay all transactions prior to the targeted transaction
@@ -700,7 +700,7 @@ pub trait Call:
/// Replays all the transactions until the target transaction is found.
///
/// All transactions before the target transaction are executed and their changes are written to
/// the _runtime_ db ([`CacheDB`]).
/// the _runtime_ db ([`State`]).
///
/// Note: This assumes the target transaction is in the given iterator.
/// Returns the index of the target transaction in the given iterator.

View File

@@ -10,7 +10,7 @@ use futures::Future;
use reth_chainspec::MIN_TRANSACTION_GAS;
use reth_errors::ProviderError;
use reth_evm::{ConfigureEvm, Database, Evm, EvmEnvFor, EvmFor, TransactionEnv, TxEnvFor};
use reth_revm::{database::StateProviderDatabase, db::CacheDB};
use reth_revm::{database::StateProviderDatabase, db::State};
use reth_rpc_convert::{RpcConvert, RpcTxReq};
use reth_rpc_eth_types::{
error::{api::FromEvmHalt, FromEvmError},
@@ -81,7 +81,7 @@ pub trait EstimateCall: Call {
.unwrap_or(max_gas_limit);
// Configure the evm env
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db = State::builder().with_database(StateProviderDatabase::new(state)).build();
// Apply any state overrides if specified.
if let Some(state_override) = state_override {
@@ -93,7 +93,7 @@ pub trait EstimateCall: Call {
// Check if this is a basic transfer (no input data to account with no code)
let is_basic_transfer = if tx_env.input().is_empty() &&
let TxKind::Call(to) = tx_env.kind() &&
let Ok(code) = db.db.account_code(&to)
let Ok(code) = db.database.account_code(&to)
{
code.map(|code| code.is_empty()).unwrap_or(true)
} else {
@@ -234,9 +234,8 @@ pub trait EstimateCall: Call {
// An estimation error is allowed once the current gas limit range used in the binary
// search is small enough (less than 1.5% of the highest gas limit)
// <https://github.com/ethereum/go-ethereum/blob/a5a4fa7032bb248f5a7c40f4e8df2b131c4186a4/eth/gasestimator/gasestimator.go#L152
if (highest_gas_limit - lowest_gas_limit) as f64 / (highest_gas_limit as f64) <
ESTIMATE_GAS_ERROR_RATIO
{
let ratio = (highest_gas_limit - lowest_gas_limit) as f64 / (highest_gas_limit as f64);
if ratio < ESTIMATE_GAS_ERROR_RATIO {
break
};

View File

@@ -13,7 +13,7 @@ use reth_evm::{
Evm, EvmEnvFor, EvmFor, HaltReasonFor, InspectorFor, TxEnvFor,
};
use reth_primitives_traits::{BlockBody, Recovered, RecoveredBlock};
use reth_revm::{database::StateProviderDatabase, db::CacheDB};
use reth_revm::{database::StateProviderDatabase, db::State};
use reth_rpc_eth_types::{
cache::db::{StateCacheDb, StateCacheDbRefMutWrapper, StateProviderTraitObjWrapper},
EthApiError,
@@ -68,7 +68,7 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
+ 'static,
{
self.with_state_at_block(at, move |this, state| {
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db = State::builder().with_database(StateProviderDatabase::new(state)).build();
let mut inspector = TracingInspector::new(config);
let res = this.inspect(&mut db, evm_env, tx_env, &mut inspector)?;
f(inspector, res)
@@ -103,7 +103,7 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
{
let this = self.clone();
self.spawn_with_state_at_block(at, move |state| {
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db = State::builder().with_database(StateProviderDatabase::new(state)).build();
let mut inspector = TracingInspector::new(config);
let res = this.inspect(&mut db, evm_env, tx_env, &mut inspector)?;
f(inspector, res, db)
@@ -184,7 +184,8 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
let this = self.clone();
self.spawn_with_state_at_block(parent_block.into(), move |state| {
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db =
State::builder().with_database(StateProviderDatabase::new(state)).build();
let block_txs = block.transactions_recovered();
this.apply_pre_execution_changes(&block, &mut db, &evm_env)?;
@@ -306,8 +307,9 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
// now get the state
let state = this.state_at_block_id(state_at.into()).await?;
let mut db =
CacheDB::new(StateProviderDatabase::new(StateProviderTraitObjWrapper(&state)));
let mut db = State::builder()
.with_database(StateProviderDatabase::new(StateProviderTraitObjWrapper(&state)))
.build();
this.apply_pre_execution_changes(&block, &mut db, &evm_env)?;

View File

@@ -8,14 +8,14 @@ use reth_revm::{database::StateProviderDatabase, DatabaseRef};
use reth_storage_api::{BytecodeReader, HashedPostStateProvider, StateProvider};
use reth_trie::{HashedStorage, MultiProofTargets};
use revm::{
database::{BundleState, CacheDB},
database::{BundleState, State},
primitives::HashMap,
state::{AccountInfo, Bytecode},
Database, DatabaseCommit,
};
/// Helper alias type for the state's [`CacheDB`]
pub type StateCacheDb<'a> = CacheDB<StateProviderDatabase<StateProviderTraitObjWrapper<'a>>>;
/// Helper alias type for the state's [`State`]
pub type StateCacheDb<'a> = State<StateProviderDatabase<StateProviderTraitObjWrapper<'a>>>;
/// Hack to get around 'higher-ranked lifetime error', see
/// <https://github.com/rust-lang/rust/issues/100013>

View File

@@ -22,11 +22,7 @@ use reth_chainspec::{ChainSpecProvider, EthChainSpec, EthereumHardforks};
use reth_errors::RethError;
use reth_evm::{execute::Executor, ConfigureEvm, EvmEnvFor, TxEnvFor};
use reth_primitives_traits::{Block as _, BlockBody, ReceiptWithBloom, RecoveredBlock};
use reth_revm::{
database::StateProviderDatabase,
db::{CacheDB, State},
witness::ExecutionWitnessRecord,
};
use reth_revm::{database::StateProviderDatabase, db::State, witness::ExecutionWitnessRecord};
use reth_rpc_api::DebugApiServer;
use reth_rpc_convert::RpcTxReq;
use reth_rpc_eth_api::{
@@ -100,7 +96,8 @@ where
self.eth_api()
.spawn_with_state_at_block(block.parent_hash().into(), move |state| {
let mut results = Vec::with_capacity(block.body().transactions().len());
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db =
State::builder().with_database(StateProviderDatabase::new(state)).build();
this.eth_api().apply_pre_execution_changes(&block, &mut db, &evm_env)?;
@@ -230,7 +227,8 @@ where
// configure env for the target transaction
let tx = transaction.into_recovered();
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db =
State::builder().with_database(StateProviderDatabase::new(state)).build();
this.eth_api().apply_pre_execution_changes(&block, &mut db, &evm_env)?;
@@ -535,7 +533,8 @@ where
.spawn_with_state_at_block(at.into(), move |state| {
// the outer vec for the bundles
let mut all_bundles = Vec::with_capacity(bundles.len());
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db =
State::builder().with_database(StateProviderDatabase::new(state)).build();
if replay_block_txs {
// only need to replay the transactions in the block if not all transactions are

View File

@@ -8,7 +8,7 @@ use alloy_rpc_types_mev::{EthCallBundle, EthCallBundleResponse, EthCallBundleTra
use jsonrpsee::core::RpcResult;
use reth_chainspec::{ChainSpecProvider, EthChainSpec};
use reth_evm::{ConfigureEvm, Evm};
use reth_revm::{database::StateProviderDatabase, db::CacheDB};
use reth_revm::{database::StateProviderDatabase, State};
use reth_rpc_eth_api::{
helpers::{Call, EthTransactions, LoadPendingBlock},
EthCallBundleApiServer, FromEthApiError, FromEvmError,
@@ -150,7 +150,7 @@ where
.spawn_with_state_at_block(at, move |state| {
let coinbase = evm_env.block_env.beneficiary();
let basefee = evm_env.block_env.basefee();
let db = CacheDB::new(StateProviderDatabase::new(state));
let db = State::builder().with_database(StateProviderDatabase::new(state)).build();
let initial_coinbase = db
.basic_ref(coinbase)

View File

@@ -12,7 +12,7 @@ use alloy_rpc_types_mev::{
use jsonrpsee::core::RpcResult;
use reth_evm::{ConfigureEvm, Evm};
use reth_primitives_traits::Recovered;
use reth_revm::{database::StateProviderDatabase, db::CacheDB};
use reth_revm::{database::StateProviderDatabase, State};
use reth_rpc_api::MevSimApiServer;
use reth_rpc_eth_api::{
helpers::{block::LoadBlock, Call, EthTransactions},
@@ -246,7 +246,8 @@ where
let current_block_number = current_block.number();
let coinbase = evm_env.block_env.beneficiary();
let basefee = evm_env.block_env.basefee();
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db =
State::builder().with_database(StateProviderDatabase::new(state)).build();
// apply overrides
apply_block_overrides(block_overrides, &mut db, evm_env.block_env.inner_mut());

View File

@@ -20,7 +20,7 @@ use jsonrpsee::core::RpcResult;
use reth_chainspec::{ChainSpecProvider, EthChainSpec, EthereumHardfork, MAINNET, SEPOLIA};
use reth_evm::ConfigureEvm;
use reth_primitives_traits::{BlockBody, BlockHeader};
use reth_revm::{database::StateProviderDatabase, db::CacheDB};
use reth_revm::{database::StateProviderDatabase, State};
use reth_rpc_api::TraceApiServer;
use reth_rpc_convert::RpcTxReq;
use reth_rpc_eth_api::{
@@ -158,7 +158,8 @@ where
self.eth_api()
.spawn_with_state_at_block(at, move |state| {
let mut results = Vec::with_capacity(calls.len());
let mut db = CacheDB::new(StateProviderDatabase::new(state));
let mut db =
State::builder().with_database(StateProviderDatabase::new(state)).build();
let mut calls = calls.into_iter().peekable();