mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-01-09 15:28:01 -05:00
chore: replace CacheDB with State<DB> in RPC crate (#19330)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
|
||||
6
crates/rpc/rpc-eth-types/src/cache/db.rs
vendored
6
crates/rpc/rpc-eth-types/src/cache/db.rs
vendored
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user