aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/blockchain.go5
-rw-r--r--core/rawdb/accessors_chain.go3
-rw-r--r--core/state/statedb.go10
-rw-r--r--core/state_processor.go3
-rw-r--r--core/types/gen_receipt_json.go19
-rw-r--r--core/types/gen_tx_json.go2
-rw-r--r--core/types/receipt.go14
-rw-r--r--miner/worker.go5
8 files changed, 59 insertions, 2 deletions
diff --git a/core/blockchain.go b/core/blockchain.go
index b3cf09d61..745f67d8c 100644
--- a/core/blockchain.go
+++ b/core/blockchain.go
@@ -810,6 +810,11 @@ func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts ty
// The transaction hash can be retrieved from the transaction itself
receipts[j].TxHash = transactions[j].Hash()
+ // block location fields
+ receipts[j].BlockHash = block.Hash()
+ receipts[j].BlockNumber = block.Number()
+ receipts[j].TransactionIndex = uint(j)
+
// The contract address can be derived from the transaction itself
if transactions[j].To() == nil {
// Deriving the signer is expensive, only do if it's actually needed
diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go
index 10f3ba00f..647839997 100644
--- a/core/rawdb/accessors_chain.go
+++ b/core/rawdb/accessors_chain.go
@@ -325,6 +325,9 @@ func ReadReceipts(db ethdb.Reader, hash common.Hash, number uint64) types.Receip
logIndex += 1
}
receipts[i] = (*types.Receipt)(receipt)
+ receipts[i].BlockHash = hash
+ receipts[i].BlockNumber = big.NewInt(0).SetUint64(number)
+ receipts[i].TransactionIndex = uint(i)
}
return receipts
}
diff --git a/core/state/statedb.go b/core/state/statedb.go
index a299cdb64..db2e0d5e0 100644
--- a/core/state/statedb.go
+++ b/core/state/statedb.go
@@ -237,6 +237,16 @@ func (self *StateDB) GetNonce(addr common.Address) uint64 {
return 0
}
+// TxIndex returns the current transaction index set by Prepare.
+func (self *StateDB) TxIndex() int {
+ return self.txIndex
+}
+
+// BlockHash returns the current block hash set by Prepare.
+func (self *StateDB) BlockHash() common.Hash {
+ return self.bhash
+}
+
func (self *StateDB) GetCode(addr common.Address) []byte {
stateObject := self.getStateObject(addr)
if stateObject != nil {
diff --git a/core/state_processor.go b/core/state_processor.go
index 503a35d16..6f2a45120 100644
--- a/core/state_processor.go
+++ b/core/state_processor.go
@@ -121,6 +121,9 @@ func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *commo
// Set the receipt logs and create a bloom for filtering
receipt.Logs = statedb.GetLogs(tx.Hash())
receipt.Bloom = types.CreateBloom(types.Receipts{receipt})
+ receipt.BlockHash = statedb.BlockHash()
+ receipt.BlockNumber = header.Number
+ receipt.TransactionIndex = uint(statedb.TxIndex())
return receipt, gas, err
}
diff --git a/core/types/gen_receipt_json.go b/core/types/gen_receipt_json.go
index 5c807a4cc..790ed65b5 100644
--- a/core/types/gen_receipt_json.go
+++ b/core/types/gen_receipt_json.go
@@ -5,6 +5,7 @@ package types
import (
"encoding/json"
"errors"
+ "math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
@@ -23,6 +24,9 @@ func (r Receipt) MarshalJSON() ([]byte, error) {
TxHash common.Hash `json:"transactionHash" gencodec:"required"`
ContractAddress common.Address `json:"contractAddress"`
GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"`
+ BlockHash common.Hash `json:"blockHash,omitempty"`
+ BlockNumber *hexutil.Big `json:"blockNumber,omitempty"`
+ TransactionIndex hexutil.Uint `json:"transactionIndex"`
}
var enc Receipt
enc.PostState = r.PostState
@@ -33,6 +37,9 @@ func (r Receipt) MarshalJSON() ([]byte, error) {
enc.TxHash = r.TxHash
enc.ContractAddress = r.ContractAddress
enc.GasUsed = hexutil.Uint64(r.GasUsed)
+ enc.BlockHash = r.BlockHash
+ enc.BlockNumber = (*hexutil.Big)(r.BlockNumber)
+ enc.TransactionIndex = hexutil.Uint(r.TransactionIndex)
return json.Marshal(&enc)
}
@@ -47,6 +54,9 @@ func (r *Receipt) UnmarshalJSON(input []byte) error {
TxHash *common.Hash `json:"transactionHash" gencodec:"required"`
ContractAddress *common.Address `json:"contractAddress"`
GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"`
+ BlockHash *common.Hash `json:"blockHash,omitempty"`
+ BlockNumber *hexutil.Big `json:"blockNumber,omitempty"`
+ TransactionIndex *hexutil.Uint `json:"transactionIndex"`
}
var dec Receipt
if err := json.Unmarshal(input, &dec); err != nil {
@@ -81,5 +91,14 @@ func (r *Receipt) UnmarshalJSON(input []byte) error {
return errors.New("missing required field 'gasUsed' for Receipt")
}
r.GasUsed = uint64(*dec.GasUsed)
+ if dec.BlockHash != nil {
+ r.BlockHash = *dec.BlockHash
+ }
+ if dec.BlockNumber != nil {
+ r.BlockNumber = (*big.Int)(dec.BlockNumber)
+ }
+ if dec.TransactionIndex != nil {
+ r.TransactionIndex = uint(*dec.TransactionIndex)
+ }
return nil
}
diff --git a/core/types/gen_tx_json.go b/core/types/gen_tx_json.go
index c27da6709..e676058ec 100644
--- a/core/types/gen_tx_json.go
+++ b/core/types/gen_tx_json.go
@@ -13,6 +13,7 @@ import (
var _ = (*txdataMarshaling)(nil)
+// MarshalJSON marshals as JSON.
func (t txdata) MarshalJSON() ([]byte, error) {
type txdata struct {
AccountNonce hexutil.Uint64 `json:"nonce" gencodec:"required"`
@@ -40,6 +41,7 @@ func (t txdata) MarshalJSON() ([]byte, error) {
return json.Marshal(&enc)
}
+// UnmarshalJSON unmarshals from JSON.
func (t *txdata) UnmarshalJSON(input []byte) error {
type txdata struct {
AccountNonce *hexutil.Uint64 `json:"nonce" gencodec:"required"`
diff --git a/core/types/receipt.go b/core/types/receipt.go
index 0ba2f6e99..72d85a1e8 100644
--- a/core/types/receipt.go
+++ b/core/types/receipt.go
@@ -20,6 +20,7 @@ import (
"bytes"
"fmt"
"io"
+ "math/big"
"unsafe"
"github.com/ethereum/go-ethereum/common"
@@ -44,17 +45,24 @@ const (
// Receipt represents the results of a transaction.
type Receipt struct {
- // Consensus fields
+ // Consensus fields: These fields are defined by the Yellow Paper
PostState []byte `json:"root"`
Status uint64 `json:"status"`
CumulativeGasUsed uint64 `json:"cumulativeGasUsed" gencodec:"required"`
Bloom Bloom `json:"logsBloom" gencodec:"required"`
Logs []*Log `json:"logs" gencodec:"required"`
- // Implementation fields (don't reorder!)
+ // Implementation fields: These fields are added by geth when processing a transaction.
+ // They are stored in the chain database.
TxHash common.Hash `json:"transactionHash" gencodec:"required"`
ContractAddress common.Address `json:"contractAddress"`
GasUsed uint64 `json:"gasUsed" gencodec:"required"`
+
+ // Inclusion information: These fields provide information about the inclusion of the
+ // transaction corresponding to this receipt.
+ BlockHash common.Hash `json:"blockHash,omitempty"`
+ BlockNumber *big.Int `json:"blockNumber,omitempty"`
+ TransactionIndex uint `json:"transactionIndex"`
}
type receiptMarshaling struct {
@@ -62,6 +70,8 @@ type receiptMarshaling struct {
Status hexutil.Uint64
CumulativeGasUsed hexutil.Uint64
GasUsed hexutil.Uint64
+ BlockNumber *hexutil.Big
+ TransactionIndex hexutil.Uint
}
// receiptRLP is the consensus encoding of a receipt.
diff --git a/miner/worker.go b/miner/worker.go
index 48473796b..80c1771b6 100644
--- a/miner/worker.go
+++ b/miner/worker.go
@@ -566,6 +566,11 @@ func (w *worker) resultLoop() {
logs []*types.Log
)
for i, receipt := range task.receipts {
+ // add block location fields
+ receipt.BlockHash = hash
+ receipt.BlockNumber = block.Number()
+ receipt.TransactionIndex = uint(i)
+
receipts[i] = new(types.Receipt)
*receipts[i] = *receipt
// Update the block hash in all logs since it is now available and not when the