reth_trie_db/
prefix_set.rs1use alloy_primitives::{
2 keccak256,
3 map::{HashMap, HashSet},
4 BlockNumber, B256,
5};
6use core::ops::RangeInclusive;
7use reth_db_api::{
8 cursor::DbCursorRO,
9 models::{AccountBeforeTx, BlockNumberAddress},
10 tables,
11 transaction::DbTx,
12};
13use reth_storage_api::{ChangeSetReader, DBProvider, StorageChangeSetReader};
14use reth_storage_errors::provider::ProviderError;
15use reth_trie::{
16 prefix_set::{PrefixSetMut, TriePrefixSets},
17 Nibbles,
18};
19
20pub fn load_prefix_sets_with_provider<Provider>(
28 provider: &Provider,
29 range: RangeInclusive<BlockNumber>,
30) -> Result<TriePrefixSets, ProviderError>
31where
32 Provider: ChangeSetReader + StorageChangeSetReader + DBProvider,
33{
34 let tx = provider.tx_ref();
35
36 let mut account_prefix_set = PrefixSetMut::default();
38 let mut storage_prefix_sets = HashMap::<B256, PrefixSetMut>::default();
39 let mut destroyed_accounts = HashSet::default();
40
41 let account_changesets = provider.account_changesets_range(*range.start()..*range.end() + 1)?;
43
44 let mut account_hashed_state_cursor = tx.cursor_read::<tables::HashedAccounts>()?;
46
47 for (_, AccountBeforeTx { address, .. }) in account_changesets {
48 let hashed_address = keccak256(address);
49 account_prefix_set.insert(Nibbles::unpack(hashed_address));
50
51 if account_hashed_state_cursor.seek_exact(hashed_address)?.is_none() {
52 destroyed_accounts.insert(hashed_address);
53 }
54 }
55
56 let storage_changesets = provider.storage_changesets_range(range)?;
58 for (BlockNumberAddress((_, address)), storage_entry) in storage_changesets {
59 let hashed_address = keccak256(address);
60 account_prefix_set.insert(Nibbles::unpack(hashed_address));
61 storage_prefix_sets
62 .entry(hashed_address)
63 .or_default()
64 .insert(Nibbles::unpack(storage_entry.key.to_hashed()));
65 }
66
67 Ok(TriePrefixSets {
68 account_prefix_set: account_prefix_set.freeze(),
69 storage_prefix_sets: storage_prefix_sets
70 .into_iter()
71 .map(|(k, v)| (k, v.freeze()))
72 .collect(),
73 destroyed_accounts,
74 })
75}