feat: add Receipt AT to ReceiptProvider (#12890)

This commit is contained in:
Arsenii Kulikov
2024-11-27 18:02:25 +04:00
committed by GitHub
parent b62929c390
commit 533b555f87
37 changed files with 267 additions and 143 deletions

View File

@@ -26,7 +26,7 @@ where
Node: FullNodeComponents<
Types: NodeTypes<
ChainSpec: EthereumHardforks,
Primitives: NodePrimitives<Block: Encodable>,
Primitives: NodePrimitives<Block: Encodable, Receipt = reth_primitives::Receipt>,
>,
>,
EthApi: EthApiSpec + EthTransactions + TraceExt,

View File

@@ -539,7 +539,7 @@ where
P: DatabaseProviderFactory
+ BlockReader<Block = reth_primitives::Block>
+ StateProviderFactory
+ StateReader
+ StateReader<Receipt = reth_primitives::Receipt>
+ Clone
+ 'static,
<P as DatabaseProviderFactory>::Provider: BlockReader,

View File

@@ -147,7 +147,11 @@ where
impl<C> NetworkConfig<C>
where
C: BlockReader<Block = reth_primitives::Block> + HeaderProvider + Clone + Unpin + 'static,
C: BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ HeaderProvider
+ Clone
+ Unpin
+ 'static,
{
/// Starts the networking stack given a [`NetworkConfig`] and returns a handle to the network.
pub async fn start_network(self) -> Result<NetworkHandle, NetworkError> {

View File

@@ -80,7 +80,7 @@ impl<C, N: NetworkPrimitives> EthRequestHandler<C, N> {
impl<C> EthRequestHandler<C>
where
C: BlockReader + HeaderProvider + ReceiptProvider,
C: BlockReader + HeaderProvider + ReceiptProvider<Receipt = reth_primitives::Receipt>,
{
/// Returns the list of requested headers
fn get_headers_response(&self, request: GetBlockHeaders) -> Vec<Header> {
@@ -224,7 +224,9 @@ where
/// This should be spawned or used as part of `tokio::select!`.
impl<C> Future for EthRequestHandler<C>
where
C: BlockReader<Block = reth_primitives::Block> + HeaderProvider + Unpin,
C: BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ HeaderProvider
+ Unpin,
{
type Output = ();

View File

@@ -194,7 +194,11 @@ where
impl<C, Pool> Testnet<C, Pool>
where
C: BlockReader<Block = reth_primitives::Block> + HeaderProvider + Clone + Unpin + 'static,
C: BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ HeaderProvider
+ Clone
+ Unpin
+ 'static,
Pool: TransactionPool + Unpin + 'static,
{
/// Spawns the testnet to a separate task
@@ -253,7 +257,10 @@ impl<C, Pool> fmt::Debug for Testnet<C, Pool> {
impl<C, Pool> Future for Testnet<C, Pool>
where
C: BlockReader<Block = reth_primitives::Block> + HeaderProvider + Unpin + 'static,
C: BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ HeaderProvider
+ Unpin
+ 'static,
Pool: TransactionPool + Unpin + 'static,
{
type Output = ();
@@ -448,7 +455,10 @@ where
impl<C, Pool> Future for Peer<C, Pool>
where
C: BlockReader<Block = reth_primitives::Block> + HeaderProvider + Unpin + 'static,
C: BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ HeaderProvider
+ Unpin
+ 'static,
Pool: TransactionPool + Unpin + 'static,
{
type Output = ();

View File

@@ -651,7 +651,8 @@ impl<Node: FullNodeTypes> BuilderContext<Node> {
pub fn start_network<Pool>(&self, builder: NetworkBuilder<(), ()>, pool: Pool) -> NetworkHandle
where
Pool: TransactionPool + Unpin + 'static,
Node::Provider: BlockReader<Block = reth_primitives::Block>,
Node::Provider:
BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>,
{
self.start_network_with(builder, pool, Default::default())
}
@@ -670,7 +671,8 @@ impl<Node: FullNodeTypes> BuilderContext<Node> {
) -> NetworkHandle
where
Pool: TransactionPool + Unpin + 'static,
Node::Provider: BlockReader<Block = reth_primitives::Block>,
Node::Provider:
BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>,
{
let (handle, network, txpool, eth) = builder
.transactions(pool, tx_config)

View File

@@ -244,3 +244,6 @@ pub type BodyTy<N> = <<N as NodeTypes>::Primitives as NodePrimitives>::BlockBody
/// Helper adapter type for accessing [`NodePrimitives::SignedTx`] on [`NodeTypes`].
pub type TxTy<N> = <<N as NodeTypes>::Primitives as NodePrimitives>::SignedTx;
/// Helper adapter type for accessing [`NodePrimitives::Receipt`] on [`NodeTypes`].
pub type ReceiptTy<N> = <<N as NodeTypes>::Primitives as NodePrimitives>::Receipt;

View File

@@ -24,8 +24,10 @@ impl<N> LoadPendingBlock for OpEthApi<N>
where
Self: SpawnBlocking,
N: RpcNodeCore<
Provider: BlockReaderIdExt<Block = reth_primitives::Block>
+ EvmEnvProvider
Provider: BlockReaderIdExt<
Block = reth_primitives::Block,
Receipt = reth_primitives::Receipt,
> + EvmEnvProvider
+ ChainSpecProvider<ChainSpec: EthChainSpec + EthereumHardforks>
+ StateProviderFactory,
Pool: TransactionPool,

View File

@@ -11,7 +11,7 @@ use reth_optimism_chainspec::OpChainSpec;
use reth_optimism_evm::RethL1BlockInfo;
use reth_optimism_forks::OpHardforks;
use reth_primitives::{Receipt, TransactionMeta, TransactionSigned, TxType};
use reth_provider::{ChainSpecProvider, TransactionsProvider};
use reth_provider::{ChainSpecProvider, ReceiptProvider, TransactionsProvider};
use reth_rpc_eth_api::{helpers::LoadReceipt, FromEthApiError, RpcReceipt};
use reth_rpc_eth_types::{receipt::build_receipt, EthApiError};
@@ -21,7 +21,8 @@ impl<N> LoadReceipt for OpEthApi<N>
where
Self: Send + Sync,
N: FullNodeComponents<Types: NodeTypes<ChainSpec = OpChainSpec>>,
Self::Provider: TransactionsProvider<Transaction = TransactionSigned>,
Self::Provider:
TransactionsProvider<Transaction = TransactionSigned> + ReceiptProvider<Receipt = Receipt>,
{
async fn build_transaction_receipt(
&self,

View File

@@ -74,7 +74,7 @@ where
impl<N> TransactionCompat for OpEthApi<N>
where
N: FullNodeComponents,
N: FullNodeComponents<Provider: ReceiptProvider<Receipt = reth_primitives::Receipt>>,
{
type Transaction = Transaction;
type Error = OpEthApiError;

View File

@@ -29,7 +29,7 @@ pub struct EthHandlers<Provider, Pool, Network, Events, EthApi: EthApiTypes> {
impl<Provider, Pool, Network, Events, EthApi> EthHandlers<Provider, Pool, Network, Events, EthApi>
where
Provider: StateProviderFactory
+ BlockReader<Block = reth_primitives::Block>
+ BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ EvmEnvProvider
+ Clone
+ Unpin

View File

@@ -37,8 +37,11 @@
//! block_executor: BlockExecutor,
//! consensus: Consensus,
//! ) where
//! Provider: FullRpcProvider<Transaction = TransactionSigned, Block = reth_primitives::Block>
//! + AccountReader
//! Provider: FullRpcProvider<
//! Transaction = TransactionSigned,
//! Block = reth_primitives::Block,
//! Receipt = reth_primitives::Receipt,
//! > + AccountReader
//! + ChangeSetReader,
//! Pool: TransactionPool + Unpin + 'static,
//! Network: NetworkInfo + Peers + Clone + 'static,
@@ -114,8 +117,11 @@
//! block_executor: BlockExecutor,
//! consensus: Consensus,
//! ) where
//! Provider: FullRpcProvider<Transaction = TransactionSigned, Block = reth_primitives::Block>
//! + AccountReader
//! Provider: FullRpcProvider<
//! Transaction = TransactionSigned,
//! Block = reth_primitives::Block,
//! Receipt = reth_primitives::Receipt,
//! > + AccountReader
//! + ChangeSetReader,
//! Pool: TransactionPool + Unpin + 'static,
//! Network: NetworkInfo + Peers + Clone + 'static,
@@ -195,7 +201,7 @@ use reth_network_api::{noop::NoopNetwork, NetworkInfo, Peers};
use reth_primitives::EthPrimitives;
use reth_provider::{
AccountReader, BlockReader, CanonStateSubscriptions, ChainSpecProvider, ChangeSetReader,
EvmEnvProvider, FullRpcProvider, StateProviderFactory,
EvmEnvProvider, FullRpcProvider, ReceiptProvider, StateProviderFactory,
};
use reth_rpc::{
AdminApi, DebugApi, EngineEthApi, EthBundle, NetApi, OtterscanApi, RPCApi, RethApi, TraceApi,
@@ -263,7 +269,9 @@ pub async fn launch<Provider, Pool, Network, Tasks, Events, EvmConfig, EthApi, B
consensus: Arc<dyn Consensus>,
) -> Result<RpcServerHandle, RpcError>
where
Provider: FullRpcProvider<Block = reth_primitives::Block> + AccountReader + ChangeSetReader,
Provider: FullRpcProvider<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ AccountReader
+ ChangeSetReader,
Pool: TransactionPool + 'static,
Network: NetworkInfo + Peers + Clone + 'static,
Tasks: TaskSpawner + Clone + 'static,
@@ -646,7 +654,10 @@ where
EngineT: EngineTypes,
EngineApi: EngineApiServer<EngineT>,
EthApi: FullEthApiServer,
Provider: BlockReader<Block = <EthApi::Provider as BlockReader>::Block>,
Provider: BlockReader<
Block = <EthApi::Provider as BlockReader>::Block,
Receipt = <EthApi::Provider as ReceiptProvider>::Receipt,
>,
{
let Self {
provider,
@@ -722,7 +733,7 @@ where
) -> RpcRegistryInner<Provider, Pool, Network, Tasks, Events, EthApi, BlockExecutor, Consensus>
where
EthApi: EthApiTypes + 'static,
Provider: BlockReader<Block = reth_primitives::Block>,
Provider: BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>,
{
let Self {
provider,
@@ -757,7 +768,10 @@ where
) -> TransportRpcModules<()>
where
EthApi: FullEthApiServer,
Provider: BlockReader<Block = <EthApi::Provider as BlockReader>::Block>,
Provider: BlockReader<
Block = <EthApi::Provider as BlockReader>::Block,
Receipt = <EthApi::Provider as ReceiptProvider>::Receipt,
>,
{
let mut modules = TransportRpcModules::default();
@@ -916,7 +930,7 @@ impl<Provider, Pool, Network, Tasks, Events, EthApi, BlockExecutor, Consensus>
RpcRegistryInner<Provider, Pool, Network, Tasks, Events, EthApi, BlockExecutor, Consensus>
where
Provider: StateProviderFactory
+ BlockReader<Block = reth_primitives::Block>
+ BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ EvmEnvProvider
+ Clone
+ Unpin
@@ -1125,7 +1139,10 @@ where
pub fn register_debug(&mut self) -> &mut Self
where
EthApi: EthApiSpec + EthTransactions + TraceExt,
Provider: BlockReader<Block = <EthApi::Provider as BlockReader>::Block>,
Provider: BlockReader<
Block = <EthApi::Provider as BlockReader>::Block,
Receipt = reth_primitives::Receipt,
>,
{
let debug_api = self.debug_api();
self.modules.insert(RethRpcModule::Debug, debug_api.into_rpc().into());
@@ -1279,8 +1296,10 @@ where
impl<Provider, Pool, Network, Tasks, Events, EthApi, BlockExecutor, Consensus>
RpcRegistryInner<Provider, Pool, Network, Tasks, Events, EthApi, BlockExecutor, Consensus>
where
Provider: FullRpcProvider<Block = <EthApi::Provider as BlockReader>::Block>
+ AccountReader
Provider: FullRpcProvider<
Block = <EthApi::Provider as BlockReader>::Block,
Receipt = <EthApi::Provider as ReceiptProvider>::Receipt,
> + AccountReader
+ ChangeSetReader,
Pool: TransactionPool + 'static,
Network: NetworkInfo + Peers + Clone + 'static,

View File

@@ -7,8 +7,10 @@ use alloy_eips::BlockId;
use alloy_rpc_types_eth::{Block, Header, Index};
use futures::Future;
use reth_node_api::BlockBody;
use reth_primitives::{Receipt, SealedBlockFor, SealedBlockWithSenders};
use reth_provider::{BlockIdReader, BlockReader, BlockReaderIdExt, HeaderProvider};
use reth_primitives::{SealedBlockFor, SealedBlockWithSenders};
use reth_provider::{
BlockIdReader, BlockReader, BlockReaderIdExt, HeaderProvider, ProviderReceipt,
};
use reth_rpc_types_compat::block::from_block;
use crate::{
@@ -24,7 +26,7 @@ pub type BlockReceiptsResult<N, E> = Result<Option<Vec<RpcReceipt<N>>>, E>;
pub type BlockAndReceiptsResult<Eth> = Result<
Option<(
SealedBlockFor<<<Eth as RpcNodeCore>::Provider as BlockReader>::Block>,
Arc<Vec<Receipt>>,
Arc<Vec<ProviderReceipt<<Eth as RpcNodeCore>::Provider>>>,
)>,
<Eth as EthApiTypes>::Error,
>;

View File

@@ -22,7 +22,7 @@ use reth_primitives::{
};
use reth_provider::{
BlockReader, BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, ProviderError,
ReceiptProvider, StateProviderFactory,
ProviderReceipt, ReceiptProvider, StateProviderFactory,
};
use reth_revm::{
database::StateProviderDatabase,
@@ -45,8 +45,10 @@ use tracing::debug;
pub trait LoadPendingBlock:
EthApiTypes
+ RpcNodeCore<
Provider: BlockReaderIdExt<Block = reth_primitives::Block>
+ EvmEnvProvider
Provider: BlockReaderIdExt<
Block = reth_primitives::Block,
Receipt = reth_primitives::Receipt,
> + EvmEnvProvider
+ ChainSpecProvider<ChainSpec: EthChainSpec + EthereumHardforks>
+ StateProviderFactory,
Pool: TransactionPool,
@@ -119,7 +121,10 @@ pub trait LoadPendingBlock:
&self,
) -> impl Future<
Output = Result<
Option<(SealedBlockWithSenders<<Self::Provider as BlockReader>::Block>, Vec<Receipt>)>,
Option<(
SealedBlockWithSenders<<Self::Provider as BlockReader>::Block>,
Vec<ProviderReceipt<Self::Provider>>,
)>,
Self::Error,
>,
> + Send

View File

@@ -2,8 +2,8 @@
//! loads receipt data w.r.t. network.
use futures::Future;
use reth_primitives::{Receipt, TransactionMeta};
use reth_provider::TransactionsProvider;
use reth_primitives::TransactionMeta;
use reth_provider::{ProviderReceipt, ProviderTx, ReceiptProvider, TransactionsProvider};
use crate::{EthApiTypes, RpcNodeCoreExt, RpcReceipt};
@@ -11,13 +11,13 @@ use crate::{EthApiTypes, RpcNodeCoreExt, RpcReceipt};
///
/// Behaviour shared by several `eth_` RPC methods, not exclusive to `eth_` receipts RPC methods.
pub trait LoadReceipt:
EthApiTypes + RpcNodeCoreExt<Provider: TransactionsProvider> + Send + Sync
EthApiTypes + RpcNodeCoreExt<Provider: TransactionsProvider + ReceiptProvider> + Send + Sync
{
/// Helper method for `eth_getBlockReceipts` and `eth_getTransactionReceipt`.
fn build_transaction_receipt(
&self,
tx: <Self::Provider as TransactionsProvider>::Transaction,
tx: ProviderTx<Self::Provider>,
meta: TransactionMeta,
receipt: Receipt,
receipt: ProviderReceipt<Self::Provider>,
) -> impl Future<Output = Result<RpcReceipt<Self::NetworkTypes>, Self::Error>> + Send;
}

View File

@@ -8,9 +8,10 @@ use alloy_network::TransactionBuilder;
use alloy_primitives::{Address, Bytes, TxHash, B256};
use alloy_rpc_types_eth::{transaction::TransactionRequest, BlockNumberOrTag, TransactionInfo};
use futures::Future;
use reth_primitives::{Receipt, SealedBlockWithSenders, TransactionMeta, TransactionSigned};
use reth_primitives::{SealedBlockWithSenders, TransactionMeta, TransactionSigned};
use reth_provider::{
BlockNumReader, BlockReaderIdExt, ProviderTx, ReceiptProvider, TransactionsProvider,
BlockNumReader, BlockReaderIdExt, ProviderReceipt, ProviderTx, ReceiptProvider,
TransactionsProvider,
};
use reth_rpc_eth_types::{
utils::{binary_search, recover_raw_transaction},
@@ -159,7 +160,7 @@ pub trait EthTransactions: LoadTransaction<Provider: BlockReaderIdExt> {
hash: TxHash,
) -> impl Future<
Output = Result<
Option<(ProviderTx<Self::Provider>, TransactionMeta, Receipt)>,
Option<(ProviderTx<Self::Provider>, TransactionMeta, ProviderReceipt<Self::Provider>)>,
Self::Error,
>,
> + Send

View File

@@ -8,7 +8,7 @@ use std::{
use alloy_network::Network;
use alloy_rpc_types_eth::Block;
use reth_primitives::TransactionSigned;
use reth_provider::TransactionsProvider;
use reth_provider::{ReceiptProvider, TransactionsProvider};
use reth_rpc_types_compat::TransactionCompat;
use crate::{AsEthApiError, FromEthApiError, FromEvmError, RpcNodeCore};
@@ -47,8 +47,10 @@ pub type RpcError<T> = <T as EthApiTypes>::Error;
/// Helper trait holds necessary trait bounds on [`EthApiTypes`] to implement `eth` API.
pub trait FullEthApiTypes
where
Self: RpcNodeCore<Provider: TransactionsProvider<Transaction = TransactionSigned>>
+ EthApiTypes<
Self: RpcNodeCore<
Provider: TransactionsProvider<Transaction = TransactionSigned>
+ ReceiptProvider<Receipt = reth_primitives::Receipt>,
> + EthApiTypes<
TransactionCompat: TransactionCompat<
<Self::Provider as TransactionsProvider>::Transaction,
Transaction = RpcTransaction<Self::NetworkTypes>,
@@ -59,8 +61,10 @@ where
}
impl<T> FullEthApiTypes for T where
T: RpcNodeCore<Provider: TransactionsProvider<Transaction = TransactionSigned>>
+ EthApiTypes<
T: RpcNodeCore<
Provider: TransactionsProvider<Transaction = TransactionSigned>
+ ReceiptProvider<Receipt = reth_primitives::Receipt>,
> + EthApiTypes<
TransactionCompat: TransactionCompat<
<Self::Provider as TransactionsProvider>::Transaction,
Transaction = RpcTransaction<T::NetworkTypes>,

View File

@@ -106,7 +106,7 @@ impl EthStateCache {
) -> Self
where
Provider: StateProviderFactory
+ BlockReader<Block = reth_primitives::Block>
+ BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ EvmEnvProvider
+ Clone
+ Unpin
@@ -128,7 +128,7 @@ impl EthStateCache {
) -> Self
where
Provider: StateProviderFactory
+ BlockReader<Block = reth_primitives::Block>
+ BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ EvmEnvProvider
+ Clone
+ Unpin
@@ -348,7 +348,7 @@ where
impl<Provider, Tasks, EvmConfig> Future for EthStateCacheService<Provider, Tasks, EvmConfig>
where
Provider: StateProviderFactory
+ BlockReader<Block = reth_primitives::Block>
+ BlockReader<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ EvmEnvProvider
+ Clone
+ Unpin

View File

@@ -794,7 +794,7 @@ where
#[async_trait]
impl<Provider, Eth, BlockExecutor> DebugApiServer for DebugApi<Provider, Eth, BlockExecutor>
where
Provider: BlockReaderIdExt<Block: Encodable>
Provider: BlockReaderIdExt<Block: Encodable, Receipt = reth_primitives::Receipt>
+ HeaderProvider
+ ChainSpecProvider<ChainSpec: EthereumHardforks>
+ StateProviderFactory

View File

@@ -438,7 +438,7 @@ mod tests {
use crate::EthApi;
fn build_test_eth_api<
P: BlockReaderIdExt<Block = reth_primitives::Block>
P: BlockReaderIdExt<Block = reth_primitives::Block, Receipt = reth_primitives::Receipt>
+ BlockReader
+ ChainSpecProvider<ChainSpec = ChainSpec>
+ EvmEnvProvider

View File

@@ -18,8 +18,10 @@ impl<Provider, Pool, Network, EvmConfig> LoadPendingBlock
where
Self: SpawnBlocking
+ RpcNodeCore<
Provider: BlockReaderIdExt<Block = reth_primitives::Block>
+ EvmEnvProvider
Provider: BlockReaderIdExt<
Block = reth_primitives::Block,
Receipt = reth_primitives::Receipt,
> + EvmEnvProvider
+ ChainSpecProvider<ChainSpec: EthChainSpec + EthereumHardforks>
+ StateProviderFactory,
Pool: TransactionPool,

View File

@@ -1,7 +1,7 @@
//! Builds an RPC receipt response w.r.t. data layout of network.
use reth_primitives::{Receipt, TransactionMeta, TransactionSigned};
use reth_provider::TransactionsProvider;
use reth_provider::{ReceiptProvider, TransactionsProvider};
use reth_rpc_eth_api::{helpers::LoadReceipt, FromEthApiError, RpcNodeCoreExt, RpcReceipt};
use reth_rpc_eth_types::{EthApiError, EthReceiptBuilder};
@@ -9,7 +9,10 @@ use crate::EthApi;
impl<Provider, Pool, Network, EvmConfig> LoadReceipt for EthApi<Provider, Pool, Network, EvmConfig>
where
Self: RpcNodeCoreExt<Provider: TransactionsProvider<Transaction = TransactionSigned>>,
Self: RpcNodeCoreExt<
Provider: TransactionsProvider<Transaction = TransactionSigned>
+ ReceiptProvider<Receipt = reth_primitives::Receipt>,
>,
{
async fn build_transaction_receipt(
&self,

View File

@@ -25,7 +25,7 @@ use reth_db::{models::BlockNumberAddress, transaction::DbTx, Database};
use reth_db_api::models::{AccountBeforeTx, StoredBlockBodyIndices};
use reth_evm::ConfigureEvmEnv;
use reth_execution_types::ExecutionOutcome;
use reth_node_types::{BlockTy, NodeTypesWithDB, TxTy};
use reth_node_types::{BlockTy, NodeTypesWithDB, ReceiptTy, TxTy};
use reth_primitives::{
Account, Block, BlockWithSenders, EthPrimitives, NodePrimitives, Receipt, SealedBlock,
SealedBlockFor, SealedBlockWithSenders, SealedHeader, StorageEntry, TransactionMeta,
@@ -288,7 +288,7 @@ impl<N: ProviderNodeTypes> BlockReader for BlockchainProvider2<N> {
fn pending_block_and_receipts(
&self,
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Receipt>)>> {
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> {
Ok(self.canonical_in_memory_state.pending_block_and_receipts())
}
@@ -411,28 +411,33 @@ impl<N: ProviderNodeTypes> TransactionsProvider for BlockchainProvider2<N> {
}
impl<N: ProviderNodeTypes> ReceiptProvider for BlockchainProvider2<N> {
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Receipt>> {
type Receipt = ReceiptTy<N>;
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Self::Receipt>> {
self.consistent_provider()?.receipt(id)
}
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Receipt>> {
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Self::Receipt>> {
self.consistent_provider()?.receipt_by_hash(hash)
}
fn receipts_by_block(&self, block: BlockHashOrNumber) -> ProviderResult<Option<Vec<Receipt>>> {
fn receipts_by_block(
&self,
block: BlockHashOrNumber,
) -> ProviderResult<Option<Vec<Self::Receipt>>> {
self.consistent_provider()?.receipts_by_block(block)
}
fn receipts_by_tx_range(
&self,
range: impl RangeBounds<TxNumber>,
) -> ProviderResult<Vec<Receipt>> {
) -> ProviderResult<Vec<Self::Receipt>> {
self.consistent_provider()?.receipts_by_tx_range(range)
}
}
impl<N: ProviderNodeTypes> ReceiptProviderIdExt for BlockchainProvider2<N> {
fn receipts_by_block_id(&self, block: BlockId) -> ProviderResult<Option<Vec<Receipt>>> {
fn receipts_by_block_id(&self, block: BlockId) -> ProviderResult<Option<Vec<Self::Receipt>>> {
self.consistent_provider()?.receipts_by_block_id(block)
}
}
@@ -759,6 +764,8 @@ impl<N: ProviderNodeTypes> AccountReader for BlockchainProvider2<N> {
}
impl<N: ProviderNodeTypes> StateReader for BlockchainProvider2<N> {
type Receipt = ReceiptTy<N>;
/// Re-constructs the [`ExecutionOutcome`] from in-memory and database state, if necessary.
///
/// If data for the block does not exist, this will return [`None`].
@@ -768,7 +775,10 @@ impl<N: ProviderNodeTypes> StateReader for BlockchainProvider2<N> {
/// inconsistent. Currently this can safely be called within the blockchain tree thread,
/// because the tree thread is responsible for modifying the [`CanonicalInMemoryState`] in the
/// first place.
fn get_state(&self, block: BlockNumber) -> ProviderResult<Option<ExecutionOutcome>> {
fn get_state(
&self,
block: BlockNumber,
) -> ProviderResult<Option<ExecutionOutcome<Self::Receipt>>> {
StateReader::get_state(&self.consistent_provider()?, block)
}
}

View File

@@ -19,10 +19,10 @@ use reth_db::models::BlockNumberAddress;
use reth_db_api::models::{AccountBeforeTx, StoredBlockBodyIndices};
use reth_evm::ConfigureEvmEnv;
use reth_execution_types::{BundleStateInit, ExecutionOutcome, RevertsInit};
use reth_node_types::{BlockTy, TxTy};
use reth_node_types::{BlockTy, ReceiptTy, TxTy};
use reth_primitives::{
Account, BlockWithSenders, Receipt, SealedBlockFor, SealedBlockWithSenders, SealedHeader,
StorageEntry, TransactionMeta,
Account, BlockWithSenders, SealedBlockFor, SealedBlockWithSenders, SealedHeader, StorageEntry,
TransactionMeta,
};
use reth_primitives_traits::{Block, BlockBody};
use reth_prune_types::{PruneCheckpoint, PruneSegment};
@@ -151,7 +151,7 @@ impl<N: ProviderNodeTypes> ConsistentProvider<N> {
pub fn get_state(
&self,
range: RangeInclusive<BlockNumber>,
) -> ProviderResult<Option<ExecutionOutcome>> {
) -> ProviderResult<Option<ExecutionOutcome<ReceiptTy<N>>>> {
if range.is_empty() {
return Ok(None)
}
@@ -828,7 +828,7 @@ impl<N: ProviderNodeTypes> BlockReader for ConsistentProvider<N> {
fn pending_block_and_receipts(
&self,
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Receipt>)>> {
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> {
Ok(self.canonical_in_memory_state.pending_block_and_receipts())
}
@@ -1078,7 +1078,9 @@ impl<N: ProviderNodeTypes> TransactionsProvider for ConsistentProvider<N> {
}
impl<N: ProviderNodeTypes> ReceiptProvider for ConsistentProvider<N> {
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Receipt>> {
type Receipt = ReceiptTy<N>;
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Self::Receipt>> {
self.get_in_memory_or_storage_by_tx(
id.into(),
|provider| provider.receipt(id),
@@ -1088,7 +1090,7 @@ impl<N: ProviderNodeTypes> ReceiptProvider for ConsistentProvider<N> {
)
}
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Receipt>> {
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Self::Receipt>> {
for block_state in self.head_block.iter().flat_map(|b| b.chain()) {
let executed_block = block_state.block_ref();
let block = executed_block.block();
@@ -1112,7 +1114,10 @@ impl<N: ProviderNodeTypes> ReceiptProvider for ConsistentProvider<N> {
self.storage_provider.receipt_by_hash(hash)
}
fn receipts_by_block(&self, block: BlockHashOrNumber) -> ProviderResult<Option<Vec<Receipt>>> {
fn receipts_by_block(
&self,
block: BlockHashOrNumber,
) -> ProviderResult<Option<Vec<Self::Receipt>>> {
self.get_in_memory_or_storage_by_block(
block,
|db_provider| db_provider.receipts_by_block(block),
@@ -1123,7 +1128,7 @@ impl<N: ProviderNodeTypes> ReceiptProvider for ConsistentProvider<N> {
fn receipts_by_tx_range(
&self,
range: impl RangeBounds<TxNumber>,
) -> ProviderResult<Vec<Receipt>> {
) -> ProviderResult<Vec<Self::Receipt>> {
self.get_in_memory_or_storage_by_tx_range(
range,
|db_provider, db_range| db_provider.receipts_by_tx_range(db_range),
@@ -1135,7 +1140,7 @@ impl<N: ProviderNodeTypes> ReceiptProvider for ConsistentProvider<N> {
}
impl<N: ProviderNodeTypes> ReceiptProviderIdExt for ConsistentProvider<N> {
fn receipts_by_block_id(&self, block: BlockId) -> ProviderResult<Option<Vec<Receipt>>> {
fn receipts_by_block_id(&self, block: BlockId) -> ProviderResult<Option<Vec<Self::Receipt>>> {
match block {
BlockId::Hash(rpc_block_hash) => {
let mut receipts = self.receipts_by_block(rpc_block_hash.block_hash.into())?;
@@ -1496,6 +1501,8 @@ impl<N: ProviderNodeTypes> AccountReader for ConsistentProvider<N> {
}
impl<N: ProviderNodeTypes> StateReader for ConsistentProvider<N> {
type Receipt = ReceiptTy<N>;
/// Re-constructs the [`ExecutionOutcome`] from in-memory and database state, if necessary.
///
/// If data for the block does not exist, this will return [`None`].

View File

@@ -19,10 +19,10 @@ use reth_db::{init_db, mdbx::DatabaseArguments, DatabaseEnv};
use reth_db_api::{database::Database, models::StoredBlockBodyIndices};
use reth_errors::{RethError, RethResult};
use reth_evm::ConfigureEvmEnv;
use reth_node_types::{BlockTy, NodeTypesWithDB, TxTy};
use reth_node_types::{BlockTy, NodeTypesWithDB, ReceiptTy, TxTy};
use reth_primitives::{
BlockWithSenders, Receipt, SealedBlockFor, SealedBlockWithSenders, SealedHeader,
StaticFileSegment, TransactionMeta,
BlockWithSenders, SealedBlockFor, SealedBlockWithSenders, SealedHeader, StaticFileSegment,
TransactionMeta,
};
use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment};
use reth_stages_types::{StageCheckpoint, StageId};
@@ -381,7 +381,7 @@ impl<N: ProviderNodeTypes> BlockReader for ProviderFactory<N> {
fn pending_block_and_receipts(
&self,
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Receipt>)>> {
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> {
self.provider()?.pending_block_and_receipts()
}
@@ -508,7 +508,8 @@ impl<N: ProviderNodeTypes> TransactionsProvider for ProviderFactory<N> {
}
impl<N: ProviderNodeTypes> ReceiptProvider for ProviderFactory<N> {
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Receipt>> {
type Receipt = ReceiptTy<N>;
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Self::Receipt>> {
self.static_file_provider.get_with_static_file_or_database(
StaticFileSegment::Receipts,
id,
@@ -517,18 +518,21 @@ impl<N: ProviderNodeTypes> ReceiptProvider for ProviderFactory<N> {
)
}
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Receipt>> {
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Self::Receipt>> {
self.provider()?.receipt_by_hash(hash)
}
fn receipts_by_block(&self, block: BlockHashOrNumber) -> ProviderResult<Option<Vec<Receipt>>> {
fn receipts_by_block(
&self,
block: BlockHashOrNumber,
) -> ProviderResult<Option<Vec<Self::Receipt>>> {
self.provider()?.receipts_by_block(block)
}
fn receipts_by_tx_range(
&self,
range: impl RangeBounds<TxNumber>,
) -> ProviderResult<Vec<Receipt>> {
) -> ProviderResult<Vec<Self::Receipt>> {
self.static_file_provider.get_range_with_static_file_or_database(
StaticFileSegment::Receipts,
to_range(range),

View File

@@ -46,11 +46,11 @@ use reth_db_api::{
use reth_evm::ConfigureEvmEnv;
use reth_execution_types::{Chain, ExecutionOutcome};
use reth_network_p2p::headers::downloader::SyncTarget;
use reth_node_types::{BlockTy, BodyTy, NodeTypes, TxTy};
use reth_node_types::{BlockTy, BodyTy, NodeTypes, ReceiptTy, TxTy};
use reth_primitives::{
Account, BlockExt, BlockWithSenders, Bytecode, GotExpected, Receipt, SealedBlock,
SealedBlockFor, SealedBlockWithSenders, SealedHeader, StaticFileSegment, StorageEntry,
TransactionMeta, TransactionSignedNoHash,
Account, BlockExt, BlockWithSenders, Bytecode, GotExpected, SealedBlock, SealedBlockFor,
SealedBlockWithSenders, SealedHeader, StaticFileSegment, StorageEntry, TransactionMeta,
TransactionSignedNoHash,
};
use reth_primitives_traits::{Block as _, BlockBody as _, SignedTransaction};
use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment};
@@ -1199,7 +1199,7 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> BlockReader for DatabaseProvid
fn pending_block_and_receipts(
&self,
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Receipt>)>> {
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> {
Ok(None)
}
@@ -1529,7 +1529,9 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> TransactionsProvider for Datab
}
impl<TX: DbTx + 'static, N: NodeTypesForProvider> ReceiptProvider for DatabaseProvider<TX, N> {
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Receipt>> {
type Receipt = ReceiptTy<N>;
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Self::Receipt>> {
self.static_file_provider.get_with_static_file_or_database(
StaticFileSegment::Receipts,
id,
@@ -1538,7 +1540,7 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> ReceiptProvider for DatabasePr
)
}
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Receipt>> {
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Self::Receipt>> {
if let Some(id) = self.transaction_id(hash)? {
self.receipt(id)
} else {
@@ -1546,7 +1548,10 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> ReceiptProvider for DatabasePr
}
}
fn receipts_by_block(&self, block: BlockHashOrNumber) -> ProviderResult<Option<Vec<Receipt>>> {
fn receipts_by_block(
&self,
block: BlockHashOrNumber,
) -> ProviderResult<Option<Vec<Self::Receipt>>> {
if let Some(number) = self.convert_hash_or_number(block)? {
if let Some(body) = self.block_body_indices(number)? {
let tx_range = body.tx_num_range();
@@ -1563,7 +1568,7 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> ReceiptProvider for DatabasePr
fn receipts_by_tx_range(
&self,
range: impl RangeBounds<TxNumber>,
) -> ProviderResult<Vec<Receipt>> {
) -> ProviderResult<Vec<Self::Receipt>> {
self.static_file_provider.get_range_with_static_file_or_database(
StaticFileSegment::Receipts,
to_range(range),

View File

@@ -24,7 +24,7 @@ use reth_chainspec::{ChainInfo, EthereumHardforks};
use reth_db::table::Value;
use reth_db_api::models::{AccountBeforeTx, StoredBlockBodyIndices};
use reth_evm::ConfigureEvmEnv;
use reth_node_types::{BlockTy, FullNodePrimitives, NodeTypes, NodeTypesWithDB, TxTy};
use reth_node_types::{BlockTy, FullNodePrimitives, NodeTypes, NodeTypesWithDB, ReceiptTy, TxTy};
use reth_primitives::{
Account, BlockWithSenders, EthPrimitives, Receipt, SealedBlock, SealedBlockFor,
SealedBlockWithSenders, SealedHeader, TransactionMeta,
@@ -516,22 +516,27 @@ impl<N: ProviderNodeTypes> TransactionsProvider for BlockchainProvider<N> {
}
impl<N: ProviderNodeTypes> ReceiptProvider for BlockchainProvider<N> {
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Receipt>> {
type Receipt = ReceiptTy<N>;
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Self::Receipt>> {
self.database.receipt(id)
}
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Receipt>> {
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Self::Receipt>> {
self.database.receipt_by_hash(hash)
}
fn receipts_by_block(&self, block: BlockHashOrNumber) -> ProviderResult<Option<Vec<Receipt>>> {
fn receipts_by_block(
&self,
block: BlockHashOrNumber,
) -> ProviderResult<Option<Vec<Self::Receipt>>> {
self.database.receipts_by_block(block)
}
fn receipts_by_tx_range(
&self,
range: impl RangeBounds<TxNumber>,
) -> ProviderResult<Vec<Receipt>> {
) -> ProviderResult<Vec<Self::Receipt>> {
self.database.receipts_by_tx_range(range)
}
}

View File

@@ -18,7 +18,7 @@ use reth_db::{
table::Decompress,
};
use reth_node_types::NodePrimitives;
use reth_primitives::{transaction::recover_signers, Receipt, SealedHeader, TransactionMeta};
use reth_primitives::{transaction::recover_signers, SealedHeader, TransactionMeta};
use reth_primitives_traits::SignedTransaction;
use reth_storage_errors::provider::{ProviderError, ProviderResult};
use std::{
@@ -300,14 +300,16 @@ impl<N: NodePrimitives<SignedTx: Decompress + SignedTransaction>> TransactionsPr
}
}
impl<N: NodePrimitives<SignedTx: Decompress + SignedTransaction>> ReceiptProvider
for StaticFileJarProvider<'_, N>
impl<N: NodePrimitives<SignedTx: Decompress + SignedTransaction, Receipt: Decompress>>
ReceiptProvider for StaticFileJarProvider<'_, N>
{
fn receipt(&self, num: TxNumber) -> ProviderResult<Option<Receipt>> {
self.cursor()?.get_one::<ReceiptMask<Receipt>>(num.into())
type Receipt = N::Receipt;
fn receipt(&self, num: TxNumber) -> ProviderResult<Option<Self::Receipt>> {
self.cursor()?.get_one::<ReceiptMask<Self::Receipt>>(num.into())
}
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Receipt>> {
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Self::Receipt>> {
if let Some(tx_static_file) = &self.auxiliary_jar {
if let Some(num) = tx_static_file.transaction_id(hash)? {
return self.receipt(num)
@@ -316,7 +318,10 @@ impl<N: NodePrimitives<SignedTx: Decompress + SignedTransaction>> ReceiptProvide
Ok(None)
}
fn receipts_by_block(&self, _block: BlockHashOrNumber) -> ProviderResult<Option<Vec<Receipt>>> {
fn receipts_by_block(
&self,
_block: BlockHashOrNumber,
) -> ProviderResult<Option<Vec<Self::Receipt>>> {
// Related to indexing tables. StaticFile should get the tx_range and call static file
// provider with `receipt()` instead for each
Err(ProviderError::UnsupportedProvider)
@@ -325,13 +330,13 @@ impl<N: NodePrimitives<SignedTx: Decompress + SignedTransaction>> ReceiptProvide
fn receipts_by_tx_range(
&self,
range: impl RangeBounds<TxNumber>,
) -> ProviderResult<Vec<Receipt>> {
) -> ProviderResult<Vec<Self::Receipt>> {
let range = to_range(range);
let mut cursor = self.cursor()?;
let mut receipts = Vec::with_capacity((range.end - range.start) as usize);
for num in range {
if let Some(tx) = cursor.get_one::<ReceiptMask<Receipt>>(num.into())? {
if let Some(tx) = cursor.get_one::<ReceiptMask<Self::Receipt>>(num.into())? {
receipts.push(tx)
}
}

View File

@@ -38,8 +38,8 @@ use reth_primitives::{
DEFAULT_BLOCKS_PER_STATIC_FILE,
},
transaction::recover_signers,
BlockWithSenders, Receipt, SealedBlockFor, SealedBlockWithSenders, SealedHeader,
StaticFileSegment, TransactionMeta, TransactionSignedNoHash,
BlockWithSenders, SealedBlockFor, SealedBlockWithSenders, SealedHeader, StaticFileSegment,
TransactionMeta, TransactionSignedNoHash,
};
use reth_primitives_traits::SignedTransaction;
use reth_stages_types::{PipelineTarget, StageId};
@@ -1341,10 +1341,12 @@ impl<N: NodePrimitives> BlockHashReader for StaticFileProvider<N> {
}
}
impl<N: NodePrimitives<SignedTx: Value + SignedTransaction>> ReceiptProvider
impl<N: NodePrimitives<SignedTx: Value + SignedTransaction, Receipt: Value>> ReceiptProvider
for StaticFileProvider<N>
{
fn receipt(&self, num: TxNumber) -> ProviderResult<Option<Receipt>> {
type Receipt = N::Receipt;
fn receipt(&self, num: TxNumber) -> ProviderResult<Option<Self::Receipt>> {
self.get_segment_provider_from_transaction(StaticFileSegment::Receipts, num, None)
.and_then(|provider| provider.receipt(num))
.or_else(|err| {
@@ -1356,31 +1358,36 @@ impl<N: NodePrimitives<SignedTx: Value + SignedTransaction>> ReceiptProvider
})
}
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Receipt>> {
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Self::Receipt>> {
if let Some(num) = self.transaction_id(hash)? {
return self.receipt(num)
}
Ok(None)
}
fn receipts_by_block(&self, _block: BlockHashOrNumber) -> ProviderResult<Option<Vec<Receipt>>> {
fn receipts_by_block(
&self,
_block: BlockHashOrNumber,
) -> ProviderResult<Option<Vec<Self::Receipt>>> {
unreachable!()
}
fn receipts_by_tx_range(
&self,
range: impl RangeBounds<TxNumber>,
) -> ProviderResult<Vec<Receipt>> {
) -> ProviderResult<Vec<Self::Receipt>> {
self.fetch_range_with_predicate(
StaticFileSegment::Receipts,
to_range(range),
|cursor, number| cursor.get_one::<ReceiptMask<Receipt>>(number.into()),
|cursor, number| cursor.get_one::<ReceiptMask<Self::Receipt>>(number.into()),
|_| true,
)
}
}
impl<N: FullNodePrimitives<SignedTx: Value>> TransactionsProviderExt for StaticFileProvider<N> {
impl<N: FullNodePrimitives<SignedTx: Value, Receipt: Value>> TransactionsProviderExt
for StaticFileProvider<N>
{
fn transaction_hashes_by_range(
&self,
tx_range: Range<TxNumber>,
@@ -1575,7 +1582,7 @@ impl<N: NodePrimitives> BlockNumReader for StaticFileProvider<N> {
}
}
impl<N: FullNodePrimitives<SignedTx: Value>> BlockReader for StaticFileProvider<N> {
impl<N: FullNodePrimitives<SignedTx: Value, Receipt: Value>> BlockReader for StaticFileProvider<N> {
type Block = N::Block;
fn find_block_by_hash(
@@ -1606,7 +1613,7 @@ impl<N: FullNodePrimitives<SignedTx: Value>> BlockReader for StaticFileProvider<
fn pending_block_and_receipts(
&self,
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Receipt>)>> {
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> {
// Required data not present in static_files
Err(ProviderError::UnsupportedProvider)
}

View File

@@ -379,6 +379,8 @@ impl TransactionsProvider for MockEthProvider {
}
impl ReceiptProvider for MockEthProvider {
type Receipt = Receipt;
fn receipt(&self, _id: TxNumber) -> ProviderResult<Option<Receipt>> {
Ok(None)
}
@@ -828,6 +830,8 @@ impl ChangeSetReader for MockEthProvider {
}
impl StateReader for MockEthProvider {
type Receipt = Receipt;
fn get_state(&self, _block: BlockNumber) -> ProviderResult<Option<ExecutionOutcome>> {
Ok(None)
}

View File

@@ -260,6 +260,7 @@ impl TransactionsProvider for NoopProvider {
}
impl ReceiptProvider for NoopProvider {
type Receipt = Receipt;
fn receipt(&self, _id: TxNumber) -> ProviderResult<Option<Receipt>> {
Ok(None)
}

View File

@@ -80,8 +80,14 @@ impl<T: BlockExecutionWriter> BlockExecutionWriter for &T {
/// This just receives state, or [`ExecutionOutcome`], from the provider
#[auto_impl::auto_impl(&, Arc, Box)]
pub trait StateReader: Send + Sync {
/// Receipt type in [`ExecutionOutcome`].
type Receipt: Send + Sync;
/// Get the [`ExecutionOutcome`] for the given block
fn get_state(&self, block: BlockNumber) -> ProviderResult<Option<ExecutionOutcome>>;
fn get_state(
&self,
block: BlockNumber,
) -> ProviderResult<Option<ExecutionOutcome<Self::Receipt>>>;
}
/// Block Writer

View File

@@ -7,19 +7,21 @@ use crate::{
};
use reth_chain_state::{CanonStateSubscriptions, ForkChoiceSubscriptions};
use reth_chainspec::EthereumHardforks;
use reth_node_types::{BlockTy, NodeTypesWithDB, TxTy};
use reth_node_types::{BlockTy, NodeTypesWithDB, ReceiptTy, TxTy};
use reth_storage_api::NodePrimitivesProvider;
/// Helper trait to unify all provider traits for simplicity.
pub trait FullProvider<N: NodeTypesWithDB>:
DatabaseProviderFactory<DB = N::DB>
+ StaticFileProviderFactory<Primitives = N::Primitives>
+ BlockReaderIdExt<Transaction = TxTy<N>, Block = BlockTy<N>>
+ NodePrimitivesProvider<Primitives = N::Primitives>
+ StaticFileProviderFactory
+ BlockReaderIdExt<Transaction = TxTy<N>, Block = BlockTy<N>, Receipt = ReceiptTy<N>>
+ AccountReader
+ StateProviderFactory
+ EvmEnvProvider
+ ChainSpecProvider<ChainSpec = N::ChainSpec>
+ ChangeSetReader
+ CanonStateSubscriptions<Primitives = N::Primitives>
+ CanonStateSubscriptions
+ ForkChoiceSubscriptions
+ StageCheckpointReader
+ Clone
@@ -30,14 +32,15 @@ pub trait FullProvider<N: NodeTypesWithDB>:
impl<T, N: NodeTypesWithDB> FullProvider<N> for T where
T: DatabaseProviderFactory<DB = N::DB>
+ StaticFileProviderFactory<Primitives = N::Primitives>
+ BlockReaderIdExt<Transaction = TxTy<N>, Block = BlockTy<N>>
+ NodePrimitivesProvider<Primitives = N::Primitives>
+ StaticFileProviderFactory
+ BlockReaderIdExt<Transaction = TxTy<N>, Block = BlockTy<N>, Receipt = ReceiptTy<N>>
+ AccountReader
+ StateProviderFactory
+ EvmEnvProvider
+ ChainSpecProvider<ChainSpec = N::ChainSpec>
+ ChangeSetReader
+ CanonStateSubscriptions<Primitives = N::Primitives>
+ CanonStateSubscriptions
+ ForkChoiceSubscriptions
+ StageCheckpointReader
+ Clone

View File

@@ -6,9 +6,7 @@ use alloy_consensus::Header;
use alloy_eips::{BlockHashOrNumber, BlockId, BlockNumberOrTag};
use alloy_primitives::{BlockNumber, B256};
use reth_db_models::StoredBlockBodyIndices;
use reth_primitives::{
BlockWithSenders, Receipt, SealedBlockFor, SealedBlockWithSenders, SealedHeader,
};
use reth_primitives::{BlockWithSenders, SealedBlockFor, SealedBlockWithSenders, SealedHeader};
use reth_storage_errors::provider::ProviderResult;
use std::ops::RangeInclusive;
@@ -95,7 +93,7 @@ pub trait BlockReader:
#[allow(clippy::type_complexity)]
fn pending_block_and_receipts(
&self,
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Receipt>)>>;
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>>;
/// Returns the ommers/uncle headers of the given block from the database.
///
@@ -186,7 +184,7 @@ impl<T: BlockReader> BlockReader for std::sync::Arc<T> {
}
fn pending_block_and_receipts(
&self,
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Receipt>)>> {
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> {
T::pending_block_and_receipts(self)
}
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Header>>> {
@@ -255,7 +253,7 @@ impl<T: BlockReader> BlockReader for &T {
}
fn pending_block_and_receipts(
&self,
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Receipt>)>> {
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> {
T::pending_block_and_receipts(self)
}
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Header>>> {

View File

@@ -1,33 +1,38 @@
use crate::BlockIdReader;
use alloy_eips::{BlockHashOrNumber, BlockId, BlockNumberOrTag};
use alloy_primitives::{TxHash, TxNumber};
use reth_primitives::Receipt;
use reth_storage_errors::provider::ProviderResult;
use std::ops::RangeBounds;
/// Client trait for fetching [Receipt] data .
/// Client trait for fetching receipt data.
#[auto_impl::auto_impl(&, Arc)]
pub trait ReceiptProvider: Send + Sync {
/// The receipt type.
type Receipt: Send + Sync;
/// Get receipt by transaction number
///
/// Returns `None` if the transaction is not found.
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Receipt>>;
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Self::Receipt>>;
/// Get receipt by transaction hash.
///
/// Returns `None` if the transaction is not found.
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Receipt>>;
fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Self::Receipt>>;
/// Get receipts by block num or hash.
///
/// Returns `None` if the block is not found.
fn receipts_by_block(&self, block: BlockHashOrNumber) -> ProviderResult<Option<Vec<Receipt>>>;
fn receipts_by_block(
&self,
block: BlockHashOrNumber,
) -> ProviderResult<Option<Vec<Self::Receipt>>>;
/// Get receipts by tx range.
fn receipts_by_tx_range(
&self,
range: impl RangeBounds<TxNumber>,
) -> ProviderResult<Vec<Receipt>>;
) -> ProviderResult<Vec<Self::Receipt>>;
}
/// Trait extension for `ReceiptProvider`, for types that implement `BlockId` conversion.
@@ -40,10 +45,9 @@ pub trait ReceiptProvider: Send + Sync {
/// so this trait can only be implemented for types that implement `BlockIdReader`. The
/// `BlockIdReader` methods should be used to resolve `BlockId`s to block numbers or hashes, and
/// retrieving the receipts should be done using the type's `ReceiptProvider` methods.
#[auto_impl::auto_impl(&, Arc)]
pub trait ReceiptProviderIdExt: ReceiptProvider + BlockIdReader {
/// Get receipt by block id
fn receipts_by_block_id(&self, block: BlockId) -> ProviderResult<Option<Vec<Receipt>>> {
fn receipts_by_block_id(&self, block: BlockId) -> ProviderResult<Option<Vec<Self::Receipt>>> {
let id = match block {
BlockId::Hash(hash) => BlockHashOrNumber::Hash(hash.block_hash),
BlockId::Number(num_tag) => {
@@ -64,7 +68,7 @@ pub trait ReceiptProviderIdExt: ReceiptProvider + BlockIdReader {
fn receipts_by_number_or_tag(
&self,
number_or_tag: BlockNumberOrTag,
) -> ProviderResult<Option<Vec<Receipt>>> {
) -> ProviderResult<Option<Vec<Self::Receipt>>> {
self.receipts_by_block_id(number_or_tag.into())
}
}

View File

@@ -1,4 +1,4 @@
use crate::{BlockNumReader, BlockReader};
use crate::{BlockNumReader, BlockReader, ReceiptProvider};
use alloy_eips::BlockHashOrNumber;
use alloy_primitives::{Address, BlockNumber, TxHash, TxNumber};
use reth_primitives::TransactionMeta;
@@ -84,6 +84,9 @@ pub trait TransactionsProvider: BlockNumReader + Send + Sync {
/// A helper type alias to access [`TransactionsProvider::Transaction`].
pub type ProviderTx<P> = <P as TransactionsProvider>::Transaction;
/// A helper type alias to access [`ReceiptProvider::Receipt`].
pub type ProviderReceipt<P> = <P as ReceiptProvider>::Receipt;
/// Client trait for fetching additional transactions related data.
#[auto_impl::auto_impl(&, Arc)]
pub trait TransactionsProviderExt: BlockReader + Send + Sync {

View File

@@ -166,7 +166,9 @@ fn block_provider_example<T: BlockReader<Block = reth_primitives::Block>>(
/// The `ReceiptProvider` allows querying the receipts tables.
fn receipts_provider_example<
T: ReceiptProvider + TransactionsProvider<Transaction = TransactionSigned> + HeaderProvider,
T: ReceiptProvider<Receipt = reth_primitives::Receipt>
+ TransactionsProvider<Transaction = TransactionSigned>
+ HeaderProvider,
>(
provider: T,
) -> eyre::Result<()> {