@@ -304,8 +304,7 @@ impl Client {
304
304
// Enact Verified Block
305
305
let parent = chain_has_parent. unwrap ( ) ;
306
306
let last_hashes = self . build_last_hashes ( header. parent_hash ( ) . clone ( ) ) ;
307
- let is_canon = header. parent_hash ( ) == & chain. best_block_hash ( ) ;
308
- let db = if is_canon { self . state_db . lock ( ) . boxed_clone_canon ( ) } else { self . state_db . lock ( ) . boxed_clone ( ) } ;
307
+ let db = self . state_db . lock ( ) . boxed_clone_canon ( & header. parent_hash ( ) ) ;
309
308
310
309
let enact_result = enact_verified ( block, engine, self . tracedb . read ( ) . tracing_enabled ( ) , db, & parent, last_hashes, self . factories . clone ( ) ) ;
311
310
if let Err ( e) = enact_result {
@@ -459,6 +458,8 @@ impl Client {
459
458
enacted : route. enacted . clone ( ) ,
460
459
retracted : route. retracted . len ( )
461
460
} ) ;
461
+ let is_canon = route. enacted . last ( ) . map_or ( false , |h| h == hash) ;
462
+ state. sync_cache ( & route. enacted , & route. retracted , is_canon) ;
462
463
// Final commit to the DB
463
464
self . db . read ( ) . write_buffered ( batch) ;
464
465
chain. commit ( ) ;
@@ -533,9 +534,11 @@ impl Client {
533
534
534
535
/// Get a copy of the best block's state.
535
536
pub fn state ( & self ) -> State {
537
+ let header = self . best_block_header ( ) ;
538
+ let header = HeaderView :: new ( & header) ;
536
539
State :: from_existing (
537
- self . state_db . lock ( ) . boxed_clone ( ) ,
538
- HeaderView :: new ( & self . best_block_header ( ) ) . state_root ( ) ,
540
+ self . state_db . lock ( ) . boxed_clone_canon ( & header . hash ( ) ) ,
541
+ header . state_root ( ) ,
539
542
self . engine . account_start_nonce ( ) ,
540
543
self . factories . clone ( ) )
541
544
. expect ( "State root of best block header always valid." )
@@ -1128,6 +1131,7 @@ impl MiningBlockChainClient for Client {
1128
1131
let block_data = block. rlp_bytes ( ) ;
1129
1132
let route = self . commit_block ( block, & h, & block_data) ;
1130
1133
trace ! ( target: "client" , "Imported sealed block #{} ({})" , number, h) ;
1134
+ self . state_db . lock ( ) . sync_cache ( & route. enacted , & route. retracted , false ) ;
1131
1135
1132
1136
let ( enacted, retracted) = self . calculate_enacted_retracted ( & [ route] ) ;
1133
1137
self . miner . chain_new_blocks ( self , & [ h. clone ( ) ] , & [ ] , & enacted, & retracted) ;
0 commit comments