@@ -14,6 +14,7 @@ import (
14
14
"github.com/NethermindEth/juno/db"
15
15
"github.com/NethermindEth/juno/encoder"
16
16
"github.com/NethermindEth/juno/utils"
17
+ "github.com/ethereum/go-ethereum/common"
17
18
)
18
19
19
20
//go:generate mockgen -destination=../mocks/mock_blockchain.go -package=mocks github.com/NethermindEth/juno/blockchain Reader
@@ -34,6 +35,7 @@ type Reader interface {
34
35
Receipt (hash * felt.Felt ) (receipt * core.TransactionReceipt , blockHash * felt.Felt , blockNumber uint64 , err error )
35
36
StateUpdateByNumber (number uint64 ) (update * core.StateUpdate , err error )
36
37
StateUpdateByHash (hash * felt.Felt ) (update * core.StateUpdate , err error )
38
+ L1HandlerTxnHash (msgHash * common.Hash ) (l1HandlerTxnHash * felt.Felt , err error )
37
39
38
40
HeadState () (core.StateReader , StateCloser , error )
39
41
StateAtBlockHash (blockHash * felt.Felt ) (core.StateReader , StateCloser , error )
@@ -115,12 +117,12 @@ func (b *Blockchain) Height() (uint64, error) {
115
117
var height uint64
116
118
return height , b .database .View (func (txn db.Transaction ) error {
117
119
var err error
118
- height , err = chainHeight (txn )
120
+ height , err = ChainHeight (txn )
119
121
return err
120
122
})
121
123
}
122
124
123
- func chainHeight (txn db.Transaction ) (uint64 , error ) {
125
+ func ChainHeight (txn db.Transaction ) (uint64 , error ) {
124
126
var height uint64
125
127
return height , txn .Get (db .ChainHeight .Key (), func (val []byte ) error {
126
128
height = binary .BigEndian .Uint64 (val )
@@ -150,15 +152,15 @@ func (b *Blockchain) HeadsHeader() (*core.Header, error) {
150
152
}
151
153
152
154
func head (txn db.Transaction ) (* core.Block , error ) {
153
- height , err := chainHeight (txn )
155
+ height , err := ChainHeight (txn )
154
156
if err != nil {
155
157
return nil , err
156
158
}
157
159
return BlockByNumber (txn , height )
158
160
}
159
161
160
162
func headsHeader (txn db.Transaction ) (* core.Header , error ) {
161
- height , err := chainHeight (txn )
163
+ height , err := ChainHeight (txn )
162
164
if err != nil {
163
165
return nil , err
164
166
}
@@ -226,6 +228,16 @@ func (b *Blockchain) StateUpdateByHash(hash *felt.Felt) (*core.StateUpdate, erro
226
228
})
227
229
}
228
230
231
+ func (b * Blockchain ) L1HandlerTxnHash (msgHash * common.Hash ) (* felt.Felt , error ) {
232
+ b .listener .OnRead ("L1HandlerTxnHash" )
233
+ var l1HandlerTxnHash * felt.Felt
234
+ return l1HandlerTxnHash , b .database .View (func (txn db.Transaction ) error {
235
+ var err error
236
+ l1HandlerTxnHash , err = l1HandlerTxnHashByMsgHash (txn , msgHash )
237
+ return err
238
+ })
239
+ }
240
+
229
241
// TransactionByBlockNumberAndIndex gets the transaction for a given block number and index.
230
242
func (b * Blockchain ) TransactionByBlockNumberAndIndex (blockNumber , index uint64 ) (core.Transaction , error ) {
231
243
b .listener .OnRead ("TransactionByBlockNumberAndIndex" )
@@ -363,6 +375,10 @@ func (b *Blockchain) Store(block *core.Block, blockCommitments *core.BlockCommit
363
375
return err
364
376
}
365
377
378
+ if err := StoreL1HandlerMsgHashes (txn , block .Transactions ); err != nil {
379
+ return err
380
+ }
381
+
366
382
if err := b .storeEmptyPending (txn , block .Header ); err != nil {
367
383
return err
368
384
}
@@ -497,7 +513,7 @@ func BlockByNumber(txn db.Transaction, number uint64) (*core.Block, error) {
497
513
498
514
block := new (core.Block )
499
515
block .Header = header
500
- block .Transactions , err = transactionsByBlockNumber (txn , number )
516
+ block .Transactions , err = TransactionsByBlockNumber (txn , number )
501
517
if err != nil {
502
518
return nil , err
503
519
}
@@ -509,7 +525,7 @@ func BlockByNumber(txn db.Transaction, number uint64) (*core.Block, error) {
509
525
return block , nil
510
526
}
511
527
512
- func transactionsByBlockNumber (txn db.Transaction , number uint64 ) ([]core.Transaction , error ) {
528
+ func TransactionsByBlockNumber (txn db.Transaction , number uint64 ) ([]core.Transaction , error ) {
513
529
iterator , err := txn .NewIterator ()
514
530
if err != nil {
515
531
return nil , err
@@ -589,6 +605,18 @@ func blockByHash(txn db.Transaction, hash *felt.Felt) (*core.Block, error) {
589
605
})
590
606
}
591
607
608
+ func StoreL1HandlerMsgHashes (dbTxn db.Transaction , blockTxns []core.Transaction ) error {
609
+ for _ , txn := range blockTxns {
610
+ if l1Handler , ok := (txn ).(* core.L1HandlerTransaction ); ok {
611
+ err := dbTxn .Set (db .L1HandlerTxnHashByMsgHash .Key (l1Handler .MessageHash ()), txn .Hash ().Marshal ())
612
+ if err != nil {
613
+ return err
614
+ }
615
+ }
616
+ }
617
+ return nil
618
+ }
619
+
592
620
func storeStateUpdate (txn db.Transaction , blockNumber uint64 , update * core.StateUpdate ) error {
593
621
numBytes := core .MarshalBlockNumber (blockNumber )
594
622
@@ -622,6 +650,14 @@ func stateUpdateByHash(txn db.Transaction, hash *felt.Felt) (*core.StateUpdate,
622
650
})
623
651
}
624
652
653
+ func l1HandlerTxnHashByMsgHash (txn db.Transaction , l1HandlerMsgHash * common.Hash ) (* felt.Felt , error ) {
654
+ l1HandlerTxnHash := new (felt.Felt )
655
+ return l1HandlerTxnHash , txn .Get (db .L1HandlerTxnHashByMsgHash .Key (l1HandlerMsgHash .Bytes ()), func (val []byte ) error {
656
+ l1HandlerTxnHash .Unmarshal (val )
657
+ return nil
658
+ })
659
+ }
660
+
625
661
// SanityCheckNewHeight checks integrity of a block and resulting state update
626
662
func (b * Blockchain ) SanityCheckNewHeight (block * core.Block , stateUpdate * core.StateUpdate ,
627
663
newClasses map [felt.Felt ]core.Class ,
@@ -761,7 +797,7 @@ func (b *Blockchain) HeadState() (core.StateReader, StateCloser, error) {
761
797
return nil , nil , err
762
798
}
763
799
764
- _ , err = chainHeight (txn )
800
+ _ , err = ChainHeight (txn )
765
801
if err != nil {
766
802
return nil , nil , utils .RunAndWrapOnError (txn .Discard , err )
767
803
}
@@ -815,7 +851,7 @@ func (b *Blockchain) EventFilter(from *felt.Felt, keys [][]felt.Felt) (*EventFil
815
851
return nil , err
816
852
}
817
853
818
- latest , err := chainHeight (txn )
854
+ latest , err := ChainHeight (txn )
819
855
if err != nil {
820
856
return nil , err
821
857
}
@@ -831,7 +867,7 @@ func (b *Blockchain) RevertHead() error {
831
867
func (b * Blockchain ) GetReverseStateDiff () (* core.StateDiff , error ) {
832
868
var reverseStateDiff * core.StateDiff
833
869
return reverseStateDiff , b .database .View (func (txn db.Transaction ) error {
834
- blockNumber , err := chainHeight (txn )
870
+ blockNumber , err := ChainHeight (txn )
835
871
if err != nil {
836
872
return err
837
873
}
@@ -846,7 +882,7 @@ func (b *Blockchain) GetReverseStateDiff() (*core.StateDiff, error) {
846
882
}
847
883
848
884
func (b * Blockchain ) revertHead (txn db.Transaction ) error {
849
- blockNumber , err := chainHeight (txn )
885
+ blockNumber , err := ChainHeight (txn )
850
886
if err != nil {
851
887
return err
852
888
}
@@ -933,6 +969,11 @@ func removeTxsAndReceipts(txn db.Transaction, blockNumber, numTxs uint64) error
933
969
if err = txn .Delete (db .TransactionBlockNumbersAndIndicesByHash .Key (reorgedTxn .Hash ().Marshal ())); err != nil {
934
970
return err
935
971
}
972
+ if l1handler , ok := reorgedTxn .(* core.L1HandlerTransaction ); ok {
973
+ if err = txn .Delete (db .L1HandlerTxnHashByMsgHash .Key (l1handler .MessageHash ())); err != nil {
974
+ return err
975
+ }
976
+ }
936
977
}
937
978
938
979
return nil
0 commit comments