@@ -8,8 +8,9 @@ use reth_db_api::{
88} ;
99use reth_primitives_traits:: { GotExpected , SealedHeader } ;
1010use reth_provider:: {
11- DBProvider , HeaderProvider , ProviderError , StageCheckpointReader , StageCheckpointWriter ,
12- StatsReader , TrieWriter , TrieWriterV2 , EXECUTION_MERKLE_CHANNEL ,
11+ DBProvider , HeaderProvider , PersistBlockCache , ProviderError , StageCheckpointReader ,
12+ StageCheckpointWriter , StatsReader , TrieWriter , TrieWriterV2 , EXECUTION_MERKLE_CHANNEL ,
13+ PERSIST_BLOCK_CACHE ,
1314} ;
1415use reth_stages_api:: {
1516 BlockErrorKind , BoxedConcurrentProvider , EntitiesCheckpoint , ExecInput , ExecOutput ,
@@ -197,16 +198,21 @@ where
197198 ( target_block_root, input. checkpoint ( ) . entities_stage_checkpoint ( ) . unwrap_or_default ( ) )
198199 } else {
199200 debug ! ( target: "sync::stages::merkle::exec" , current = ?current_block_number, target = ?to_block, "Updating trie in chunks" ) ;
201+ let cache: PersistBlockCache = PERSIST_BLOCK_CACHE . clone ( ) ;
200202 // Use optimized nested hash algorithm for state root calculation
201- let nested_state_root = NestedStateRoot :: new (
202- || provider_ro ( ) . map ( |db| db. into_tx ( ) ) ,
203- None , // No cache for history sync
204- ) ;
203+ let nested_state_root =
204+ NestedStateRoot :: new ( || provider_ro ( ) . map ( |db| db. into_tx ( ) ) , Some ( cache. clone ( ) ) ) ;
205205 // Read the hashed state from database for the specified range
206- let hashed_state = EXECUTION_MERKLE_CHANNEL . consume ( from_block) ;
207- let ( final_root, trie_updates_v2, _compatible_updates) =
208- nested_state_root. calculate ( & hashed_state, false ) ?;
206+ let hashed_state =
207+ if let Some ( hashed_state) = EXECUTION_MERKLE_CHANNEL . consume ( from_block) {
208+ hashed_state
209+ } else {
210+ nested_state_root. read_hashed_state ( Some ( range) ) ?
211+ } ;
212+ let ( final_root, trie_updates_v2) = nested_state_root. calculate ( & hashed_state) ?;
213+ cache. write_trie_updates ( & trie_updates_v2, to_block) ;
209214 provider. write_trie_updatesv2 ( & trie_updates_v2) ?;
215+ cache. persist_tip ( to_block) ;
210216
211217 let total_hashed_entries = ( provider. count_entries :: < tables:: HashedAccounts > ( ) ? +
212218 provider. count_entries :: < tables:: HashedStorages > ( ) ?)
@@ -278,8 +284,7 @@ where
278284 let nested_state_root =
279285 NestedStateRoot :: new ( || provider_ro ( ) . map ( |db| db. into_tx ( ) ) , None ) ;
280286 let hashed_state = nested_state_root. read_hashed_state ( Some ( range) ) ?;
281- let ( block_root, trie_updates_v2, _compatible_updates) =
282- nested_state_root. calculate ( & hashed_state, false ) ?;
287+ let ( block_root, trie_updates_v2) = nested_state_root. calculate ( & hashed_state) ?;
283288
284289 // Validate the calculated state root
285290 let target = provider
0 commit comments