reth_trie/proof_v2/
value.rs1use crate::{
4 hashed_cursor::HashedCursorFactory, prefix_set::PrefixSet, proof_v2::ProofCalculator,
5 trie_cursor::TrieCursorFactory,
6};
7use alloy_primitives::{map::B256Map, B256, U256};
8use alloy_rlp::Encodable;
9use reth_execution_errors::trie::StateProofError;
10use reth_primitives_traits::Account;
11use std::rc::Rc;
12
13pub trait DeferredValueEncoder {
15 fn encode(self, buf: &mut Vec<u8>) -> Result<(), StateProofError>;
21}
22
23pub trait LeafValueEncoder {
33 type Value;
35
36 type DeferredEncoder: DeferredValueEncoder;
38
39 fn deferred_encoder(&mut self, key: B256, value: Self::Value) -> Self::DeferredEncoder;
49}
50
51#[derive(Debug, Clone, Copy, Default)]
55pub struct StorageValueEncoder;
56
57#[derive(Debug, Clone, Copy)]
59pub struct StorageDeferredValueEncoder(U256);
60
61impl DeferredValueEncoder for StorageDeferredValueEncoder {
62 fn encode(self, buf: &mut Vec<u8>) -> Result<(), StateProofError> {
63 self.0.encode(buf);
64 Ok(())
65 }
66}
67
68impl LeafValueEncoder for StorageValueEncoder {
69 type Value = U256;
70 type DeferredEncoder = StorageDeferredValueEncoder;
71
72 fn deferred_encoder(&mut self, _key: B256, value: Self::Value) -> Self::DeferredEncoder {
73 StorageDeferredValueEncoder(value)
74 }
75}
76
77#[derive(Debug, Clone)]
82pub struct SyncAccountValueEncoder<T, H> {
83 trie_cursor_factory: Rc<T>,
85 hashed_cursor_factory: Rc<H>,
87 storage_prefix_sets: Rc<B256Map<PrefixSet>>,
89}
90
91impl<T, H> SyncAccountValueEncoder<T, H> {
92 pub fn new(trie_cursor_factory: T, hashed_cursor_factory: H) -> Self {
94 Self {
95 trie_cursor_factory: Rc::new(trie_cursor_factory),
96 hashed_cursor_factory: Rc::new(hashed_cursor_factory),
97 storage_prefix_sets: Rc::new(B256Map::default()),
98 }
99 }
100
101 pub fn with_storage_prefix_sets(mut self, storage_prefix_sets: B256Map<PrefixSet>) -> Self {
105 self.storage_prefix_sets = Rc::new(storage_prefix_sets);
106 self
107 }
108}
109
110#[derive(Debug, Clone)]
112pub struct SyncAccountDeferredValueEncoder<T, H> {
113 trie_cursor_factory: Rc<T>,
114 hashed_cursor_factory: Rc<H>,
115 storage_prefix_sets: Rc<B256Map<PrefixSet>>,
116 hashed_address: B256,
117 account: Account,
118}
119
120impl<T, H> DeferredValueEncoder for SyncAccountDeferredValueEncoder<T, H>
121where
122 T: TrieCursorFactory,
123 H: HashedCursorFactory,
124{
125 fn encode(self, buf: &mut Vec<u8>) -> Result<(), StateProofError> {
126 let trie_cursor = self.trie_cursor_factory.storage_trie_cursor(self.hashed_address)?;
127 let hashed_cursor =
128 self.hashed_cursor_factory.hashed_storage_cursor(self.hashed_address)?;
129
130 let mut storage_proof_calculator = ProofCalculator::new_storage(trie_cursor, hashed_cursor);
131 if let Some(prefix_set) = self.storage_prefix_sets.get(&self.hashed_address) {
132 storage_proof_calculator = storage_proof_calculator.with_prefix_set(prefix_set.clone());
133 }
134 let root_node = storage_proof_calculator.storage_root_node(self.hashed_address)?;
135 let storage_root = storage_proof_calculator
136 .compute_root_hash(&[root_node])?
137 .expect("storage_root_node returns a node at empty path");
138
139 let trie_account = self.account.into_trie_account(storage_root);
140 trie_account.encode(buf);
141
142 Ok(())
143 }
144}
145
146impl<T, H> LeafValueEncoder for SyncAccountValueEncoder<T, H>
147where
148 T: TrieCursorFactory,
149 H: HashedCursorFactory,
150{
151 type Value = Account;
152 type DeferredEncoder = SyncAccountDeferredValueEncoder<T, H>;
153
154 fn deferred_encoder(
155 &mut self,
156 hashed_address: B256,
157 account: Self::Value,
158 ) -> Self::DeferredEncoder {
159 SyncAccountDeferredValueEncoder {
162 trie_cursor_factory: Rc::clone(&self.trie_cursor_factory),
163 hashed_cursor_factory: Rc::clone(&self.hashed_cursor_factory),
164 storage_prefix_sets: Rc::clone(&self.storage_prefix_sets),
165 hashed_address,
166 account,
167 }
168 }
169}