core/types: fix cummulative gas bug and legacy decoding tests

This commit is contained in:
gary rong 2019-04-15 13:15:05 +03:00 committed by Péter Szilágyi
parent 7221cb1434
commit ce9a289fa4
No known key found for this signature in database
GPG Key ID: E9AE538CEDF8293D
2 changed files with 36 additions and 22 deletions

View File

@ -265,7 +265,7 @@ func decodeV3StoredReceiptRLP(r *ReceiptForStorage, blob []byte) error {
if err := (*Receipt)(r).setStatus(stored.PostStateOrStatus); err != nil { if err := (*Receipt)(r).setStatus(stored.PostStateOrStatus); err != nil {
return err return err
} }
r.CumulativeGasUsed = stored.GasUsed r.CumulativeGasUsed = stored.CumulativeGasUsed
r.Bloom = stored.Bloom r.Bloom = stored.Bloom
r.TxHash = stored.TxHash r.TxHash = stored.TxHash
r.ContractAddress = stored.ContractAddress r.ContractAddress = stored.ContractAddress

View File

@ -18,10 +18,9 @@ package types
import ( import (
"bytes" "bytes"
"encoding/hex"
"encoding/json"
"math" "math"
"math/big" "math/big"
"reflect"
"testing" "testing"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
@ -54,8 +53,16 @@ func TestLegacyReceiptDecoding(t *testing.T) {
Status: ReceiptStatusFailed, Status: ReceiptStatusFailed,
CumulativeGasUsed: 1, CumulativeGasUsed: 1,
Logs: []*Log{ Logs: []*Log{
{Address: common.BytesToAddress([]byte{0x11})}, {
{Address: common.BytesToAddress([]byte{0x01, 0x11})}, Address: common.BytesToAddress([]byte{0x11}),
Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")},
Data: []byte{0x01, 0x00, 0xff},
},
{
Address: common.BytesToAddress([]byte{0x01, 0x11}),
Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")},
Data: []byte{0x01, 0x00, 0xff},
},
}, },
TxHash: tx.Hash(), TxHash: tx.Hash(),
ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}),
@ -63,30 +70,39 @@ func TestLegacyReceiptDecoding(t *testing.T) {
} }
receipt.Bloom = CreateBloom(Receipts{receipt}) receipt.Bloom = CreateBloom(Receipts{receipt})
want, err := json.Marshal(receipt)
if err != nil {
t.Fatalf("Error encoding reference receipt to JSON: %v", err)
}
for _, tc := range tests { for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
enc, err := tc.encode(receipt) enc, err := tc.encode(receipt)
if err != nil { if err != nil {
t.Fatalf("Error encoding receipt: %v", err) t.Fatalf("Error encoding receipt: %v", err)
} }
var dec ReceiptForStorage var dec ReceiptForStorage
if err := rlp.DecodeBytes(enc, &dec); err != nil { if err := rlp.DecodeBytes(enc, &dec); err != nil {
t.Fatalf("Error decoding RLP receipt: %v", err) t.Fatalf("Error decoding RLP receipt: %v", err)
} }
// Check whether all consensus fields are correct.
have, err := rlp.EncodeToBytes((*Receipt)(receipt)) if dec.Status != receipt.Status {
if err != nil { t.Fatalf("Receipt status mismatch, want %v, have %v", receipt.Status, dec.Status)
t.Fatalf("Error encoding receipt: %v", err)
} }
if dec.CumulativeGasUsed != receipt.CumulativeGasUsed {
if !bytes.Equal(have, want) { t.Fatalf("Receipt CumulativeGasUsed mismatch, want %v, have %v", receipt.CumulativeGasUsed, dec.CumulativeGasUsed)
t.Fatalf("receipt mismatch: have %s, want %s", hex.EncodeToString(have), hex.EncodeToString(want)) }
if dec.Bloom != receipt.Bloom {
t.Fatalf("Bloom data mismatch, want %v, have %v", receipt.Bloom, dec.Bloom)
}
if len(dec.Logs) != len(receipt.Logs) {
t.Fatalf("Receipt log number mismatch, want %v, have %v", len(receipt.Logs), len(dec.Logs))
}
for i := 0; i < len(dec.Logs); i++ {
if dec.Logs[i].Address != receipt.Logs[i].Address {
t.Fatalf("Receipt log %d address mismatch, want %v, have %v", i, receipt.Logs[i].Address, dec.Logs[i].Address)
}
if !reflect.DeepEqual(dec.Logs[i].Topics, receipt.Logs[i].Topics) {
t.Fatalf("Receipt log %d topics mismatch, want %v, have %v", i, receipt.Logs[i].Topics, dec.Logs[i].Topics)
}
if !bytes.Equal(dec.Logs[i].Data, receipt.Logs[i].Data) {
t.Fatalf("Receipt log %d data mismatch, want %v, have %v", i, receipt.Logs[i].Data, dec.Logs[i].Data)
}
} }
}) })
} }
@ -136,7 +152,7 @@ func encodeAsV3StoredReceiptRLP(want *Receipt) ([]byte, error) {
} }
// Tests that receipt data can be correctly derived from the contextual infos // Tests that receipt data can be correctly derived from the contextual infos
func TestSetReceiptsData(t *testing.T) { func TestDeriveFields(t *testing.T) {
// Create a few transactions to have receipts for // Create a few transactions to have receipts for
txs := Transactions{ txs := Transactions{
NewContractCreation(1, big.NewInt(1), 1, big.NewInt(1), nil), NewContractCreation(1, big.NewInt(1), 1, big.NewInt(1), nil),
@ -167,8 +183,6 @@ func TestSetReceiptsData(t *testing.T) {
GasUsed: 2, GasUsed: 2,
}, },
} }
receipts[1].Bloom = CreateBloom(Receipts{receipts[1]})
// Clear all the computed fields and re-derive them // Clear all the computed fields and re-derive them
number := big.NewInt(1) number := big.NewInt(1)
hash := common.BytesToHash([]byte{0x03, 0x14}) hash := common.BytesToHash([]byte{0x03, 0x14})
@ -198,7 +212,7 @@ func TestSetReceiptsData(t *testing.T) {
t.Errorf("receipts[%d].GasUsed = %d, want %d", i, receipts[i].GasUsed, txs[i].Gas()) t.Errorf("receipts[%d].GasUsed = %d, want %d", i, receipts[i].GasUsed, txs[i].Gas())
} }
if txs[i].To() != nil && receipts[i].ContractAddress != (common.Address{}) { if txs[i].To() != nil && receipts[i].ContractAddress != (common.Address{}) {
t.Errorf("receipts[%d].ContractAddress = %s, want %s", i, receipts[i].ContractAddress, (common.Address{}).String()) t.Errorf("receipts[%d].ContractAddress = %s, want %s", i, receipts[i].ContractAddress.String(), (common.Address{}).String())
} }
from, _ := Sender(signer, txs[i]) from, _ := Sender(signer, txs[i])
contractAddress := crypto.CreateAddress(from, txs[i].Nonce()) contractAddress := crypto.CreateAddress(from, txs[i].Nonce())