Skip to content

Commit 7286fe7

Browse files
rianhughesIronGauntletskirugan
authored
Implement starknet_getMessageStatus (#2184)
Signed-off-by: Rian Hughes <[email protected]> Signed-off-by: Kirill <[email protected]> Co-authored-by: Aneeque <[email protected]> Co-authored-by: Kirill <[email protected]>
1 parent 226c571 commit 7286fe7

25 files changed

+10502
-51
lines changed

blockchain/blockchain.go

+51-10
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/NethermindEth/juno/db"
1515
"github.com/NethermindEth/juno/encoder"
1616
"github.com/NethermindEth/juno/utils"
17+
"github.com/ethereum/go-ethereum/common"
1718
)
1819

1920
//go:generate mockgen -destination=../mocks/mock_blockchain.go -package=mocks github.com/NethermindEth/juno/blockchain Reader
@@ -34,6 +35,7 @@ type Reader interface {
3435
Receipt(hash *felt.Felt) (receipt *core.TransactionReceipt, blockHash *felt.Felt, blockNumber uint64, err error)
3536
StateUpdateByNumber(number uint64) (update *core.StateUpdate, err error)
3637
StateUpdateByHash(hash *felt.Felt) (update *core.StateUpdate, err error)
38+
L1HandlerTxnHash(msgHash *common.Hash) (l1HandlerTxnHash *felt.Felt, err error)
3739

3840
HeadState() (core.StateReader, StateCloser, error)
3941
StateAtBlockHash(blockHash *felt.Felt) (core.StateReader, StateCloser, error)
@@ -115,12 +117,12 @@ func (b *Blockchain) Height() (uint64, error) {
115117
var height uint64
116118
return height, b.database.View(func(txn db.Transaction) error {
117119
var err error
118-
height, err = chainHeight(txn)
120+
height, err = ChainHeight(txn)
119121
return err
120122
})
121123
}
122124

123-
func chainHeight(txn db.Transaction) (uint64, error) {
125+
func ChainHeight(txn db.Transaction) (uint64, error) {
124126
var height uint64
125127
return height, txn.Get(db.ChainHeight.Key(), func(val []byte) error {
126128
height = binary.BigEndian.Uint64(val)
@@ -150,15 +152,15 @@ func (b *Blockchain) HeadsHeader() (*core.Header, error) {
150152
}
151153

152154
func head(txn db.Transaction) (*core.Block, error) {
153-
height, err := chainHeight(txn)
155+
height, err := ChainHeight(txn)
154156
if err != nil {
155157
return nil, err
156158
}
157159
return BlockByNumber(txn, height)
158160
}
159161

160162
func headsHeader(txn db.Transaction) (*core.Header, error) {
161-
height, err := chainHeight(txn)
163+
height, err := ChainHeight(txn)
162164
if err != nil {
163165
return nil, err
164166
}
@@ -226,6 +228,16 @@ func (b *Blockchain) StateUpdateByHash(hash *felt.Felt) (*core.StateUpdate, erro
226228
})
227229
}
228230

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+
229241
// TransactionByBlockNumberAndIndex gets the transaction for a given block number and index.
230242
func (b *Blockchain) TransactionByBlockNumberAndIndex(blockNumber, index uint64) (core.Transaction, error) {
231243
b.listener.OnRead("TransactionByBlockNumberAndIndex")
@@ -363,6 +375,10 @@ func (b *Blockchain) Store(block *core.Block, blockCommitments *core.BlockCommit
363375
return err
364376
}
365377

378+
if err := StoreL1HandlerMsgHashes(txn, block.Transactions); err != nil {
379+
return err
380+
}
381+
366382
if err := b.storeEmptyPending(txn, block.Header); err != nil {
367383
return err
368384
}
@@ -497,7 +513,7 @@ func BlockByNumber(txn db.Transaction, number uint64) (*core.Block, error) {
497513

498514
block := new(core.Block)
499515
block.Header = header
500-
block.Transactions, err = transactionsByBlockNumber(txn, number)
516+
block.Transactions, err = TransactionsByBlockNumber(txn, number)
501517
if err != nil {
502518
return nil, err
503519
}
@@ -509,7 +525,7 @@ func BlockByNumber(txn db.Transaction, number uint64) (*core.Block, error) {
509525
return block, nil
510526
}
511527

512-
func transactionsByBlockNumber(txn db.Transaction, number uint64) ([]core.Transaction, error) {
528+
func TransactionsByBlockNumber(txn db.Transaction, number uint64) ([]core.Transaction, error) {
513529
iterator, err := txn.NewIterator()
514530
if err != nil {
515531
return nil, err
@@ -589,6 +605,18 @@ func blockByHash(txn db.Transaction, hash *felt.Felt) (*core.Block, error) {
589605
})
590606
}
591607

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+
592620
func storeStateUpdate(txn db.Transaction, blockNumber uint64, update *core.StateUpdate) error {
593621
numBytes := core.MarshalBlockNumber(blockNumber)
594622

@@ -622,6 +650,14 @@ func stateUpdateByHash(txn db.Transaction, hash *felt.Felt) (*core.StateUpdate,
622650
})
623651
}
624652

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+
625661
// SanityCheckNewHeight checks integrity of a block and resulting state update
626662
func (b *Blockchain) SanityCheckNewHeight(block *core.Block, stateUpdate *core.StateUpdate,
627663
newClasses map[felt.Felt]core.Class,
@@ -761,7 +797,7 @@ func (b *Blockchain) HeadState() (core.StateReader, StateCloser, error) {
761797
return nil, nil, err
762798
}
763799

764-
_, err = chainHeight(txn)
800+
_, err = ChainHeight(txn)
765801
if err != nil {
766802
return nil, nil, utils.RunAndWrapOnError(txn.Discard, err)
767803
}
@@ -815,7 +851,7 @@ func (b *Blockchain) EventFilter(from *felt.Felt, keys [][]felt.Felt) (*EventFil
815851
return nil, err
816852
}
817853

818-
latest, err := chainHeight(txn)
854+
latest, err := ChainHeight(txn)
819855
if err != nil {
820856
return nil, err
821857
}
@@ -831,7 +867,7 @@ func (b *Blockchain) RevertHead() error {
831867
func (b *Blockchain) GetReverseStateDiff() (*core.StateDiff, error) {
832868
var reverseStateDiff *core.StateDiff
833869
return reverseStateDiff, b.database.View(func(txn db.Transaction) error {
834-
blockNumber, err := chainHeight(txn)
870+
blockNumber, err := ChainHeight(txn)
835871
if err != nil {
836872
return err
837873
}
@@ -846,7 +882,7 @@ func (b *Blockchain) GetReverseStateDiff() (*core.StateDiff, error) {
846882
}
847883

848884
func (b *Blockchain) revertHead(txn db.Transaction) error {
849-
blockNumber, err := chainHeight(txn)
885+
blockNumber, err := ChainHeight(txn)
850886
if err != nil {
851887
return err
852888
}
@@ -933,6 +969,11 @@ func removeTxsAndReceipts(txn db.Transaction, blockNumber, numTxs uint64) error
933969
if err = txn.Delete(db.TransactionBlockNumbersAndIndicesByHash.Key(reorgedTxn.Hash().Marshal())); err != nil {
934970
return err
935971
}
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+
}
936977
}
937978

938979
return nil

blockchain/blockchain_test.go

+20
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/NethermindEth/juno/mocks"
1616
adaptfeeder "github.com/NethermindEth/juno/starknetdata/feeder"
1717
"github.com/NethermindEth/juno/utils"
18+
"github.com/ethereum/go-ethereum/common"
1819
"github.com/stretchr/testify/assert"
1920
"github.com/stretchr/testify/require"
2021
"go.uber.org/mock/gomock"
@@ -239,6 +240,7 @@ func TestStore(t *testing.T) {
239240
require.NoError(t, err)
240241
assert.Equal(t, stateUpdate0, got0Update)
241242
})
243+
242244
t.Run("add block to non-empty blockchain", func(t *testing.T) {
243245
block1, err := gw.BlockByNumber(context.Background(), 1)
244246
require.NoError(t, err)
@@ -268,6 +270,24 @@ func TestStore(t *testing.T) {
268270
})
269271
}
270272

273+
func TestStoreL1HandlerTxnHash(t *testing.T) {
274+
client := feeder.NewTestClient(t, &utils.Sepolia)
275+
gw := adaptfeeder.New(client)
276+
chain := blockchain.New(pebble.NewMemTest(t), &utils.Sepolia)
277+
var stateUpdate *core.StateUpdate
278+
for i := range uint64(7) {
279+
block, err := gw.BlockByNumber(context.Background(), i)
280+
require.NoError(t, err)
281+
stateUpdate, err = gw.StateUpdate(context.Background(), i)
282+
require.NoError(t, err)
283+
require.NoError(t, chain.Store(block, &emptyCommitments, stateUpdate, nil))
284+
}
285+
l1HandlerMsgHash := common.HexToHash("0x42e76df4e3d5255262929c27132bd0d295a8d3db2cfe63d2fcd061c7a7a7ab34")
286+
l1HandlerTxnHash, err := chain.L1HandlerTxnHash(&l1HandlerMsgHash)
287+
require.NoError(t, err)
288+
require.Equal(t, utils.HexToFelt(t, "0x785c2ada3f53fbc66078d47715c27718f92e6e48b96372b36e5197de69b82b5"), l1HandlerTxnHash)
289+
}
290+
271291
func TestBlockCommitments(t *testing.T) {
272292
chain := blockchain.New(pebble.NewMemTest(t), &utils.Mainnet)
273293
client := feeder.NewTestClient(t, &utils.Mainnet)

blockchain/event_filter.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ type FilteredEvent struct {
9797
//nolint:gocyclo
9898
func (e *EventFilter) Events(cToken *ContinuationToken, chunkSize uint64) ([]*FilteredEvent, *ContinuationToken, error) {
9999
var matchedEvents []*FilteredEvent
100-
latest, err := chainHeight(e.txn)
100+
latest, err := ChainHeight(e.txn)
101101
if err != nil {
102102
return nil, nil, err
103103
}

0 commit comments

Comments
 (0)