reth_storage_overlay/
multiproof_calculator.rs1use alloy_primitives::{map::B256Map, B256};
4use reth_db_api::transaction::DbTx;
5use reth_errors::ProviderResult;
6use reth_trie::{
7 hashed_cursor::{HashedPostStateCursorFactory, InstrumentedHashedCursorFactory},
8 prefix_set::TriePrefixSets,
9 proof_v2::{MultiProofCalculator, ProofCursorMetrics},
10 trie_cursor::{InMemoryTrieCursorFactory, InstrumentedTrieCursorFactory},
11 updates::TrieUpdatesSorted,
12 DecodedMultiProofV2, HashedPostStateSorted, MultiProofTargetsV2, TrieInputSorted,
13};
14use reth_trie_db::{
15 DatabaseHashedCursorFactory, DatabaseTrieCursorFactory, LegacyKeyAdapter, PackedKeyAdapter,
16 TrieTableAdapter,
17};
18use std::sync::Arc;
19
20pub(crate) enum OverlayMultiProofCalculator<TX: DbTx + 'static> {
25 Legacy(TableMultiProofCalculator<TX, LegacyKeyAdapter>),
27 Packed(TableMultiProofCalculator<TX, PackedKeyAdapter>),
29}
30
31impl<TX: DbTx + 'static> OverlayMultiProofCalculator<TX> {
32 pub(crate) unsafe fn new(
43 tx: &TX,
44 input: &TrieInputSorted,
45 is_v2: bool,
46 metrics: ProofCursorMetrics,
47 known_storage_roots: Arc<B256Map<B256>>,
48 ) -> Self {
49 let (tx, nodes, state) = unsafe {
51 (&*(tx as *const TX), &*Arc::as_ptr(&input.nodes), &*Arc::as_ptr(&input.state))
52 };
53 let prefix_sets = input.prefix_sets.clone().freeze();
54 if is_v2 {
55 Self::Packed(table_multiproof_calculator(
56 tx,
57 nodes,
58 state,
59 prefix_sets,
60 metrics,
61 known_storage_roots,
62 ))
63 } else {
64 Self::Legacy(table_multiproof_calculator(
65 tx,
66 nodes,
67 state,
68 prefix_sets,
69 metrics,
70 known_storage_roots,
71 ))
72 }
73 }
74
75 pub(crate) fn multiproof(
77 &mut self,
78 targets: MultiProofTargetsV2,
79 ) -> ProviderResult<DecodedMultiProofV2> {
80 Ok(match self {
81 Self::Legacy(calculator) => calculator.multiproof(targets)?,
82 Self::Packed(calculator) => calculator.multiproof(targets)?,
83 })
84 }
85}
86
87unsafe impl<TX: DbTx + 'static> Send for OverlayMultiProofCalculator<TX> {}
91
92type TableMultiProofCalculator<TX, A> = MultiProofCalculator<
95 'static,
96 InstrumentedTrieCursorFactory<
97 InMemoryTrieCursorFactory<
98 DatabaseTrieCursorFactory<&'static TX, A>,
99 &'static TrieUpdatesSorted,
100 >,
101 >,
102 InstrumentedHashedCursorFactory<
103 HashedPostStateCursorFactory<
104 DatabaseHashedCursorFactory<&'static TX>,
105 &'static HashedPostStateSorted,
106 >,
107 >,
108>;
109
110fn table_multiproof_calculator<TX: DbTx + 'static, A: TrieTableAdapter>(
112 tx: &'static TX,
113 nodes: &'static TrieUpdatesSorted,
114 state: &'static HashedPostStateSorted,
115 prefix_sets: TriePrefixSets,
116 metrics: ProofCursorMetrics,
117 known_storage_roots: Arc<B256Map<B256>>,
118) -> TableMultiProofCalculator<TX, A> {
119 MultiProofCalculator::new(
120 metrics.instrument_trie_factory(InMemoryTrieCursorFactory::new(
121 DatabaseTrieCursorFactory::new(tx),
122 nodes,
123 )),
124 metrics.instrument_hashed_factory(HashedPostStateCursorFactory::new(
125 DatabaseHashedCursorFactory::new(tx),
126 state,
127 )),
128 prefix_sets,
129 known_storage_roots,
130 )
131}