@@ -577,6 +577,13 @@ func (s *StateDB) updateStateObject(obj *stateObject) {
577577	}
578578}
579579
580+ // updateStateObject writes the given object to the trie. 
581+ func  (s  * StateDB ) updateStateObjectAsync (addr  common.Address , resolver  func () * types.StateAccount ) {
582+ 	if  err  :=  s .trie .UpdateAccountAsync (addr , resolver ); err  !=  nil  {
583+ 		s .setError (fmt .Errorf ("updateStateObject (%x) error: %v" , addr , err ))
584+ 	}
585+ }
586+ 
580587// deleteStateObject removes the given object from the state trie. 
581588func  (s  * StateDB ) deleteStateObject (addr  common.Address ) {
582589	if  err  :=  s .trie .DeleteAccount (addr ); err  !=  nil  {
@@ -829,11 +836,14 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
829836		// later time. 
830837		workers .SetLimit (1 )
831838	}
839+ 
840+ 	stateObjectsResolve  :=  make (map [common.Address ]func () * types.StateAccount )
832841	for  addr , op  :=  range  s .mutations  {
833842		if  op .applied  ||  op .isDelete () {
834843			continue 
835844		}
836845		obj  :=  s .stateObjects [addr ] // closure for the task runner below 
846+ 		complete  :=  make (chan  * types.StateAccount )
837847		workers .Go (func () error  {
838848			if  s .db .TrieDB ().IsVerkle () {
839849				obj .updateTrie ()
@@ -846,8 +856,13 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
846856					s .witness .AddState (obj .trie .Witness ())
847857				}
848858			}
859+ 			complete  <-  & obj .data 
849860			return  nil 
850861		})
862+ 
863+ 		stateObjectsResolve [addr ] =  func () * types.StateAccount  {
864+ 			return  <- complete 
865+ 		}
851866	}
852867	// If witness building is enabled, gather all the read-only accesses. 
853868	// Skip witness collection in Verkle mode, they will be gathered 
@@ -898,7 +913,6 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
898913			}
899914		}
900915	}
901- 	workers .Wait ()
902916	s .StorageUpdates  +=  time .Since (start )
903917
904918	// Now we're about to start to write changes to the trie. The trie is so far 
@@ -939,7 +953,11 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
939953		if  op .isDelete () {
940954			deletedAddrs  =  append (deletedAddrs , addr )
941955		} else  {
942- 			s .updateStateObject (s .stateObjects [addr ])
956+ 			if  s .db .TrieDB ().IsVerkle () {
957+ 				s .updateStateObject (s .stateObjects [addr ])
958+ 			} else  {
959+ 				s .updateStateObjectAsync (addr , stateObjectsResolve [addr ])
960+ 			}
943961			s .AccountUpdated  +=  1 
944962		}
945963		usedAddrs  =  append (usedAddrs , addr ) // Copy needed for closure 
@@ -966,6 +984,7 @@ func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
966984			s .witnessStats .Add (witness , common.Hash {})
967985		}
968986	}
987+ 
969988	return  hash 
970989}
971990
0 commit comments