reth_storage_api/
storage.rs1use alloc::{
2 collections::{BTreeMap, BTreeSet},
3 vec::Vec,
4};
5use alloy_primitives::{Address, BlockNumber, B256, U256};
6use core::ops::{RangeBounds, RangeInclusive};
7use reth_primitives_traits::{StorageEntry, StorageSlotKey};
8use reth_storage_errors::provider::ProviderResult;
9
10#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
17pub struct ChangesetEntry {
18 pub key: StorageSlotKey,
20 pub value: U256,
22}
23
24impl ChangesetEntry {
25 pub const fn into_storage_entry(self) -> StorageEntry {
27 StorageEntry { key: self.key.as_b256(), value: self.value }
28 }
29}
30
31impl From<ChangesetEntry> for StorageEntry {
32 fn from(e: ChangesetEntry) -> Self {
33 e.into_storage_entry()
34 }
35}
36
37#[auto_impl::auto_impl(&, Box)]
39pub trait StorageReader: Send {
40 fn plain_state_storages(
42 &self,
43 addresses_with_keys: impl IntoIterator<Item = (Address, impl IntoIterator<Item = B256>)>,
44 ) -> ProviderResult<Vec<(Address, Vec<StorageEntry>)>>;
45
46 fn changed_storages_with_range(
48 &self,
49 range: RangeInclusive<BlockNumber>,
50 ) -> ProviderResult<BTreeMap<Address, BTreeSet<B256>>>;
51
52 fn changed_storages_and_blocks_with_range(
57 &self,
58 range: RangeInclusive<BlockNumber>,
59 ) -> ProviderResult<BTreeMap<(Address, B256), Vec<u64>>>;
60}
61
62#[cfg(feature = "db-api")]
64#[auto_impl::auto_impl(&, Box)]
65pub trait StorageChangeSetReader: Send {
66 fn storage_changeset(
71 &self,
72 block_number: BlockNumber,
73 ) -> ProviderResult<Vec<(reth_db_api::models::BlockNumberAddress, ChangesetEntry)>>;
74
75 fn get_storage_before_block(
82 &self,
83 block_number: BlockNumber,
84 address: Address,
85 storage_key: B256,
86 ) -> ProviderResult<Option<ChangesetEntry>>;
87
88 fn storage_changesets_range(
93 &self,
94 range: impl RangeBounds<BlockNumber>,
95 ) -> ProviderResult<Vec<(reth_db_api::models::BlockNumberAddress, ChangesetEntry)>>;
96
97 fn storage_changeset_count(&self) -> ProviderResult<usize>;
99
100 fn storage_block_changeset(
104 &self,
105 block_number: BlockNumber,
106 ) -> ProviderResult<Vec<reth_db_models::StorageBeforeTx>> {
107 self.storage_changeset(block_number).map(|changesets| {
108 changesets
109 .into_iter()
110 .map(|(block_address, entry)| reth_db_models::StorageBeforeTx {
111 address: block_address.address(),
112 key: entry.key.as_b256(),
113 value: entry.value,
114 })
115 .collect()
116 })
117 }
118}