diff --git a/core/rawdb/accessors_indexes.go b/core/rawdb/accessors_indexes.go index fafde25606..fe41d9440f 100644 --- a/core/rawdb/accessors_indexes.go +++ b/core/rawdb/accessors_indexes.go @@ -24,6 +24,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" @@ -139,15 +140,41 @@ func ReadTransaction(db ethdb.Reader, hash common.Hash) (*types.Transaction, com if blockHash == (common.Hash{}) { return nil, common.Hash{}, 0, 0 } - body := ReadBody(db, blockHash, *blockNumber) - if body == nil { + bodyRLP := ReadBodyRLP(db, blockHash, *blockNumber) + if bodyRLP == nil { log.Error("Transaction referenced missing", "number", *blockNumber, "hash", blockHash) return nil, common.Hash{}, 0, 0 } - for txIndex, tx := range body.Transactions { - if tx.Hash() == hash { - return tx, blockHash, *blockNumber, uint64(txIndex) + txnListRLP, _, err := rlp.SplitList(bodyRLP) + if err != nil { + return nil, common.Hash{}, 0, 0 + } + txnIterator, err := rlp.NewListIterator(txnListRLP) + if err != nil { + return nil, common.Hash{}, 0, 0 + } + + txIndex := 0 + for txnIterator.Next() && txnIterator.Err() == nil { + txnRLP := txnIterator.Value() + + // Figure out if this a legacy transaction or not + rlpKind, hashPreimage, _, err := rlp.Split(txnRLP) + if err != nil { + return nil, common.Hash{}, 0, 0 } + if rlpKind == rlp.List { + hashPreimage = txnRLP + } + + if crypto.Keccak256Hash(hashPreimage) == hash { + var tx types.Transaction + if err := rlp.DecodeBytes(txnRLP, &tx); err != nil { + return nil, common.Hash{}, 0, 0 + } + return &tx, blockHash, *blockNumber, uint64(txIndex) + } + txIndex++ } log.Error("Transaction not found", "number", *blockNumber, "hash", blockHash, "txhash", hash) return nil, common.Hash{}, 0, 0 diff --git a/core/rawdb/accessors_indexes_test.go b/core/rawdb/accessors_indexes_test.go index 29b468fb2a..1b29f67d49 100644 --- a/core/rawdb/accessors_indexes_test.go +++ b/core/rawdb/accessors_indexes_test.go @@ -72,7 +72,15 @@ func TestLookupStorage(t *testing.T) { tx1 := types.NewTransaction(1, common.BytesToAddress([]byte{0x11}), big.NewInt(111), 1111, big.NewInt(11111), []byte{0x11, 0x11, 0x11}) tx2 := types.NewTransaction(2, common.BytesToAddress([]byte{0x22}), big.NewInt(222), 2222, big.NewInt(22222), []byte{0x22, 0x22, 0x22}) tx3 := types.NewTransaction(3, common.BytesToAddress([]byte{0x33}), big.NewInt(333), 3333, big.NewInt(33333), []byte{0x33, 0x33, 0x33}) - txs := []*types.Transaction{tx1, tx2, tx3} + tx4 := types.NewTx(&types.DynamicFeeTx{ + To: new(common.Address), + Nonce: 5, + Value: big.NewInt(5), + Gas: 5, + GasTipCap: big.NewInt(55), + GasFeeCap: big.NewInt(1055), + }) + txs := []*types.Transaction{tx1, tx2, tx3, tx4} block := types.NewBlock(&types.Header{Number: big.NewInt(314)}, &types.Body{Transactions: txs}, nil, newTestHasher())