Skip to content

Commit c4b52ef

Browse files
tailingchenyysung1123
authored andcommitted
core,core/rawdb, eth: return error when getting transfer logs
1 parent 490f4e4 commit c4b52ef

File tree

5 files changed

+42
-21
lines changed

5 files changed

+42
-21
lines changed

core/blockchain.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1430,9 +1430,11 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
14301430
// Ensure genesis is in the ancient store
14311431
if blockChain[0].NumberU64() == 1 {
14321432
if frozen, _ := bc.db.Ancients(); frozen == 0 {
1433-
tfLogs := rawdb.ReadTransferLogs(bc.db, bc.genesisBlock.Hash(), frozen)
1433+
tfLogs, err := rawdb.ReadTransferLogs(bc.db, bc.genesisBlock.Hash(), frozen)
1434+
if err != nil {
1435+
return 0, err
1436+
}
14341437
writeSize, err := rawdb.WriteAncientBlocks(bc.db, []*types.Block{bc.genesisBlock}, []rlp.RawValue{rlp.EmptyList}, tfLogs)
1435-
size += writeSize
14361438
if err != nil {
14371439
log.Error("Error writing genesis to ancients", "err", err)
14381440
return 0, err

core/blockchain_reader.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import (
2121
"fmt"
2222
"math/big"
2323

24+
"github.com/ethereum/go-ethereum"
25+
2426
"github.com/ethereum/go-ethereum/common"
2527
"github.com/ethereum/go-ethereum/consensus"
2628
"github.com/ethereum/go-ethereum/consensus/misc/eip4844"
@@ -524,10 +526,15 @@ func (bc *BlockChain) SubscribeBlockProcessingEvent(ch chan<- bool) event.Subscr
524526
}
525527

526528
// GetTransferLogs retrieves the transfer logs for all transactions in a given block.
527-
func (bc *BlockChain) GetTransferLogs(hash common.Hash) []*types.TransferLog {
529+
func (bc *BlockChain) GetTransferLogs(hash common.Hash) ([]*types.TransferLog, error) {
528530
number, ok := rawdb.ReadHeaderNumber(bc.db, hash)
529531
if !ok {
530-
return nil
532+
return nil, ethereum.NotFound
533+
}
534+
transferLogs, err := rawdb.ReadTransferLogs(bc.db, hash, number)
535+
if err != nil {
536+
return nil, err
531537
}
532-
return rawdb.ReadTransferLogs(bc.db, hash, number)
538+
bc.transferLogsCache.Add(hash, transferLogs)
539+
return transferLogs, nil
533540
}

core/rawdb/accessors_chain.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package rawdb
1919
import (
2020
"bytes"
2121
"encoding/binary"
22+
"errors"
2223
"fmt"
2324
"math/big"
2425
"slices"
@@ -33,6 +34,11 @@ import (
3334
"github.com/ethereum/go-ethereum/rlp"
3435
)
3536

37+
var (
38+
errNotFound = errors.New("not found")
39+
errMissingTransferLogs = errors.New("missing transfer logs")
40+
)
41+
3642
// ReadCanonicalHash retrieves the hash assigned to a canonical block number.
3743
func ReadCanonicalHash(db ethdb.Reader, number uint64) common.Hash {
3844
var data []byte
@@ -735,18 +741,21 @@ func ReadTransferLogsRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.R
735741
}
736742

737743
// ReadTransferLogs retrieves all the transfer logs belonging to a block.
738-
func ReadTransferLogs(db ethdb.Reader, hash common.Hash, number uint64) []*types.TransferLog {
744+
func ReadTransferLogs(db ethdb.Reader, hash common.Hash, number uint64) ([]*types.TransferLog, error) {
739745
// Retrieve the flattened transfer log slice
740746
data := ReadTransferLogsRLP(db, hash, number)
741747
if len(data) == 0 {
742-
return nil
748+
return nil, errNotFound
743749
}
744750
transferLogs := []*types.TransferLog{}
745751
if err := rlp.DecodeBytes(data, &transferLogs); err != nil {
752+
if string(data) == errMissingTransferLogs.Error() {
753+
return nil, errMissingTransferLogs
754+
}
746755
log.Error("Invalid transfer log array RLP", "hash", hash, "number", number, "err", err)
747-
return nil
756+
return nil, err
748757
}
749-
return transferLogs
758+
return transferLogs, nil
750759
}
751760

752761
// WriteTransferLogs stores all the transfer logs belonging to a block.
@@ -763,7 +772,7 @@ func WriteTransferLogs(db ethdb.KeyValueWriter, hash common.Hash, number uint64,
763772

764773
// WriteMissingTransferLogs stores missing transfer logs message for a block.
765774
func WriteMissingTransferLogs(db ethdb.KeyValueWriter, hash common.Hash, number uint64) {
766-
bytes := []byte("missing transfer logs")
775+
bytes := []byte(errMissingTransferLogs.Error())
767776
// Store the flattened transfer log slice
768777
if err := db.Put(blockTransferLogsKey(number, hash), bytes); err != nil {
769778
log.Crit("Failed to store block transfer logs", "hash", hash, "number", number, "err", err)
@@ -838,7 +847,7 @@ func writeAncientBlock(op ethdb.AncientWriteOp, block *types.Block, header *type
838847
log.Crit("Failed to RLP encode block transfer logs", "err", err)
839848
}
840849
} else {
841-
transferLogBlob = []byte("missing transfer logs")
850+
transferLogBlob = []byte(errMissingTransferLogs.Error())
842851
}
843852
if err := op.AppendRaw(ChainFreezerTransferLogTable, num, transferLogBlob); err != nil {
844853
return fmt.Errorf("can't append block %d transfer logs: %v", num, err)

core/rawdb/accessors_chain_test.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -502,8 +502,8 @@ func TestAncientTransferLogStorageTransferLog(t *testing.T) {
502502
hash, number := block.Hash(), block.NumberU64()
503503
// Write with nil transfer logs, should get nil transfer logs.
504504
WriteAncientBlocks(db, []*types.Block{block}, types.EncodeBlockReceiptLists([]types.Receipts{nil}), nil)
505-
if tlogs := ReadTransferLogs(db, hash, number); tlogs != nil {
506-
t.Fatalf("should return nil transfer logs")
505+
if tlogs, err := ReadTransferLogs(db, hash, number); tlogs != nil || err != errMissingTransferLogs {
506+
t.Fatalf("should return nil transfer logs and missing transfer logs error")
507507
}
508508

509509
// Create a test block
@@ -517,7 +517,7 @@ func TestAncientTransferLogStorageTransferLog(t *testing.T) {
517517
hash, number = block2.Hash(), block2.NumberU64()
518518
// Write with nil transfer logs, should get nil transfer logs.
519519
WriteAncientBlocks(db, []*types.Block{block2}, types.EncodeBlockReceiptLists([]types.Receipts{nil}), []*types.TransferLog{})
520-
if tlogs := ReadTransferLogs(db, hash, number); tlogs == nil {
520+
if tlogs, err := ReadTransferLogs(db, hash, number); tlogs == nil || err != nil {
521521
t.Fatalf("invalid transfer logs returned")
522522
}
523523
}
@@ -1026,12 +1026,12 @@ func TestTransferLogStorage(t *testing.T) {
10261026

10271027
// Check that no transfer logs entries are in a pristine database
10281028
hash := common.BytesToHash([]byte{0x03, 0x14})
1029-
if ls := ReadTransferLogs(db, hash, 0); len(ls) != 0 {
1029+
if ls, err := ReadTransferLogs(db, hash, 0); len(ls) != 0 || err != errNotFound {
10301030
t.Fatalf("non existent transfer logs returned: %v", ls)
10311031
}
10321032
// Insert the transfer log slice into the database and check presence
10331033
WriteTransferLogs(db, hash, 0, transferLogs)
1034-
if ls := ReadTransferLogs(db, hash, 0); len(ls) == 0 {
1034+
if ls, err := ReadTransferLogs(db, hash, 0); len(ls) == 0 || err != nil {
10351035
t.Fatalf("no transfer logs returned")
10361036
} else {
10371037
for i := 0; i < len(transferLogs); i++ {
@@ -1045,7 +1045,13 @@ func TestTransferLogStorage(t *testing.T) {
10451045
}
10461046
// Delete the transfer log slice and check purge
10471047
DeleteTransferLogs(db, hash, 0)
1048-
if ls := ReadTransferLogs(db, hash, 0); len(ls) != 0 {
1048+
if ls, err := ReadTransferLogs(db, hash, 0); len(ls) != 0 || err != errNotFound {
10491049
t.Fatalf("deleted transfer logs returned: %v", ls)
10501050
}
1051+
// Insert missing transfer logs into the database and check error
1052+
hash2 := common.BytesToHash([]byte{0x07, 0x15})
1053+
WriteMissingTransferLogs(db, hash2, 1)
1054+
if ls, err := ReadTransferLogs(db, hash2, 1); len(ls) != 0 || err != errMissingTransferLogs {
1055+
t.Fatalf("no transfer logs returned and should return missing transfer logs error")
1056+
}
10511057
}

eth/api_debug.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -535,10 +535,7 @@ func (api *DebugAPI) ExecutionWitnessByHash(hash common.Hash) (*stateless.ExtWit
535535

536536
// GetTransferLogs is a debug API function that returns the transfer logs for a block hash, if known.
537537
func (api *DebugAPI) GetTransferLogs(ctx context.Context, hash common.Hash) ([]*types.TransferLog, error) {
538-
if transferLogs := api.eth.blockchain.GetTransferLogs(hash); transferLogs != nil {
539-
return transferLogs, nil
540-
}
541-
return nil, errors.New("unknown transfer logs")
538+
return api.eth.blockchain.GetTransferLogs(hash)
542539
}
543540

544541
// GetBlockReceipts returns all transaction receipts of the specified block.

0 commit comments

Comments
 (0)