@@ -26,7 +26,7 @@ pub struct MemoryOverlayStateProviderRef<
2626 /// The collection of executed parent blocks. Expected order is newest to oldest.
2727 pub ( crate ) in_memory : Vec < ExecutedBlockWithTrieUpdates < N > > ,
2828 /// Lazy-loaded in-memory trie data.
29- pub ( crate ) trie_input : OnceLock < TrieInput > ,
29+ pub ( crate ) trie_state : OnceLock < MemoryOverlayTrieState > ,
3030}
3131
3232/// A state provider that stores references to in-memory blocks along with their state as well as
@@ -45,7 +45,7 @@ impl<'a, N: NodePrimitives> MemoryOverlayStateProviderRef<'a, N> {
4545 historical : Box < dyn StateProvider + ' a > ,
4646 in_memory : Vec < ExecutedBlockWithTrieUpdates < N > > ,
4747 ) -> Self {
48- Self { historical, in_memory, trie_input : OnceLock :: new ( ) }
48+ Self { historical, in_memory, trie_state : OnceLock :: new ( ) }
4949 }
5050
5151 /// Turn this state provider into a state provider
@@ -54,14 +54,14 @@ impl<'a, N: NodePrimitives> MemoryOverlayStateProviderRef<'a, N> {
5454 }
5555
5656 /// Return lazy-loaded trie state aggregated from in-memory blocks.
57- fn trie_input ( & self ) -> & TrieInput {
58- self . trie_input . get_or_init ( || {
59- TrieInput :: from_blocks (
60- self . in_memory
61- . iter ( )
62- . rev ( )
63- . map ( |block| ( block . hashed_state . as_ref ( ) , block . trie . as_ref ( ) ) ) ,
64- )
57+ fn trie_state ( & self ) -> & MemoryOverlayTrieState {
58+ self . trie_state . get_or_init ( || {
59+ let mut trie_state = MemoryOverlayTrieState :: default ( ) ;
60+ for block in self . in_memory . iter ( ) . rev ( ) {
61+ trie_state . state . extend_ref ( block . hashed_state . as_ref ( ) ) ;
62+ trie_state . nodes . extend_ref ( block . trie . as_ref ( ) ) ;
63+ }
64+ trie_state
6565 } )
6666 }
6767}
@@ -117,7 +117,8 @@ impl<N: NodePrimitives> StateRootProvider for MemoryOverlayStateProviderRef<'_,
117117 }
118118
119119 fn state_root_from_nodes ( & self , mut input : TrieInput ) -> ProviderResult < B256 > {
120- input. prepend_self ( self . trie_input ( ) . clone ( ) ) ;
120+ let MemoryOverlayTrieState { nodes, state } = self . trie_state ( ) . clone ( ) ;
121+ input. prepend_cached ( nodes, state) ;
121122 self . historical . state_root_from_nodes ( input)
122123 }
123124
@@ -132,15 +133,16 @@ impl<N: NodePrimitives> StateRootProvider for MemoryOverlayStateProviderRef<'_,
132133 & self ,
133134 mut input : TrieInput ,
134135 ) -> ProviderResult < ( B256 , TrieUpdates ) > {
135- input. prepend_self ( self . trie_input ( ) . clone ( ) ) ;
136+ let MemoryOverlayTrieState { nodes, state } = self . trie_state ( ) . clone ( ) ;
137+ input. prepend_cached ( nodes, state) ;
136138 self . historical . state_root_from_nodes_with_updates ( input)
137139 }
138140}
139141
140142impl < N : NodePrimitives > StorageRootProvider for MemoryOverlayStateProviderRef < ' _ , N > {
141143 // TODO: Currently this does not reuse available in-memory trie nodes.
142144 fn storage_root ( & self , address : Address , storage : HashedStorage ) -> ProviderResult < B256 > {
143- let state = & self . trie_input ( ) . state ;
145+ let state = & self . trie_state ( ) . state ;
144146 let mut hashed_storage =
145147 state. storages . get ( & keccak256 ( address) ) . cloned ( ) . unwrap_or_default ( ) ;
146148 hashed_storage. extend ( & storage) ;
@@ -154,7 +156,7 @@ impl<N: NodePrimitives> StorageRootProvider for MemoryOverlayStateProviderRef<'_
154156 slot : B256 ,
155157 storage : HashedStorage ,
156158 ) -> ProviderResult < reth_trie:: StorageProof > {
157- let state = & self . trie_input ( ) . state ;
159+ let state = & self . trie_state ( ) . state ;
158160 let mut hashed_storage =
159161 state. storages . get ( & keccak256 ( address) ) . cloned ( ) . unwrap_or_default ( ) ;
160162 hashed_storage. extend ( & storage) ;
@@ -168,7 +170,7 @@ impl<N: NodePrimitives> StorageRootProvider for MemoryOverlayStateProviderRef<'_
168170 slots : & [ B256 ] ,
169171 storage : HashedStorage ,
170172 ) -> ProviderResult < StorageMultiProof > {
171- let state = & self . trie_input ( ) . state ;
173+ let state = & self . trie_state ( ) . state ;
172174 let mut hashed_storage =
173175 state. storages . get ( & keccak256 ( address) ) . cloned ( ) . unwrap_or_default ( ) ;
174176 hashed_storage. extend ( & storage) ;
@@ -183,7 +185,8 @@ impl<N: NodePrimitives> StateProofProvider for MemoryOverlayStateProviderRef<'_,
183185 address : Address ,
184186 slots : & [ B256 ] ,
185187 ) -> ProviderResult < AccountProof > {
186- input. prepend_self ( self . trie_input ( ) . clone ( ) ) ;
188+ let MemoryOverlayTrieState { nodes, state } = self . trie_state ( ) . clone ( ) ;
189+ input. prepend_cached ( nodes, state) ;
187190 self . historical . proof ( input, address, slots)
188191 }
189192
@@ -192,12 +195,14 @@ impl<N: NodePrimitives> StateProofProvider for MemoryOverlayStateProviderRef<'_,
192195 mut input : TrieInput ,
193196 targets : MultiProofTargets ,
194197 ) -> ProviderResult < MultiProof > {
195- input. prepend_self ( self . trie_input ( ) . clone ( ) ) ;
198+ let MemoryOverlayTrieState { nodes, state } = self . trie_state ( ) . clone ( ) ;
199+ input. prepend_cached ( nodes, state) ;
196200 self . historical . multiproof ( input, targets)
197201 }
198202
199203 fn witness ( & self , mut input : TrieInput , target : HashedPostState ) -> ProviderResult < Vec < Bytes > > {
200- input. prepend_self ( self . trie_input ( ) . clone ( ) ) ;
204+ let MemoryOverlayTrieState { nodes, state } = self . trie_state ( ) . clone ( ) ;
205+ input. prepend_cached ( nodes, state) ;
201206 self . historical . witness ( input, target)
202207 }
203208}
@@ -233,3 +238,12 @@ impl<N: NodePrimitives> StateProvider for MemoryOverlayStateProviderRef<'_, N> {
233238 self . historical . bytecode_by_hash ( code_hash)
234239 }
235240}
241+
242+ /// The collection of data necessary for trie-related operations for [`MemoryOverlayStateProvider`].
243+ #[ derive( Clone , Default , Debug ) ]
244+ pub ( crate ) struct MemoryOverlayTrieState {
245+ /// The collection of aggregated in-memory trie updates.
246+ pub ( crate ) nodes : TrieUpdates ,
247+ /// The collection of hashed state from in-memory blocks.
248+ pub ( crate ) state : HashedPostState ,
249+ }
0 commit comments