From 5f2809d6f498f716ca421883d5904d37aed55cef Mon Sep 17 00:00:00 2001 From: IronGauntlets Date: Thu, 12 Dec 2024 21:51:49 +0000 Subject: [PATCH] Make blockchain.TransactionsByBlockNumber() private Functions in the blockchain package with a db.Transaction argument are intended to be private function since blockchain package is one of the few packages allowed to modify the DB. --- blockchain/blockchain.go | 4 ++-- migration/migration.go | 42 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/blockchain/blockchain.go b/blockchain/blockchain.go index 33f1f68db6..15c4c9977a 100644 --- a/blockchain/blockchain.go +++ b/blockchain/blockchain.go @@ -476,7 +476,7 @@ func blockByNumber(txn db.Transaction, number uint64) (*core.Block, error) { block := new(core.Block) block.Header = header - block.Transactions, err = TransactionsByBlockNumber(txn, number) + block.Transactions, err = transactionsByBlockNumber(txn, number) if err != nil { return nil, err } @@ -488,7 +488,7 @@ func blockByNumber(txn db.Transaction, number uint64) (*core.Block, error) { return block, nil } -func TransactionsByBlockNumber(txn db.Transaction, number uint64) ([]core.Transaction, error) { +func transactionsByBlockNumber(txn db.Transaction, number uint64) ([]core.Transaction, error) { iterator, err := txn.NewIterator() if err != nil { return nil, err diff --git a/migration/migration.go b/migration/migration.go index f1922ef637..baa28fc2c1 100644 --- a/migration/migration.go +++ b/migration/migration.go @@ -1,6 +1,7 @@ package migration import ( + "bytes" "context" "encoding/binary" "errors" @@ -8,9 +9,9 @@ import ( "runtime" "sync" - "github.com/NethermindEth/juno/blockchain" "github.com/NethermindEth/juno/core" "github.com/NethermindEth/juno/db" + "github.com/NethermindEth/juno/encoder" "github.com/NethermindEth/juno/utils" "github.com/fxamacker/cbor/v2" "github.com/sourcegraph/conc/pool" @@ -203,7 +204,7 @@ func processBlocks(txn db.Transaction, processBlock func(uint64, *sync.Mutex) er func calculateL1MsgHashes(txn db.Transaction, n *utils.Network) error { processBlockFunc := func(blockNumber uint64, txnLock *sync.Mutex) error { txnLock.Lock() - txns, err := blockchain.TransactionsByBlockNumber(txn, blockNumber) + txns, err := transactionsByBlockNumber(txn, blockNumber) txnLock.Unlock() if err != nil { return err @@ -238,3 +239,40 @@ func storeL1HandlerMsgHashes(dbTxn db.Transaction, blockTxns []core.Transaction) } return nil } + +// transactionsByBlockNumber has been copied from the blockchain package since functions which take db.Transaction as an +// argument are intended to be private and as migrations are temporary, the duplication of code is acceptable. +func transactionsByBlockNumber(txn db.Transaction, number uint64) ([]core.Transaction, error) { + iterator, err := txn.NewIterator() + if err != nil { + return nil, err + } + + var txs []core.Transaction + numBytes := core.MarshalBlockNumber(number) + + prefix := db.TransactionsByBlockNumberAndIndex.Key(numBytes) + for iterator.Seek(prefix); iterator.Valid(); iterator.Next() { + if !bytes.HasPrefix(iterator.Key(), prefix) { + break + } + + val, vErr := iterator.Value() + if vErr != nil { + return nil, utils.RunAndWrapOnError(iterator.Close, vErr) + } + + var tx core.Transaction + if err = encoder.Unmarshal(val, &tx); err != nil { + return nil, utils.RunAndWrapOnError(iterator.Close, err) + } + + txs = append(txs, tx) + } + + if err = iterator.Close(); err != nil { + return nil, err + } + + return txs, nil +}