mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 23:26:44 +00:00
core, eth, internal: new transaction schema usage polishes
This commit is contained in:
parent
07a86cf21c
commit
98fd40d2f6
4 changed files with 76 additions and 113 deletions
|
|
@ -71,6 +71,14 @@ var (
|
||||||
preimageHitCounter = metrics.NewCounter("db/preimage/hits")
|
preimageHitCounter = metrics.NewCounter("db/preimage/hits")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// lookupEntry is a positional metadata to help looking up the data content of
|
||||||
|
// a transaction or receipt given only its hash.
|
||||||
|
type lookupEntry struct {
|
||||||
|
BlockHash common.Hash
|
||||||
|
BlockIndex uint64
|
||||||
|
Index uint64
|
||||||
|
}
|
||||||
|
|
||||||
// encodeBlockNumber encodes a block number as big endian uint64
|
// encodeBlockNumber encodes a block number as big endian uint64
|
||||||
func encodeBlockNumber(number uint64) []byte {
|
func encodeBlockNumber(number uint64) []byte {
|
||||||
enc := make([]byte, 8)
|
enc := make([]byte, 8)
|
||||||
|
|
@ -258,23 +266,18 @@ func GetBlockReceipts(db ethdb.Database, hash common.Hash, number uint64) types.
|
||||||
// GetLookupEntry retrieves the positional metadata associated with a transaction
|
// GetLookupEntry retrieves the positional metadata associated with a transaction
|
||||||
// hash to allow retrieving the transaction or receipt by hash.
|
// hash to allow retrieving the transaction or receipt by hash.
|
||||||
func GetLookupEntry(db ethdb.Database, hash common.Hash) (common.Hash, uint64, uint64) {
|
func GetLookupEntry(db ethdb.Database, hash common.Hash) (common.Hash, uint64, uint64) {
|
||||||
// Define the transaction positional metadata
|
// Load the positional metadata from disk and bail if it fails
|
||||||
var entry struct {
|
|
||||||
BlockHash common.Hash
|
|
||||||
BlockIndex uint64
|
|
||||||
Index uint64
|
|
||||||
}
|
|
||||||
// Retrieve the transaction metadata and resolve the transaction from the body
|
|
||||||
data, _ := db.Get(append(lookupPrefix, hash.Bytes()...))
|
data, _ := db.Get(append(lookupPrefix, hash.Bytes()...))
|
||||||
if len(data) != 0 {
|
if len(data) == 0 {
|
||||||
// New style transaction, retrieve contents from the block
|
return common.Hash{}, 0, 0
|
||||||
if err := rlp.DecodeBytes(data, &entry); err != nil {
|
|
||||||
log.Error("Invalid lookup entry RLP", "hash", hash, "err", err)
|
|
||||||
return common.Hash{}, 0, 0
|
|
||||||
}
|
|
||||||
return entry.BlockHash, entry.BlockIndex, entry.Index
|
|
||||||
}
|
}
|
||||||
return common.Hash{}, 0, 0
|
// Parse and return the contents of the lookup entry
|
||||||
|
var entry lookupEntry
|
||||||
|
if err := rlp.DecodeBytes(data, &entry); err != nil {
|
||||||
|
log.Error("Invalid lookup entry RLP", "hash", hash, "err", err)
|
||||||
|
return common.Hash{}, 0, 0
|
||||||
|
}
|
||||||
|
return entry.BlockHash, entry.BlockIndex, entry.Index
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTransaction retrieves a specific transaction from the database, along with
|
// GetTransaction retrieves a specific transaction from the database, along with
|
||||||
|
|
@ -286,7 +289,7 @@ func GetTransaction(db ethdb.Database, hash common.Hash) (*types.Transaction, co
|
||||||
if blockHash != (common.Hash{}) {
|
if blockHash != (common.Hash{}) {
|
||||||
body := GetBody(db, blockHash, blockNumber)
|
body := GetBody(db, blockHash, blockNumber)
|
||||||
if body == nil || len(body.Transactions) <= int(txIndex) {
|
if body == nil || len(body.Transactions) <= int(txIndex) {
|
||||||
log.Error("Transaction refereced missing", "number", blockNumber, "hash", blockHash, "index", txIndex)
|
log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash, "index", txIndex)
|
||||||
return nil, common.Hash{}, 0, 0
|
return nil, common.Hash{}, 0, 0
|
||||||
}
|
}
|
||||||
return body.Transactions[txIndex], blockHash, blockNumber, txIndex
|
return body.Transactions[txIndex], blockHash, blockNumber, txIndex
|
||||||
|
|
@ -305,15 +308,11 @@ func GetTransaction(db ethdb.Database, hash common.Hash) (*types.Transaction, co
|
||||||
if len(data) == 0 {
|
if len(data) == 0 {
|
||||||
return nil, common.Hash{}, 0, 0
|
return nil, common.Hash{}, 0, 0
|
||||||
}
|
}
|
||||||
var meta struct {
|
var entry lookupEntry
|
||||||
BlockHash common.Hash
|
if err := rlp.DecodeBytes(data, &entry); err != nil {
|
||||||
BlockIndex uint64
|
|
||||||
Index uint64
|
|
||||||
}
|
|
||||||
if err := rlp.DecodeBytes(data, &meta); err != nil {
|
|
||||||
return nil, common.Hash{}, 0, 0
|
return nil, common.Hash{}, 0, 0
|
||||||
}
|
}
|
||||||
return &tx, meta.BlockHash, meta.BlockIndex, meta.Index
|
return &tx, entry.BlockHash, entry.BlockIndex, entry.Index
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetReceipt retrieves a specific transaction receipt from the database, along with
|
// GetReceipt retrieves a specific transaction receipt from the database, along with
|
||||||
|
|
@ -468,16 +467,12 @@ func WriteLookupEntries(db ethdb.Database, block *types.Block) error {
|
||||||
|
|
||||||
// Iterate over each transaction and encode its metadata
|
// Iterate over each transaction and encode its metadata
|
||||||
for i, tx := range block.Transactions() {
|
for i, tx := range block.Transactions() {
|
||||||
meta := struct {
|
entry := lookupEntry{
|
||||||
BlockHash common.Hash
|
|
||||||
BlockIndex uint64
|
|
||||||
Index uint64
|
|
||||||
}{
|
|
||||||
BlockHash: block.Hash(),
|
BlockHash: block.Hash(),
|
||||||
BlockIndex: block.NumberU64(),
|
BlockIndex: block.NumberU64(),
|
||||||
Index: uint64(i),
|
Index: uint64(i),
|
||||||
}
|
}
|
||||||
data, err := rlp.EncodeToBytes(meta)
|
data, err := rlp.EncodeToBytes(entry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,24 +33,15 @@ func TestMipmapUpgrade(t *testing.T) {
|
||||||
genesis := new(core.Genesis).MustCommit(db)
|
genesis := new(core.Genesis).MustCommit(db)
|
||||||
|
|
||||||
chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, db, 10, func(i int, gen *core.BlockGen) {
|
chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, db, 10, func(i int, gen *core.BlockGen) {
|
||||||
var receipts types.Receipts
|
|
||||||
switch i {
|
switch i {
|
||||||
case 1:
|
case 1:
|
||||||
receipt := types.NewReceipt(nil, new(big.Int))
|
receipt := types.NewReceipt(nil, new(big.Int))
|
||||||
receipt.Logs = []*types.Log{{Address: addr}}
|
receipt.Logs = []*types.Log{{Address: addr}}
|
||||||
gen.AddUncheckedReceipt(receipt)
|
gen.AddUncheckedReceipt(receipt)
|
||||||
receipts = types.Receipts{receipt}
|
|
||||||
case 2:
|
case 2:
|
||||||
receipt := types.NewReceipt(nil, new(big.Int))
|
receipt := types.NewReceipt(nil, new(big.Int))
|
||||||
receipt.Logs = []*types.Log{{Address: addr}}
|
receipt.Logs = []*types.Log{{Address: addr}}
|
||||||
gen.AddUncheckedReceipt(receipt)
|
gen.AddUncheckedReceipt(receipt)
|
||||||
receipts = types.Receipts{receipt}
|
|
||||||
}
|
|
||||||
|
|
||||||
// store the receipts
|
|
||||||
err := core.WriteReceipts(db, receipts)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
for i, block := range chain {
|
for i, block := range chain {
|
||||||
|
|
|
||||||
|
|
@ -82,12 +82,6 @@ func BenchmarkMipmaps(b *testing.B) {
|
||||||
gen.AddUncheckedReceipt(receipt)
|
gen.AddUncheckedReceipt(receipt)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// store the receipts
|
|
||||||
err := core.WriteReceipts(db, receipts)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
core.WriteMipmapBloom(db, uint64(i+1), receipts)
|
core.WriteMipmapBloom(db, uint64(i+1), receipts)
|
||||||
})
|
})
|
||||||
for i, block := range chain {
|
for i, block := range chain {
|
||||||
|
|
@ -183,12 +177,6 @@ func TestFilters(t *testing.T) {
|
||||||
gen.AddUncheckedReceipt(receipt)
|
gen.AddUncheckedReceipt(receipt)
|
||||||
receipts = types.Receipts{receipt}
|
receipts = types.Receipts{receipt}
|
||||||
}
|
}
|
||||||
|
|
||||||
// store the receipts
|
|
||||||
err := core.WriteReceipts(db, receipts)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
// i is used as block number for the writes but since the i
|
// i is used as block number for the writes but since the i
|
||||||
// starts at 0 and block 0 (genesis) is already present increment
|
// starts at 0 and block 0 (genesis) is already present increment
|
||||||
// by one
|
// by one
|
||||||
|
|
|
||||||
|
|
@ -767,7 +767,7 @@ func (s *PublicBlockChainAPI) rpcOutputBlock(b *types.Block, inclTx bool, fullTx
|
||||||
|
|
||||||
if fullTx {
|
if fullTx {
|
||||||
formatTx = func(tx *types.Transaction) (interface{}, error) {
|
formatTx = func(tx *types.Transaction) (interface{}, error) {
|
||||||
return newRPCTransaction(b, tx.Hash())
|
return newRPCTransactionFromBlockHash(b, tx.Hash()), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -810,15 +810,17 @@ type RPCTransaction struct {
|
||||||
S *hexutil.Big `json:"s"`
|
S *hexutil.Big `json:"s"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// newRPCPendingTransaction returns a pending transaction that will serialize to the RPC representation
|
// newRPCTransaction returns a transaction that will serialize to the RPC
|
||||||
func newRPCPendingTransaction(tx *types.Transaction) *RPCTransaction {
|
// representation, with the given location metadata set (if available).
|
||||||
|
func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber uint64, index uint64) *RPCTransaction {
|
||||||
var signer types.Signer = types.FrontierSigner{}
|
var signer types.Signer = types.FrontierSigner{}
|
||||||
if tx.Protected() {
|
if tx.Protected() {
|
||||||
signer = types.NewEIP155Signer(tx.ChainId())
|
signer = types.NewEIP155Signer(tx.ChainId())
|
||||||
}
|
}
|
||||||
from, _ := types.Sender(signer, tx)
|
from, _ := types.Sender(signer, tx)
|
||||||
v, r, s := tx.RawSignatureValues()
|
v, r, s := tx.RawSignatureValues()
|
||||||
return &RPCTransaction{
|
|
||||||
|
result := &RPCTransaction{
|
||||||
From: from,
|
From: from,
|
||||||
Gas: (*hexutil.Big)(tx.Gas()),
|
Gas: (*hexutil.Big)(tx.Gas()),
|
||||||
GasPrice: (*hexutil.Big)(tx.GasPrice()),
|
GasPrice: (*hexutil.Big)(tx.GasPrice()),
|
||||||
|
|
@ -831,56 +833,46 @@ func newRPCPendingTransaction(tx *types.Transaction) *RPCTransaction {
|
||||||
R: (*hexutil.Big)(r),
|
R: (*hexutil.Big)(r),
|
||||||
S: (*hexutil.Big)(s),
|
S: (*hexutil.Big)(s),
|
||||||
}
|
}
|
||||||
|
if blockHash != (common.Hash{}) {
|
||||||
|
result.BlockHash = blockHash
|
||||||
|
result.BlockNumber = (*hexutil.Big)(new(big.Int).SetUint64(blockNumber))
|
||||||
|
result.TransactionIndex = hexutil.Uint(index)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// newRPCPendingTransaction returns a pending transaction that will serialize to the RPC representation
|
||||||
|
func newRPCPendingTransaction(tx *types.Transaction) *RPCTransaction {
|
||||||
|
return newRPCTransaction(tx, common.Hash{}, 0, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newRPCTransactionFromBlockIndex returns a transaction that will serialize to the RPC representation.
|
// newRPCTransactionFromBlockIndex returns a transaction that will serialize to the RPC representation.
|
||||||
func newRPCTransactionFromBlockIndex(b *types.Block, txIndex uint) (*RPCTransaction, error) {
|
func newRPCTransactionFromBlockIndex(b *types.Block, index uint64) *RPCTransaction {
|
||||||
if txIndex < uint(len(b.Transactions())) {
|
txs := b.Transactions()
|
||||||
tx := b.Transactions()[txIndex]
|
if index >= uint64(len(txs)) {
|
||||||
var signer types.Signer = types.FrontierSigner{}
|
return nil
|
||||||
if tx.Protected() {
|
|
||||||
signer = types.NewEIP155Signer(tx.ChainId())
|
|
||||||
}
|
|
||||||
from, _ := types.Sender(signer, tx)
|
|
||||||
v, r, s := tx.RawSignatureValues()
|
|
||||||
return &RPCTransaction{
|
|
||||||
BlockHash: b.Hash(),
|
|
||||||
BlockNumber: (*hexutil.Big)(b.Number()),
|
|
||||||
From: from,
|
|
||||||
Gas: (*hexutil.Big)(tx.Gas()),
|
|
||||||
GasPrice: (*hexutil.Big)(tx.GasPrice()),
|
|
||||||
Hash: tx.Hash(),
|
|
||||||
Input: hexutil.Bytes(tx.Data()),
|
|
||||||
Nonce: hexutil.Uint64(tx.Nonce()),
|
|
||||||
To: tx.To(),
|
|
||||||
TransactionIndex: hexutil.Uint(txIndex),
|
|
||||||
Value: (*hexutil.Big)(tx.Value()),
|
|
||||||
V: (*hexutil.Big)(v),
|
|
||||||
R: (*hexutil.Big)(r),
|
|
||||||
S: (*hexutil.Big)(s),
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
return newRPCTransaction(txs[index], b.Hash(), b.NumberU64(), index)
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// newRPCRawTransactionFromBlockIndex returns the bytes of a transaction given a block and a transaction index.
|
// newRPCRawTransactionFromBlockIndex returns the bytes of a transaction given a block and a transaction index.
|
||||||
func newRPCRawTransactionFromBlockIndex(b *types.Block, txIndex uint) (hexutil.Bytes, error) {
|
func newRPCRawTransactionFromBlockIndex(b *types.Block, index uint64) hexutil.Bytes {
|
||||||
if txIndex < uint(len(b.Transactions())) {
|
txs := b.Transactions()
|
||||||
tx := b.Transactions()[txIndex]
|
if index >= uint64(len(txs)) {
|
||||||
return rlp.EncodeToBytes(tx)
|
return nil
|
||||||
}
|
}
|
||||||
return nil, nil
|
blob, _ := rlp.EncodeToBytes(txs[index])
|
||||||
|
return blob
|
||||||
}
|
}
|
||||||
|
|
||||||
// newRPCTransaction returns a transaction that will serialize to the RPC representation.
|
// newRPCTransactionFromBlockHash returns a transaction that will serialize to the RPC representation.
|
||||||
func newRPCTransaction(b *types.Block, hash common.Hash) (*RPCTransaction, error) {
|
func newRPCTransactionFromBlockHash(b *types.Block, hash common.Hash) *RPCTransaction {
|
||||||
for idx, tx := range b.Transactions() {
|
for idx, tx := range b.Transactions() {
|
||||||
if tx.Hash() == hash {
|
if tx.Hash() == hash {
|
||||||
return newRPCTransactionFromBlockIndex(b, uint(idx))
|
return newRPCTransactionFromBlockIndex(b, uint64(idx))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// PublicTransactionPoolAPI exposes methods for the RPC interface
|
// PublicTransactionPoolAPI exposes methods for the RPC interface
|
||||||
|
|
@ -913,35 +905,35 @@ func (s *PublicTransactionPoolAPI) GetBlockTransactionCountByHash(ctx context.Co
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTransactionByBlockNumberAndIndex returns the transaction for the given block number and index.
|
// GetTransactionByBlockNumberAndIndex returns the transaction for the given block number and index.
|
||||||
func (s *PublicTransactionPoolAPI) GetTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) (*RPCTransaction, error) {
|
func (s *PublicTransactionPoolAPI) GetTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) *RPCTransaction {
|
||||||
if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {
|
if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {
|
||||||
return newRPCTransactionFromBlockIndex(block, uint(index))
|
return newRPCTransactionFromBlockIndex(block, uint64(index))
|
||||||
}
|
}
|
||||||
return nil, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTransactionByBlockHashAndIndex returns the transaction for the given block hash and index.
|
// GetTransactionByBlockHashAndIndex returns the transaction for the given block hash and index.
|
||||||
func (s *PublicTransactionPoolAPI) GetTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) (*RPCTransaction, error) {
|
func (s *PublicTransactionPoolAPI) GetTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) *RPCTransaction {
|
||||||
if block, _ := s.b.GetBlock(ctx, blockHash); block != nil {
|
if block, _ := s.b.GetBlock(ctx, blockHash); block != nil {
|
||||||
return newRPCTransactionFromBlockIndex(block, uint(index))
|
return newRPCTransactionFromBlockIndex(block, uint64(index))
|
||||||
}
|
}
|
||||||
return nil, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRawTransactionByBlockNumberAndIndex returns the bytes of the transaction for the given block number and index.
|
// GetRawTransactionByBlockNumberAndIndex returns the bytes of the transaction for the given block number and index.
|
||||||
func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) (hexutil.Bytes, error) {
|
func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) hexutil.Bytes {
|
||||||
if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {
|
if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {
|
||||||
return newRPCRawTransactionFromBlockIndex(block, uint(index))
|
return newRPCRawTransactionFromBlockIndex(block, uint64(index))
|
||||||
}
|
}
|
||||||
return nil, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRawTransactionByBlockHashAndIndex returns the bytes of the transaction for the given block hash and index.
|
// GetRawTransactionByBlockHashAndIndex returns the bytes of the transaction for the given block hash and index.
|
||||||
func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) (hexutil.Bytes, error) {
|
func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) hexutil.Bytes {
|
||||||
if block, _ := s.b.GetBlock(ctx, blockHash); block != nil {
|
if block, _ := s.b.GetBlock(ctx, blockHash); block != nil {
|
||||||
return newRPCRawTransactionFromBlockIndex(block, uint(index))
|
return newRPCRawTransactionFromBlockIndex(block, uint64(index))
|
||||||
}
|
}
|
||||||
return nil, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTransactionCount returns the number of transactions the given address has sent for the given block number
|
// GetTransactionCount returns the number of transactions the given address has sent for the given block number
|
||||||
|
|
@ -955,20 +947,17 @@ func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, addr
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTransactionByHash returns the transaction for the given hash
|
// GetTransactionByHash returns the transaction for the given hash
|
||||||
func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) (*RPCTransaction, error) {
|
func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) *RPCTransaction {
|
||||||
// Try to return an already finalized transaction
|
// Try to return an already finalized transaction
|
||||||
if blockHash, _, index := core.GetLookupEntry(s.b.ChainDb(), hash); blockHash != (common.Hash{}) {
|
if tx, blockHash, blockNumber, index := core.GetTransaction(s.b.ChainDb(), hash); tx != nil {
|
||||||
if block, _ := s.b.GetBlock(ctx, blockHash); block != nil {
|
return newRPCTransaction(tx, blockHash, blockNumber, index)
|
||||||
return newRPCTransactionFromBlockIndex(block, uint(index))
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
// No finalized transaction, try to retrieve it from the pool
|
// No finalized transaction, try to retrieve it from the pool
|
||||||
if tx := s.b.GetPoolTransaction(hash); tx != nil {
|
if tx := s.b.GetPoolTransaction(hash); tx != nil {
|
||||||
return newRPCPendingTransaction(tx), nil
|
return newRPCPendingTransaction(tx)
|
||||||
}
|
}
|
||||||
// Transaction unknown, return as such
|
// Transaction unknown, return as such
|
||||||
return nil, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRawTransactionByHash returns the bytes of the transaction for the given hash.
|
// GetRawTransactionByHash returns the bytes of the transaction for the given hash.
|
||||||
|
|
@ -988,11 +977,11 @@ func (s *PublicTransactionPoolAPI) GetRawTransactionByHash(ctx context.Context,
|
||||||
|
|
||||||
// GetTransactionReceipt returns the transaction receipt for the given transaction hash.
|
// GetTransactionReceipt returns the transaction receipt for the given transaction hash.
|
||||||
func (s *PublicTransactionPoolAPI) GetTransactionReceipt(hash common.Hash) (map[string]interface{}, error) {
|
func (s *PublicTransactionPoolAPI) GetTransactionReceipt(hash common.Hash) (map[string]interface{}, error) {
|
||||||
receipt, blockHash, blockNumber, index := core.GetReceipt(s.b.ChainDb(), hash)
|
tx, blockHash, blockNumber, index := core.GetTransaction(s.b.ChainDb(), hash)
|
||||||
if receipt == nil {
|
if tx == nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
tx, _, _, _ := core.GetTransaction(s.b.ChainDb(), hash)
|
receipt, _, _, _ := core.GetReceipt(s.b.ChainDb(), hash) // Old receipts don't have the lookup data available
|
||||||
|
|
||||||
var signer types.Signer = types.FrontierSigner{}
|
var signer types.Signer = types.FrontierSigner{}
|
||||||
if tx.Protected() {
|
if tx.Protected() {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue