@@ -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