feat(rpc): add BlockOverrides in trace_* (#3102)

This commit is contained in:
Thomas Coratger
2023-06-12 20:13:11 +02:00
committed by GitHub
parent adf4ae1246
commit cfdd88d392
2 changed files with 30 additions and 10 deletions

View File

@ -1,8 +1,9 @@
use jsonrpsee::{core::RpcResult, proc_macros::rpc};
use reth_primitives::{BlockId, Bytes, H256};
use reth_rpc_types::{
state::StateOverride,
trace::{filter::TraceFilter, parity::*},
CallRequest, Index,
BlockOverrides, CallRequest, Index,
};
use std::collections::HashSet;
@ -17,6 +18,8 @@ pub trait TraceApi {
call: CallRequest,
trace_types: HashSet<TraceType>,
block_id: Option<BlockId>,
state_overrides: Option<StateOverride>,
block_overrides: Option<Box<BlockOverrides>>,
) -> RpcResult<TraceResults>;
/// Performs multiple call traces on top of the same block. i.e. transaction n will be executed

View File

@ -2,7 +2,7 @@ use crate::{
eth::{
cache::EthStateCache,
error::{EthApiError, EthResult},
revm_utils::{inspect, prepare_call_env},
revm_utils::{inspect, prepare_call_env, EvmOverrides},
utils::recover_raw_transaction,
EthTransactions,
},
@ -20,8 +20,9 @@ use reth_revm::{
};
use reth_rpc_api::TraceApiServer;
use reth_rpc_types::{
state::StateOverride,
trace::{filter::TraceFilter, parity::*},
BlockError, CallRequest, Index, TransactionInfo,
BlockError, BlockOverrides, CallRequest, Index, TransactionInfo,
};
use reth_tasks::TaskSpawner;
use revm::primitives::Env;
@ -100,9 +101,17 @@ where
call: CallRequest,
trace_types: HashSet<TraceType>,
block_id: Option<BlockId>,
state_overrides: Option<StateOverride>,
block_overrides: Option<Box<BlockOverrides>>,
) -> EthResult<TraceResults> {
self.on_blocking_task(|this| async move {
this.try_trace_call(call, trace_types, block_id).await
this.try_trace_call(
call,
trace_types,
block_id,
EvmOverrides::new(state_overrides, block_overrides),
)
.await
})
.await
}
@ -112,16 +121,14 @@ where
call: CallRequest,
trace_types: HashSet<TraceType>,
block_id: Option<BlockId>,
overrides: EvmOverrides,
) -> EthResult<TraceResults> {
let at = block_id.unwrap_or(BlockId::Number(BlockNumberOrTag::Latest));
let config = tracing_config(&trace_types);
let mut inspector = TracingInspector::new(config);
let (res, _) = self
.inner
.eth_api
.inspect_call_at(call, at, Default::default(), &mut inspector)
.await?;
let (res, _) =
self.inner.eth_api.inspect_call_at(call, at, overrides, &mut inspector).await?;
let trace_res =
inspector.into_parity_builder().into_trace_results(res.result, &trace_types);
@ -388,9 +395,19 @@ where
call: CallRequest,
trace_types: HashSet<TraceType>,
block_id: Option<BlockId>,
state_overrides: Option<StateOverride>,
block_overrides: Option<Box<BlockOverrides>>,
) -> Result<TraceResults> {
let _permit = self.acquire_trace_permit().await;
Ok(TraceApi::trace_call(self, call, trace_types, block_id).await?)
Ok(TraceApi::trace_call(
self,
call,
trace_types,
block_id,
state_overrides,
block_overrides,
)
.await?)
}
/// Handler for `trace_callMany`