Skip to content

Commit eb67192

Browse files
authored
refactor: Integrate typed buckets for transactions and receipts (#3303)
1 parent c375928 commit eb67192

File tree

8 files changed

+367
-168
lines changed

8 files changed

+367
-168
lines changed

blockchain/blockchain.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,24 +184,32 @@ func (b *Blockchain) L1HandlerTxnHash(msgHash *common.Hash) (felt.Felt, error) {
184184
// TransactionByBlockNumberAndIndex gets the transaction for a given block number and index.
185185
func (b *Blockchain) TransactionByBlockNumberAndIndex(blockNumber, index uint64) (core.Transaction, error) {
186186
b.listener.OnRead("TransactionByBlockNumberAndIndex")
187-
return core.GetTxByBlockNumIndex(b.database, blockNumber, index)
187+
return core.TransactionsByBlockNumberAndIndexBucket.Get(
188+
b.database,
189+
db.BlockNumIndexKey{
190+
Number: blockNumber,
191+
Index: index,
192+
},
193+
)
188194
}
189195

190196
// TransactionByHash gets the transaction for a given hash.
191197
func (b *Blockchain) TransactionByHash(hash *felt.Felt) (core.Transaction, error) {
192198
b.listener.OnRead("TransactionByHash")
193-
return core.GetTxByHash(b.database, hash)
199+
return core.GetTxByHash(b.database, (*felt.TransactionHash)(hash))
194200
}
195201

196202
// Receipt gets the transaction receipt for a given transaction hash.
203+
// TODO: Return TransactionReceipt instead of *TransactionReceipt.
197204
func (b *Blockchain) Receipt(hash *felt.Felt) (*core.TransactionReceipt, *felt.Felt, uint64, error) {
198205
b.listener.OnRead("Receipt")
199-
bnIndex, err := core.GetTxBlockNumIndexByHash(b.database, hash)
206+
txHash := (*felt.TransactionHash)(hash)
207+
bnIndex, err := core.TransactionBlockNumbersAndIndicesByHashBucket.Get(b.database, txHash)
200208
if err != nil {
201209
return nil, nil, 0, err
202210
}
203211

204-
receipt, err := core.GetReceiptByHash(b.database, hash)
212+
receipt, err := core.GetReceiptByHash(b.database, txHash)
205213
if err != nil {
206214
return nil, nil, 0, err
207215
}

core/accessors.go

Lines changed: 45 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"github.com/NethermindEth/juno/core/felt"
77
"github.com/NethermindEth/juno/db"
88
"github.com/NethermindEth/juno/encoder"
9-
"github.com/NethermindEth/juno/utils"
109
)
1110

1211
/**
@@ -247,66 +246,47 @@ func DeleteBlockHeaderByNumber(w db.KeyValueWriter, number uint64) error {
247246
return w.Delete(db.BlockHeaderByNumberKey(number))
248247
}
249248

250-
func GetReceiptByBlockNumIndexBytes(r db.KeyValueReader, bnIndex []byte) (*TransactionReceipt, error) {
251-
var (
252-
receipt *TransactionReceipt
253-
val []byte
254-
)
255-
err := r.Get(db.ReceiptByBlockNumIndexKeyBytes(bnIndex), func(data []byte) error {
256-
val = data
257-
return nil
258-
})
249+
// TODO: Return TransactionReceipt instead of *TransactionReceipt.
250+
func GetReceiptByHash(
251+
r db.KeyValueReader,
252+
hash *felt.TransactionHash,
253+
) (*TransactionReceipt, error) {
254+
val, err := TransactionBlockNumbersAndIndicesByHashBucket.RawValue().Get(r, hash)
259255
if err != nil {
260256
return nil, err
261257
}
262-
if err = encoder.Unmarshal(val, &receipt); err != nil {
263-
return nil, err
264-
}
265-
return receipt, nil
266-
}
267258

268-
func WriteReceiptByBlockNumIndex(w db.KeyValueWriter, num, index uint64, receipt *TransactionReceipt) error {
269-
data, err := encoder.Marshal(receipt)
270-
if err != nil {
271-
return err
272-
}
273-
return w.Put(db.ReceiptByBlockNumIndexKey(num, index), data)
274-
}
275-
276-
func DeleteReceiptByBlockNumIndex(w db.KeyValueWriter, num, index uint64) error {
277-
return w.Delete(db.ReceiptByBlockNumIndexKey(num, index))
278-
}
279-
280-
func GetReceiptByHash(r db.KeyValueReader, hash *felt.Felt) (*TransactionReceipt, error) {
281-
var val []byte
282-
err := r.Get(db.TxBlockNumIndexByHashKey(hash), func(data []byte) error {
283-
val = data
284-
return nil
285-
})
259+
receipt, err := ReceiptsByBlockNumberAndIndexBucket.RawKey().Get(r, val)
286260
if err != nil {
287261
return nil, err
288262
}
289-
290-
return GetReceiptByBlockNumIndexBytes(r, val)
263+
return &receipt, nil
291264
}
292265

293266
func DeleteTxsAndReceipts(batch db.IndexedBatch, blockNum, numTxs uint64) error {
294267
// remove txs and receipts
295268
for i := range numTxs {
296-
txn, err := GetTxByBlockNumIndex(batch, blockNum, i)
269+
key := db.BlockNumIndexKey{
270+
Number: blockNum,
271+
Index: i,
272+
}
273+
txn, err := TransactionsByBlockNumberAndIndexBucket.Get(batch, key)
297274
if err != nil {
298275
return err
299276
}
300277

301-
if err := DeleteTxByBlockNumIndex(batch, blockNum, i); err != nil {
278+
if err := TransactionsByBlockNumberAndIndexBucket.Delete(batch, key); err != nil {
302279
return err
303280
}
304-
if err := DeleteReceiptByBlockNumIndex(batch, blockNum, i); err != nil {
281+
if err := ReceiptsByBlockNumberAndIndexBucket.Delete(batch, key); err != nil {
305282
return err
306283
}
307-
if err := DeleteTxBlockNumIndexByHash(batch, txn.Hash()); err != nil {
284+
285+
txHash := (*felt.TransactionHash)(txn.Hash())
286+
if err := TransactionBlockNumbersAndIndicesByHashBucket.Delete(batch, txHash); err != nil {
308287
return err
309288
}
289+
310290
if l1handler, ok := txn.(*L1HandlerTransaction); ok {
311291
if err := DeleteL1HandlerTxnHashByMsgHash(batch, l1handler.MessageHash()); err != nil {
312292
return err
@@ -411,61 +391,29 @@ func WriteBlockHeader(w db.KeyValueWriter, header *Header) error {
411391

412392
// Returns all transactions in a given block
413393
func GetTxsByBlockNum(r db.KeyValueReader, blockNum uint64) ([]Transaction, error) {
414-
prefix := db.TransactionsByBlockNumberAndIndex.Key(MarshalBlockNumber(blockNum))
415-
416-
it, err := r.NewIterator(prefix, true)
417-
if err != nil {
418-
return nil, err
419-
}
420-
421-
var txs []Transaction
422-
for it.First(); it.Valid(); it.Next() {
423-
val, vErr := it.Value()
424-
if vErr != nil {
425-
return nil, utils.RunAndWrapOnError(it.Close, vErr)
426-
}
394+
txs := []Transaction{}
395+
txSeq := TransactionsByBlockNumberAndIndexBucket.Prefix().Add(blockNum).Scan(r)
427396

428-
var tx Transaction
429-
if err = encoder.Unmarshal(val, &tx); err != nil {
430-
return nil, utils.RunAndWrapOnError(it.Close, err)
397+
for tx, err := range txSeq {
398+
if err != nil {
399+
return nil, err
431400
}
432-
433-
txs = append(txs, tx)
434-
}
435-
436-
if err = it.Close(); err != nil {
437-
return nil, err
401+
txs = append(txs, tx.Value)
438402
}
439403

440404
return txs, nil
441405
}
442406

443407
// Returns all receipts in a given block
444408
func GetReceiptsByBlockNum(r db.KeyValueReader, blockNum uint64) ([]*TransactionReceipt, error) {
445-
prefix := db.ReceiptsByBlockNumberAndIndex.Key(MarshalBlockNumber(blockNum))
446-
447-
it, err := r.NewIterator(prefix, true)
448-
if err != nil {
449-
return nil, err
450-
}
409+
receipts := []*TransactionReceipt{}
410+
receiptSeq := ReceiptsByBlockNumberAndIndexBucket.Prefix().Add(blockNum).Scan(r)
451411

452-
var receipts []*TransactionReceipt
453-
for it.First(); it.Valid(); it.Next() {
454-
val, vErr := it.Value()
455-
if vErr != nil {
456-
return nil, utils.RunAndWrapOnError(it.Close, vErr)
457-
}
458-
459-
var receipt *TransactionReceipt
460-
if err = encoder.Unmarshal(val, &receipt); err != nil {
461-
return nil, utils.RunAndWrapOnError(it.Close, err)
412+
for receipt, err := range receiptSeq {
413+
if err != nil {
414+
return nil, err
462415
}
463-
464-
receipts = append(receipts, receipt)
465-
}
466-
467-
if err = it.Close(); err != nil {
468-
return nil, err
416+
receipts = append(receipts, &receipt.Value)
469417
}
470418

471419
return receipts, nil
@@ -494,85 +442,40 @@ func GetBlockByNumber(r db.KeyValueReader, blockNum uint64) (*Block, error) {
494442
}, nil
495443
}
496444

497-
func GetTxBlockNumIndexByHash(r db.KeyValueReader, hash *felt.Felt) (db.BlockNumIndexKey, error) {
498-
bnIndex := db.BlockNumIndexKey{}
499-
err := r.Get(db.TxBlockNumIndexByHashKey(hash), bnIndex.UnmarshalBinary)
500-
return bnIndex, err
501-
}
502-
503-
func WriteTxBlockNumIndexByHash(w db.KeyValueWriter, num, index uint64, hash *felt.Felt) error {
504-
val := db.BlockNumIndexKey{
445+
func WriteTxAndReceipt(
446+
w db.KeyValueWriter,
447+
num, index uint64,
448+
tx Transaction,
449+
receipt *TransactionReceipt,
450+
) error {
451+
txHash := (*felt.TransactionHash)(tx.Hash())
452+
key := db.BlockNumIndexKey{
505453
Number: num,
506454
Index: index,
507455
}
508-
return w.Put(db.TxBlockNumIndexByHashKey(hash), val.Marshal())
509-
}
510456

511-
func DeleteTxBlockNumIndexByHash(w db.KeyValueWriter, hash *felt.Felt) error {
512-
return w.Delete(db.TxBlockNumIndexByHashKey(hash))
513-
}
514-
515-
func GetTxByBlockNumIndex(r db.KeyValueReader, blockNum, index uint64) (Transaction, error) {
516-
var tx Transaction
517-
err := r.Get(db.TxByBlockNumIndexKey(blockNum, index), func(data []byte) error {
518-
return encoder.Unmarshal(data, &tx)
519-
})
520-
if err != nil {
521-
return nil, err
522-
}
523-
return tx, nil
524-
}
525-
526-
func GetTxByBlockNumIndexBytes(r db.KeyValueReader, val []byte) (Transaction, error) {
527-
var tx Transaction
528-
err := r.Get(db.TxByBlockNumIndexKeyBytes(val), func(data []byte) error {
529-
return encoder.Unmarshal(data, &tx)
530-
})
531-
if err != nil {
532-
return nil, err
533-
}
534-
return tx, nil
535-
}
536-
537-
func WriteTxByBlockNumIndex(w db.KeyValueWriter, num, index uint64, tx Transaction) error {
538-
enc, err := encoder.Marshal(tx)
539-
if err != nil {
540-
return err
541-
}
542-
return w.Put(db.TxByBlockNumIndexKey(num, index), enc)
543-
}
544-
545-
func DeleteTxByBlockNumIndex(w db.KeyValueWriter, num, index uint64) error {
546-
return w.Delete(db.TxByBlockNumIndexKey(num, index))
547-
}
548-
549-
func WriteTxAndReceipt(w db.KeyValueWriter, num, index uint64, tx Transaction, receipt *TransactionReceipt) error {
550-
if err := WriteTxBlockNumIndexByHash(w, num, index, receipt.TransactionHash); err != nil {
457+
if err := TransactionBlockNumbersAndIndicesByHashBucket.Put(w, txHash, &key); err != nil {
551458
return err
552459
}
553460

554-
if err := WriteTxByBlockNumIndex(w, num, index, tx); err != nil {
461+
if err := TransactionsByBlockNumberAndIndexBucket.Put(w, key, &tx); err != nil {
555462
return err
556463
}
557464

558-
if err := WriteReceiptByBlockNumIndex(w, num, index, receipt); err != nil {
465+
if err := ReceiptsByBlockNumberAndIndexBucket.Put(w, key, receipt); err != nil {
559466
return err
560467
}
561468

562469
return nil
563470
}
564471

565-
func GetTxByHash(r db.KeyValueReader, hash *felt.Felt) (Transaction, error) {
566-
var val []byte
567-
err := r.Get(db.TxBlockNumIndexByHashKey(hash), func(data []byte) error {
568-
val = data
569-
return nil
570-
})
472+
func GetTxByHash(r db.KeyValueReader, hash *felt.TransactionHash) (Transaction, error) {
473+
val, err := TransactionBlockNumbersAndIndicesByHashBucket.RawValue().Get(r, hash)
571474
if err != nil {
572475
return nil, err
573476
}
574477

575-
return GetTxByBlockNumIndexBytes(r, val)
478+
return TransactionsByBlockNumberAndIndexBucket.RawKey().Get(r, val)
576479
}
577480

578481
func GetAggregatedBloomFilter(r db.KeyValueReader, fromBlock, toBLock uint64) (AggregatedBloomFilter, error) {

core/transaction.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ type BuiltinInstanceCounter struct {
131131
}
132132

133133
type Transaction interface {
134+
// TODO: This should be TransactionHash instead of Felt.
134135
Hash() *felt.Felt
135136
Signature() []*felt.Felt
136137
TxVersion() *TransactionVersion

0 commit comments

Comments
 (0)