@@ -76,7 +76,6 @@ var _ Reader = (*Blockchain)(nil)
7676type Blockchain struct {
7777 network * utils.Network
7878 database db.KeyValueStore
79- trieDB * triedb.Database
8079 stateDB * state.StateDB
8180 listener EventListener
8281 l1HeadFeed * feed.Feed [* core.L1Head ]
@@ -87,7 +86,7 @@ type Blockchain struct {
8786}
8887
8988func New (database db.KeyValueStore , network * utils.Network , stateVersion bool ) * Blockchain {
90- trieDB , err := triedb .New (database , nil ) // TODO: handle hashdb
89+ trieDB , err := triedb .New (database , nil ) // TODO: handle hashdb and pathdb
9190 if err != nil {
9291 panic (err )
9392 }
@@ -108,7 +107,6 @@ func New(database db.KeyValueStore, network *utils.Network, stateVersion bool) *
108107
109108 return & Blockchain {
110109 database : database ,
111- trieDB : trieDB ,
112110 stateDB : stateDB ,
113111 network : network ,
114112 listener : & SelectiveListener {},
@@ -374,6 +372,7 @@ func (b *Blockchain) deprecatedStore(
374372 }
375373
376374 err = storeCasmHashMetadata (
375+ txn ,
377376 txn ,
378377 block .Number ,
379378 block .ProtocolVersion ,
@@ -406,22 +405,27 @@ func (b *Blockchain) store(
406405 if err := verifyBlock (b .database , block ); err != nil {
407406 return err
408407 }
408+
409409 state , err := b .StateFactory .NewState (stateUpdate .OldRoot , nil )
410410 if err != nil {
411411 return err
412412 }
413413 if err := state .Update (block .Number , stateUpdate , newClasses , false , true ); err != nil {
414414 return err
415415 }
416+
416417 batch := b .database .NewBatch ()
417418 if err := core .WriteBlockHeader (batch , block .Header ); err != nil {
418419 return err
419420 }
420- for i , tx := range block .Transactions {
421- if err := core .WriteTxAndReceipt (batch , block .Number , uint64 (i ), tx ,
422- block .Receipts [i ]); err != nil {
423- return err
424- }
421+ err = b .transactionLayout .WriteTransactionsAndReceipts (
422+ batch ,
423+ block .Number ,
424+ block .Transactions ,
425+ block .Receipts ,
426+ )
427+ if err != nil {
428+ return err
425429 }
426430 if err := core .WriteStateUpdateByBlockNum (batch , block .Number , stateUpdate ); err != nil {
427431 return err
@@ -435,6 +439,18 @@ func (b *Blockchain) store(
435439 return err
436440 }
437441
442+ err = storeCasmHashMetadata (
443+ b .database ,
444+ batch ,
445+ block .Number ,
446+ block .ProtocolVersion ,
447+ stateUpdate ,
448+ newClasses ,
449+ )
450+ if err != nil {
451+ return err
452+ }
453+
438454 if err := core .WriteChainHeight (batch , block .Number ); err != nil {
439455 return err
440456 }
@@ -449,7 +465,8 @@ func (b *Blockchain) store(
449465// storeCasmHashMetadata stores CASM hash metadata for declared and migrated classes.
450466// See [core.ClassCasmHashMetadata]
451467func storeCasmHashMetadata (
452- txn db.IndexedBatch ,
468+ reader db.KeyValueReader ,
469+ writer db.KeyValueWriter ,
453470 blockNumber uint64 ,
454471 protocolVersion string ,
455472 stateUpdate * core.StateUpdate ,
@@ -463,16 +480,17 @@ func storeCasmHashMetadata(
463480 isV2Protocol := ver .GreaterThanEqual (core .Ver0_14_1 )
464481
465482 if isV2Protocol {
466- return storeCasmHashMetadataV2 (txn , blockNumber , stateUpdate )
483+ return storeCasmHashMetadataV2 (reader , writer , blockNumber , stateUpdate )
467484 }
468485
469- return storeCasmHashMetadataV1 (txn , blockNumber , stateUpdate , newClasses )
486+ return storeCasmHashMetadataV1 (reader , writer , blockNumber , stateUpdate , newClasses )
470487}
471488
472489// storeCasmHashMetadataV2 stores metadata for classes declared with casm hash v2 or
473490// migrated from v1. casm hash v2 is after protocol version >= 0.14.1.
474491func storeCasmHashMetadataV2 (
475- txn db.IndexedBatch ,
492+ reader db.KeyValueReader ,
493+ writer db.KeyValueWriter ,
476494 blockNumber uint64 ,
477495 stateUpdate * core.StateUpdate ,
478496) error {
@@ -482,7 +500,7 @@ func storeCasmHashMetadataV2(
482500 (* felt .CasmClassHash )(casmHash ),
483501 )
484502 err := core .WriteClassCasmHashMetadata (
485- txn ,
503+ writer ,
486504 (* felt .SierraClassHash )(& sierraClassHash ),
487505 & metadata ,
488506 )
@@ -492,7 +510,7 @@ func storeCasmHashMetadataV2(
492510 }
493511
494512 for sierraClassHash := range stateUpdate .StateDiff .MigratedClasses {
495- metadata , err := core .GetClassCasmHashMetadata (txn , & sierraClassHash )
513+ metadata , err := core .GetClassCasmHashMetadata (reader , & sierraClassHash )
496514 if err != nil {
497515 return fmt .Errorf ("cannot migrate class %s: metadata not found" ,
498516 sierraClassHash .String (),
@@ -507,7 +525,7 @@ func storeCasmHashMetadataV2(
507525 )
508526 }
509527
510- err = core .WriteClassCasmHashMetadata (txn , & sierraClassHash , & metadata )
528+ err = core .WriteClassCasmHashMetadata (writer , & sierraClassHash , & metadata )
511529 if err != nil {
512530 return err
513531 }
@@ -518,7 +536,8 @@ func storeCasmHashMetadataV2(
518536// storeDeclaredV1Classes stores metadata for classes declared with V1 hash (protocol < 0.14.1).
519537// It computes the V2 hash from the class definition.
520538func storeCasmHashMetadataV1 (
521- txn db.IndexedBatch ,
539+ reader db.KeyValueReader ,
540+ writer db.KeyValueWriter ,
522541 blockNumber uint64 ,
523542 stateUpdate * core.StateUpdate ,
524543 newClasses map [felt.Felt ]core.ClassDefinition ,
@@ -547,7 +566,7 @@ func storeCasmHashMetadataV1(
547566
548567 metadata := core .NewCasmHashMetadataDeclaredV1 (blockNumber , casmHashV1 , & casmHashV2 )
549568 err := core .WriteClassCasmHashMetadata (
550- txn ,
569+ writer ,
551570 (* felt .SierraClassHash )(& sierraClassHash ),
552571 & metadata ,
553572 )
@@ -754,8 +773,6 @@ func (b *Blockchain) GetReverseStateDiff() (core.StateDiff, error) {
754773
755774// TODO(maksymmalick): remove this once we have a new state integrated
756775func (b * Blockchain ) deprecatedGetReverseStateDiff () (core.StateDiff , error ) {
757- var reverseStateDiff * core.StateDiff
758-
759776 txn := b .database .NewIndexedBatch ()
760777 blockNum , err := core .GetChainHeight (txn )
761778 if err != nil {
@@ -835,7 +852,7 @@ func (b *Blockchain) deprecatedRevertHead(txn db.IndexedBatch) error {
835852 }
836853 }
837854
838- if err := b .transactionLayout .DeleteTxsAndReceipts (txn , blockNumber ); err != nil {
855+ if err := b .transactionLayout .DeleteTxsAndReceipts (b . database , txn , blockNumber ); err != nil {
839856 return err
840857 }
841858
@@ -863,24 +880,30 @@ func (b *Blockchain) revertHead() error {
863880 if err != nil {
864881 return err
865882 }
883+
866884 stateUpdate , err := core .GetStateUpdateByBlockNum (b .database , blockNumber )
867885 if err != nil {
868886 return err
869887 }
888+
870889 state , err := state .New (stateUpdate .NewRoot , b .stateDB )
871890 if err != nil {
872891 return err
873892 }
893+
874894 // revert state
875895 if err = state .Revert (blockNumber , stateUpdate ); err != nil {
876896 return err
877897 }
898+
878899 header , err := core .GetBlockHeaderByNumber (b .database , blockNumber )
879900 if err != nil {
880901 return err
881902 }
903+
882904 genesisBlock := blockNumber == 0
883905
906+ // remove block header
884907 batch := b .database .NewBatch ()
885908 for _ , key := range [][]byte {
886909 db .BlockHeaderByNumberKey (header .Number ),
@@ -891,26 +914,30 @@ func (b *Blockchain) revertHead() error {
891914 return err
892915 }
893916 }
894- if err = core .DeleteTxsAndReceipts (
895- b .database ,
896- batch ,
897- blockNumber ,
898- header .TransactionCount ,
899- ); err != nil {
917+
918+ if err := b .transactionLayout .DeleteTxsAndReceipts (b .database , batch , blockNumber ); err != nil {
900919 return err
901920 }
902- if err = core .DeleteStateUpdateByBlockNum (batch , blockNumber ); err != nil {
921+
922+ // remove state update
923+ if err := core .DeleteStateUpdateByBlockNum (batch , blockNumber ); err != nil {
903924 return err
904925 }
926+
927+ // Revert chain height.
905928 if genesisBlock {
906- if err := core .DeleteChainHeight (batch ); err != nil {
907- return err
908- }
909- } else {
910- if err := core .WriteChainHeight (batch , blockNumber - 1 ); err != nil {
911- return err
912- }
929+ return core .DeleteChainHeight (batch )
930+ }
931+
932+ if err = core .WriteChainHeight (batch , blockNumber - 1 ); err != nil {
933+ return err
934+ }
935+
936+ // Remove the block events bloom from the cache
937+ if err := b .runningFilter .OnReorg (); err != nil {
938+ return err
913939 }
940+
914941 return batch .Write ()
915942}
916943
@@ -979,10 +1006,19 @@ func (b *Blockchain) Finalise(
9791006 if err := b .storeBlockData (txn , block , stateUpdate , commitments ); err != nil {
9801007 return err
9811008 }
982- err = storeCasmClassHashesV2ForBlock (txn , block .ProtocolVersion , newClasses , stateUpdate )
1009+
1010+ err = storeCasmHashMetadata (
1011+ txn ,
1012+ txn ,
1013+ block .Number ,
1014+ block .ProtocolVersion ,
1015+ stateUpdate ,
1016+ newClasses ,
1017+ )
9831018 if err != nil {
9841019 return err
9851020 }
1021+
9861022 return core .WriteChainHeight (txn , block .Number )
9871023 })
9881024 if err != nil {
@@ -1007,7 +1043,8 @@ func (b *Blockchain) Finalise(
10071043 }
10081044
10091045 err = storeCasmHashMetadata (
1010- txn ,
1046+ b .database ,
1047+ batch ,
10111048 block .Number ,
10121049 block .ProtocolVersion ,
10131050 stateUpdate ,
@@ -1115,13 +1152,13 @@ func (b *Blockchain) signBlock(
11151152
11161153// storeBlockData persists all block-related data to the database
11171154func (b * Blockchain ) storeBlockData (
1118- w db.KeyValueWriter ,
1155+ txn db.KeyValueWriter ,
11191156 block * core.Block ,
11201157 stateUpdate * core.StateUpdate ,
11211158 commitments * core.BlockCommitments ,
11221159) error {
11231160 // Store block header
1124- if err := core .WriteBlockHeader (w , block .Header ); err != nil {
1161+ if err := core .WriteBlockHeader (txn , block .Header ); err != nil {
11251162 return err
11261163 }
11271164
@@ -1136,17 +1173,17 @@ func (b *Blockchain) storeBlockData(
11361173 }
11371174
11381175 // Store state update
1139- if err := core .WriteStateUpdateByBlockNum (w , block .Number , stateUpdate ); err != nil {
1176+ if err := core .WriteStateUpdateByBlockNum (txn , block .Number , stateUpdate ); err != nil {
11401177 return err
11411178 }
11421179
11431180 // Store block commitments
1144- if err := core .WriteBlockCommitment (w , block .Number , commitments ); err != nil {
1181+ if err := core .WriteBlockCommitment (txn , block .Number , commitments ); err != nil {
11451182 return err
11461183 }
11471184
11481185 // Store L1 handler message hashes
1149- if err := core .WriteL1HandlerMsgHashes (w , block .Transactions ); err != nil {
1186+ if err := core .WriteL1HandlerMsgHashes (txn , block .Transactions ); err != nil {
11501187 return err
11511188 }
11521189
@@ -1188,20 +1225,3 @@ func (b *Blockchain) StoreGenesis(
11881225func (b * Blockchain ) WriteRunningEventFilter () error {
11891226 return b .runningFilter .Write ()
11901227}
1191-
1192- func (b * Blockchain ) Stop () error {
1193- if b .trieDB .Scheme () == triedb .PathScheme && b .StateFactory .UseNewState {
1194- head , err := b .HeadsHeader ()
1195- if err != nil {
1196- return err
1197- }
1198-
1199- stateUpdate , err := b .StateUpdateByNumber (head .Number )
1200- if err != nil {
1201- return err
1202- }
1203-
1204- return b .trieDB .Journal (stateUpdate .NewRoot )
1205- }
1206- return nil
1207- }
0 commit comments