|
|
|
@ -22,6 +22,7 @@ import ( |
|
|
|
|
"math" |
|
|
|
|
"math/big" |
|
|
|
|
"reflect" |
|
|
|
|
"sync" |
|
|
|
|
"testing" |
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
@ -154,153 +155,160 @@ var ( |
|
|
|
|
blockNumber = big.NewInt(1) |
|
|
|
|
blockTime = uint64(2) |
|
|
|
|
blockHash = common.BytesToHash([]byte{0x03, 0x14}) |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// Create the corresponding receipts
|
|
|
|
|
receipts = Receipts{ |
|
|
|
|
&Receipt{ |
|
|
|
|
Status: ReceiptStatusFailed, |
|
|
|
|
CumulativeGasUsed: 1, |
|
|
|
|
Logs: []*Log{ |
|
|
|
|
{ |
|
|
|
|
Address: common.BytesToAddress([]byte{0x11}), |
|
|
|
|
Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, |
|
|
|
|
// derived fields:
|
|
|
|
|
BlockNumber: blockNumber.Uint64(), |
|
|
|
|
TxHash: txs[0].Hash(), |
|
|
|
|
TxIndex: 0, |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
Index: 0, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Address: common.BytesToAddress([]byte{0x01, 0x11}), |
|
|
|
|
Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, |
|
|
|
|
// derived fields:
|
|
|
|
|
BlockNumber: blockNumber.Uint64(), |
|
|
|
|
TxHash: txs[0].Hash(), |
|
|
|
|
TxIndex: 0, |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
Index: 1, |
|
|
|
|
var receiptsOnce sync.Once |
|
|
|
|
var testReceipts Receipts |
|
|
|
|
|
|
|
|
|
func getTestReceipts() Receipts { |
|
|
|
|
|
|
|
|
|
// Compute the blooms only once
|
|
|
|
|
receiptsOnce.Do(func() { |
|
|
|
|
// Create the corresponding receipts
|
|
|
|
|
r := Receipts{ |
|
|
|
|
&Receipt{ |
|
|
|
|
Status: ReceiptStatusFailed, |
|
|
|
|
CumulativeGasUsed: 1, |
|
|
|
|
Logs: []*Log{ |
|
|
|
|
{ |
|
|
|
|
Address: common.BytesToAddress([]byte{0x11}), |
|
|
|
|
Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, |
|
|
|
|
// derived fields:
|
|
|
|
|
BlockNumber: blockNumber.Uint64(), |
|
|
|
|
TxHash: txs[0].Hash(), |
|
|
|
|
TxIndex: 0, |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
Index: 0, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Address: common.BytesToAddress([]byte{0x01, 0x11}), |
|
|
|
|
Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, |
|
|
|
|
// derived fields:
|
|
|
|
|
BlockNumber: blockNumber.Uint64(), |
|
|
|
|
TxHash: txs[0].Hash(), |
|
|
|
|
TxIndex: 0, |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
Index: 1, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[0].Hash(), |
|
|
|
|
ContractAddress: common.HexToAddress("0x5a443704dd4b594b382c22a083e2bd3090a6fef3"), |
|
|
|
|
GasUsed: 1, |
|
|
|
|
EffectiveGasPrice: big.NewInt(11), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 0, |
|
|
|
|
}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[0].Hash(), |
|
|
|
|
ContractAddress: common.HexToAddress("0x5a443704dd4b594b382c22a083e2bd3090a6fef3"), |
|
|
|
|
GasUsed: 1, |
|
|
|
|
EffectiveGasPrice: big.NewInt(11), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 0, |
|
|
|
|
}, |
|
|
|
|
&Receipt{ |
|
|
|
|
PostState: common.Hash{2}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 3, |
|
|
|
|
Logs: []*Log{ |
|
|
|
|
{ |
|
|
|
|
Address: common.BytesToAddress([]byte{0x22}), |
|
|
|
|
Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, |
|
|
|
|
// derived fields:
|
|
|
|
|
BlockNumber: blockNumber.Uint64(), |
|
|
|
|
TxHash: txs[1].Hash(), |
|
|
|
|
TxIndex: 1, |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
Index: 2, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Address: common.BytesToAddress([]byte{0x02, 0x22}), |
|
|
|
|
Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, |
|
|
|
|
// derived fields:
|
|
|
|
|
BlockNumber: blockNumber.Uint64(), |
|
|
|
|
TxHash: txs[1].Hash(), |
|
|
|
|
TxIndex: 1, |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
Index: 3, |
|
|
|
|
&Receipt{ |
|
|
|
|
PostState: common.Hash{2}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 3, |
|
|
|
|
Logs: []*Log{ |
|
|
|
|
{ |
|
|
|
|
Address: common.BytesToAddress([]byte{0x22}), |
|
|
|
|
Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, |
|
|
|
|
// derived fields:
|
|
|
|
|
BlockNumber: blockNumber.Uint64(), |
|
|
|
|
TxHash: txs[1].Hash(), |
|
|
|
|
TxIndex: 1, |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
Index: 2, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
Address: common.BytesToAddress([]byte{0x02, 0x22}), |
|
|
|
|
Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, |
|
|
|
|
// derived fields:
|
|
|
|
|
BlockNumber: blockNumber.Uint64(), |
|
|
|
|
TxHash: txs[1].Hash(), |
|
|
|
|
TxIndex: 1, |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
Index: 3, |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[1].Hash(), |
|
|
|
|
GasUsed: 2, |
|
|
|
|
EffectiveGasPrice: big.NewInt(22), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 1, |
|
|
|
|
}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[1].Hash(), |
|
|
|
|
GasUsed: 2, |
|
|
|
|
EffectiveGasPrice: big.NewInt(22), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 1, |
|
|
|
|
}, |
|
|
|
|
&Receipt{ |
|
|
|
|
Type: AccessListTxType, |
|
|
|
|
PostState: common.Hash{3}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 6, |
|
|
|
|
Logs: []*Log{}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[2].Hash(), |
|
|
|
|
GasUsed: 3, |
|
|
|
|
EffectiveGasPrice: big.NewInt(33), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 2, |
|
|
|
|
}, |
|
|
|
|
&Receipt{ |
|
|
|
|
Type: DynamicFeeTxType, |
|
|
|
|
PostState: common.Hash{4}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 10, |
|
|
|
|
Logs: []*Log{}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[3].Hash(), |
|
|
|
|
GasUsed: 4, |
|
|
|
|
EffectiveGasPrice: big.NewInt(1044), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 3, |
|
|
|
|
}, |
|
|
|
|
&Receipt{ |
|
|
|
|
Type: DynamicFeeTxType, |
|
|
|
|
PostState: common.Hash{5}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 15, |
|
|
|
|
Logs: []*Log{}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[4].Hash(), |
|
|
|
|
GasUsed: 5, |
|
|
|
|
EffectiveGasPrice: big.NewInt(1055), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 4, |
|
|
|
|
}, |
|
|
|
|
&Receipt{ |
|
|
|
|
Type: BlobTxType, |
|
|
|
|
PostState: common.Hash{6}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 21, |
|
|
|
|
Logs: []*Log{}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[5].Hash(), |
|
|
|
|
GasUsed: 6, |
|
|
|
|
EffectiveGasPrice: big.NewInt(1066), |
|
|
|
|
BlobGasUsed: params.BlobTxBlobGasPerBlob, |
|
|
|
|
BlobGasPrice: big.NewInt(920), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 5, |
|
|
|
|
}, |
|
|
|
|
&Receipt{ |
|
|
|
|
Type: BlobTxType, |
|
|
|
|
PostState: common.Hash{7}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 28, |
|
|
|
|
Logs: []*Log{}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[6].Hash(), |
|
|
|
|
GasUsed: 7, |
|
|
|
|
EffectiveGasPrice: big.NewInt(1077), |
|
|
|
|
BlobGasUsed: 3 * params.BlobTxBlobGasPerBlob, |
|
|
|
|
BlobGasPrice: big.NewInt(920), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 6, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func init() { |
|
|
|
|
// Correctly compute the bloom filters
|
|
|
|
|
for _, receipt := range receipts { |
|
|
|
|
receipt.Bloom = CreateBloom(Receipts{receipt}) |
|
|
|
|
} |
|
|
|
|
&Receipt{ |
|
|
|
|
Type: AccessListTxType, |
|
|
|
|
PostState: common.Hash{3}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 6, |
|
|
|
|
Logs: []*Log{}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[2].Hash(), |
|
|
|
|
GasUsed: 3, |
|
|
|
|
EffectiveGasPrice: big.NewInt(33), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 2, |
|
|
|
|
}, |
|
|
|
|
&Receipt{ |
|
|
|
|
Type: DynamicFeeTxType, |
|
|
|
|
PostState: common.Hash{4}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 10, |
|
|
|
|
Logs: []*Log{}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[3].Hash(), |
|
|
|
|
GasUsed: 4, |
|
|
|
|
EffectiveGasPrice: big.NewInt(1044), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 3, |
|
|
|
|
}, |
|
|
|
|
&Receipt{ |
|
|
|
|
Type: DynamicFeeTxType, |
|
|
|
|
PostState: common.Hash{5}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 15, |
|
|
|
|
Logs: []*Log{}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[4].Hash(), |
|
|
|
|
GasUsed: 5, |
|
|
|
|
EffectiveGasPrice: big.NewInt(1055), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 4, |
|
|
|
|
}, |
|
|
|
|
&Receipt{ |
|
|
|
|
Type: BlobTxType, |
|
|
|
|
PostState: common.Hash{6}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 21, |
|
|
|
|
Logs: []*Log{}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[5].Hash(), |
|
|
|
|
GasUsed: 6, |
|
|
|
|
EffectiveGasPrice: big.NewInt(1066), |
|
|
|
|
BlobGasUsed: params.BlobTxBlobGasPerBlob, |
|
|
|
|
BlobGasPrice: big.NewInt(920), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 5, |
|
|
|
|
}, |
|
|
|
|
&Receipt{ |
|
|
|
|
Type: BlobTxType, |
|
|
|
|
PostState: common.Hash{7}.Bytes(), |
|
|
|
|
CumulativeGasUsed: 28, |
|
|
|
|
Logs: []*Log{}, |
|
|
|
|
// derived fields:
|
|
|
|
|
TxHash: txs[6].Hash(), |
|
|
|
|
GasUsed: 7, |
|
|
|
|
EffectiveGasPrice: big.NewInt(1077), |
|
|
|
|
BlobGasUsed: 3 * params.BlobTxBlobGasPerBlob, |
|
|
|
|
BlobGasPrice: big.NewInt(920), |
|
|
|
|
BlockHash: blockHash, |
|
|
|
|
BlockNumber: blockNumber, |
|
|
|
|
TransactionIndex: 6, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
for _, receipt := range r { |
|
|
|
|
receipt.Bloom = CreateBloom(Receipts{receipt}) |
|
|
|
|
} |
|
|
|
|
testReceipts = r |
|
|
|
|
}) |
|
|
|
|
return testReceipts |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestDecodeEmptyTypedReceipt(t *testing.T) { |
|
|
|
@ -317,6 +325,7 @@ func TestDeriveFields(t *testing.T) { |
|
|
|
|
// Re-derive receipts.
|
|
|
|
|
basefee := big.NewInt(1000) |
|
|
|
|
blobGasPrice := big.NewInt(920) |
|
|
|
|
receipts := getTestReceipts() |
|
|
|
|
derivedReceipts := clearComputedFieldsOnReceipts(receipts) |
|
|
|
|
err := Receipts(derivedReceipts).DeriveFields(params.TestChainConfig, blockHash, blockNumber.Uint64(), blockTime, basefee, blobGasPrice, txs) |
|
|
|
|
if err != nil { |
|
|
|
@ -342,6 +351,7 @@ func TestDeriveFields(t *testing.T) { |
|
|
|
|
// Test that we can marshal/unmarshal receipts to/from json without errors.
|
|
|
|
|
// This also confirms that our test receipts contain all the required fields.
|
|
|
|
|
func TestReceiptJSON(t *testing.T) { |
|
|
|
|
receipts := getTestReceipts() |
|
|
|
|
for i := range receipts { |
|
|
|
|
b, err := receipts[i].MarshalJSON() |
|
|
|
|
if err != nil { |
|
|
|
@ -358,6 +368,7 @@ func TestReceiptJSON(t *testing.T) { |
|
|
|
|
// Test we can still parse receipt without EffectiveGasPrice for backwards compatibility, even
|
|
|
|
|
// though it is required per the spec.
|
|
|
|
|
func TestEffectiveGasPriceNotRequired(t *testing.T) { |
|
|
|
|
receipts := getTestReceipts() |
|
|
|
|
r := *receipts[0] |
|
|
|
|
r.EffectiveGasPrice = nil |
|
|
|
|
b, err := r.MarshalJSON() |
|
|
|
|