@@ -43,9 +43,11 @@ type State struct {
4343 classTrie * trie2.Trie
4444
4545 stateObjects map [felt.Felt ]* stateObject
46+
47+ batch db.Batch
4648}
4749
48- func New (stateRoot * felt.Felt , db * StateDB ) (* State , error ) {
50+ func New (stateRoot * felt.Felt , db * StateDB , batch db. Batch ) (* State , error ) {
4951 contractTrie , err := db .ContractTrie (stateRoot )
5052 if err != nil {
5153 return nil , err
@@ -62,6 +64,7 @@ func New(stateRoot *felt.Felt, db *StateDB) (*State, error) {
6264 contractTrie : contractTrie ,
6365 classTrie : classTrie ,
6466 stateObjects : make (map [felt.Felt ]* stateObject ),
67+ batch : batch ,
6568 }, nil
6669}
6770
@@ -179,7 +182,6 @@ func (s *State) Update(
179182 update * core.StateUpdate ,
180183 declaredClasses map [felt.Felt ]core.ClassDefinition ,
181184 skipVerifyNewRoot bool ,
182- flushChanges bool ,
183185) error {
184186 if err := s .verifyComm (update .OldRoot ); err != nil {
185187 return err
@@ -248,10 +250,8 @@ func (s *State) Update(
248250 deployedContracts : update .StateDiff .ReplacedClasses ,
249251 })
250252
251- if flushChanges {
252- if err := s .flush (blockNum , & stateUpdate , dirtyClasses , true ); err != nil {
253- return err
254- }
253+ if s .batch != nil {
254+ return s .flush (blockNum , & stateUpdate , dirtyClasses , true )
255255 }
256256
257257 return nil
@@ -318,19 +318,19 @@ func (s *State) Revert(blockNum uint64, update *core.StateUpdate) error {
318318 if ! newComm .Equal (update .OldRoot ) {
319319 return fmt .Errorf ("state commitment mismatch: %v (expected) != %v (actual)" , update .OldRoot , & newComm )
320320 }
321-
322- if err := s .flush (blockNum , & stateUpdate , dirtyClasses , false ); err != nil {
323- return err
321+ if s .batch != nil {
322+ if err := s .flush (blockNum , & stateUpdate , dirtyClasses , false ); err != nil {
323+ return err
324+ }
325+ if err := s .deleteHistory (blockNum , update .StateDiff ); err != nil {
326+ return err
327+ }
324328 }
325329
326330 if err := s .db .stateCache .PopLayer (update .NewRoot , update .OldRoot ); err != nil {
327331 return err
328332 }
329333
330- if err := s .deleteHistory (blockNum , update .StateDiff ); err != nil {
331- return err
332- }
333-
334334 return nil
335335}
336336
@@ -503,74 +503,64 @@ func (s *State) flush(
503503 classes map [felt.Felt ]core.ClassDefinition ,
504504 storeHistory bool ,
505505) error {
506- p := pool .New ().WithMaxGoroutines (runtime .GOMAXPROCS (0 )).WithErrors ()
507-
508- p .Go (func () error {
509- return s .db .triedb .Update (
510- (* felt .StateRootHash )(& update .curComm ),
511- (* felt .StateRootHash )(& update .prevComm ),
512- blockNum ,
513- update .classNodes ,
514- update .contractNodes ,
515- )
516- })
517-
518- batch := s .db .disk .NewBatch ()
519- p .Go (func () error {
520- for addr , obj := range s .stateObjects {
521- if obj == nil { // marked as deleted
522- if err := DeleteContract (batch , & addr ); err != nil {
523- return err
524- }
525-
526- // TODO(weiihann): handle hash-based, and there should be better ways of doing this
527- err := trieutils .DeleteStorageNodesByPath (batch , (* felt .Address )(& addr ))
528- if err != nil {
529- return err
530- }
531- } else { // updated
532- if err := WriteContract (batch , & addr , obj .contract ); err != nil {
533- return err
534- }
506+ if err := s .db .triedb .Update (
507+ (* felt .StateRootHash )(& update .curComm ),
508+ (* felt .StateRootHash )(& update .prevComm ),
509+ blockNum ,
510+ update .classNodes ,
511+ update .contractNodes ,
512+ s .batch ,
513+ ); err != nil {
514+ return err
515+ }
535516
536- if storeHistory {
537- for key , val := range obj .dirtyStorage {
538- if err := WriteStorageHistory (batch , & addr , & key , blockNum , val ); err != nil {
539- return err
540- }
541- }
517+ for addr , obj := range s .stateObjects {
518+ if obj == nil { // marked as deleted
519+ if err := DeleteContract (s .batch , & addr ); err != nil {
520+ return err
521+ }
542522
543- if err := WriteNonceHistory (batch , & addr , blockNum , & obj .contract .Nonce ); err != nil {
544- return err
545- }
523+ // TODO(weiihann): handle hash-based, and there should be better ways of doing this
524+ err := trieutils .DeleteStorageNodesByPath (s .batch , (* felt .Address )(& addr ))
525+ if err != nil {
526+ return err
527+ }
528+ } else { // updated
529+ if err := WriteContract (s .batch , & addr , obj .contract ); err != nil {
530+ return err
531+ }
546532
547- if err := WriteClassHashHistory (batch , & addr , blockNum , & obj .contract .ClassHash ); err != nil {
533+ if storeHistory {
534+ for key , val := range obj .dirtyStorage {
535+ if err := WriteStorageHistory (s .batch , & addr , & key , blockNum , val ); err != nil {
548536 return err
549537 }
550538 }
551- }
552- }
553539
554- for classHash , class := range classes {
555- if class == nil { // mark as deleted
556- if err := DeleteClass (batch , & classHash ); err != nil {
540+ if err := WriteNonceHistory (s .batch , & addr , blockNum , & obj .contract .Nonce ); err != nil {
557541 return err
558542 }
559- } else {
560- if err := WriteClass ( batch , & classHash , class , blockNum ); err != nil {
543+
544+ if err := WriteClassHashHistory ( s . batch , & addr , blockNum , & obj . contract . ClassHash ); err != nil {
561545 return err
562546 }
563547 }
564548 }
549+ }
565550
566- return nil
567- })
568-
569- if err := p .Wait (); err != nil {
570- return err
551+ for classHash , class := range classes {
552+ if class == nil { // mark as deleted
553+ if err := DeleteClass (s .batch , & classHash ); err != nil {
554+ return err
555+ }
556+ } else {
557+ if err := WriteClass (s .batch , & classHash , class , blockNum ); err != nil {
558+ return err
559+ }
560+ }
571561 }
572562
573- return batch . Write ()
563+ return nil
574564}
575565
576566func (s * State ) updateClassTrie (
@@ -772,39 +762,37 @@ func (s *State) valueAt(prefix []byte, blockNum uint64, cb func(val []byte) erro
772762}
773763
774764func (s * State ) deleteHistory (blockNum uint64 , diff * core.StateDiff ) error {
775- batch := s .db .disk .NewBatch ()
776-
777765 for addr , storage := range diff .StorageDiffs {
778766 for key := range storage {
779- if err := DeleteStorageHistory (batch , & addr , & key , blockNum ); err != nil {
767+ if err := DeleteStorageHistory (s . batch , & addr , & key , blockNum ); err != nil {
780768 return err
781769 }
782770 }
783771 }
784772
785773 for addr := range diff .Nonces {
786- if err := DeleteNonceHistory (batch , & addr , blockNum ); err != nil {
774+ if err := DeleteNonceHistory (s . batch , & addr , blockNum ); err != nil {
787775 return err
788776 }
789777 }
790778
791779 for addr := range diff .ReplacedClasses {
792- if err := DeleteClassHashHistory (batch , & addr , blockNum ); err != nil {
780+ if err := DeleteClassHashHistory (s . batch , & addr , blockNum ); err != nil {
793781 return err
794782 }
795783 }
796784
797785 for addr := range diff .DeployedContracts {
798- if err := DeleteNonceHistory (batch , & addr , blockNum ); err != nil {
786+ if err := DeleteNonceHistory (s . batch , & addr , blockNum ); err != nil {
799787 return err
800788 }
801789
802- if err := DeleteClassHashHistory (batch , & addr , blockNum ); err != nil {
790+ if err := DeleteClassHashHistory (s . batch , & addr , blockNum ); err != nil {
803791 return err
804792 }
805793 }
806794
807- return batch . Write ()
795+ return nil
808796}
809797
810798func (s * State ) compareContracts (a , b felt.Felt ) int {
0 commit comments