Skip to main content

reth_storage_api/
storage.rs

1use alloc::{
2    collections::{BTreeMap, BTreeSet},
3    vec::Vec,
4};
5use alloy_primitives::{Address, BlockNumber, B256};
6use core::ops::RangeInclusive;
7use reth_primitives_traits::StorageEntry;
8use reth_storage_errors::provider::ProviderResult;
9
10/// Storage reader
11#[auto_impl::auto_impl(&, Arc, Box)]
12pub trait StorageReader: Send {
13    /// Get plainstate storages for addresses and storage keys.
14    fn plain_state_storages(
15        &self,
16        addresses_with_keys: impl IntoIterator<Item = (Address, impl IntoIterator<Item = B256>)>,
17    ) -> ProviderResult<Vec<(Address, Vec<StorageEntry>)>>;
18
19    /// Iterate over storage changesets and return all storage slots that were changed.
20    fn changed_storages_with_range(
21        &self,
22        range: RangeInclusive<BlockNumber>,
23    ) -> ProviderResult<BTreeMap<Address, BTreeSet<B256>>>;
24
25    /// Iterate over storage changesets and return all storage slots that were changed alongside
26    /// each specific set of blocks.
27    ///
28    /// NOTE: Get inclusive range of blocks.
29    fn changed_storages_and_blocks_with_range(
30        &self,
31        range: RangeInclusive<BlockNumber>,
32    ) -> ProviderResult<BTreeMap<(Address, B256), Vec<u64>>>;
33}
34
35/// Storage `ChangeSet` reader
36#[cfg(feature = "db-api")]
37#[auto_impl::auto_impl(&, Arc, Box)]
38pub trait StorageChangeSetReader: Send {
39    /// Iterate over storage changesets and return the storage state from before this block.
40    fn storage_changeset(
41        &self,
42        block_number: BlockNumber,
43    ) -> ProviderResult<Vec<(reth_db_api::models::BlockNumberAddress, StorageEntry)>>;
44
45    /// Search the block's changesets for the given address and storage key, and return the result.
46    ///
47    /// Returns `None` if the storage slot was not changed in this block.
48    fn get_storage_before_block(
49        &self,
50        block_number: BlockNumber,
51        address: Address,
52        storage_key: B256,
53    ) -> ProviderResult<Option<StorageEntry>>;
54
55    /// Get all storage changesets in a range of blocks.
56    fn storage_changesets_range(
57        &self,
58        range: impl core::ops::RangeBounds<BlockNumber>,
59    ) -> ProviderResult<Vec<(reth_db_api::models::BlockNumberAddress, StorageEntry)>>;
60
61    /// Get the total count of all storage changes.
62    fn storage_changeset_count(&self) -> ProviderResult<usize>;
63
64    /// Get storage changesets for a block as static-file rows.
65    ///
66    /// Default implementation uses `storage_changeset` and maps to `StorageBeforeTx`.
67    fn storage_block_changeset(
68        &self,
69        block_number: BlockNumber,
70    ) -> ProviderResult<Vec<reth_db_models::StorageBeforeTx>> {
71        self.storage_changeset(block_number).map(|changesets| {
72            changesets
73                .into_iter()
74                .map(|(block_address, entry)| reth_db_models::StorageBeforeTx {
75                    address: block_address.address(),
76                    key: entry.key,
77                    value: entry.value,
78                })
79                .collect()
80        })
81    }
82}