From ce9a289fa48e0d2593c4aaa7e207c8a5dd3eaa8a Mon Sep 17 00:00:00 2001
From: gary rong <garyrong0905@gmail.com>
Date: Mon, 15 Apr 2019 13:15:05 +0300
Subject: [PATCH] core/types: fix cummulative gas bug and legacy decoding tests

---
 core/types/receipt.go      |  2 +-
 core/types/receipt_test.go | 56 ++++++++++++++++++++++++--------------
 2 files changed, 36 insertions(+), 22 deletions(-)

diff --git a/core/types/receipt.go b/core/types/receipt.go
index 578daba3f..a96c7525e 100644
--- a/core/types/receipt.go
+++ b/core/types/receipt.go
@@ -265,7 +265,7 @@ func decodeV3StoredReceiptRLP(r *ReceiptForStorage, blob []byte) error {
 	if err := (*Receipt)(r).setStatus(stored.PostStateOrStatus); err != nil {
 		return err
 	}
-	r.CumulativeGasUsed = stored.GasUsed
+	r.CumulativeGasUsed = stored.CumulativeGasUsed
 	r.Bloom = stored.Bloom
 	r.TxHash = stored.TxHash
 	r.ContractAddress = stored.ContractAddress
diff --git a/core/types/receipt_test.go b/core/types/receipt_test.go
index 5af340b07..806b3dd2a 100644
--- a/core/types/receipt_test.go
+++ b/core/types/receipt_test.go
@@ -18,10 +18,9 @@ package types
 
 import (
 	"bytes"
-	"encoding/hex"
-	"encoding/json"
 	"math"
 	"math/big"
+	"reflect"
 	"testing"
 
 	"github.com/ethereum/go-ethereum/common"
@@ -54,8 +53,16 @@ func TestLegacyReceiptDecoding(t *testing.T) {
 		Status:            ReceiptStatusFailed,
 		CumulativeGasUsed: 1,
 		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(),
 		ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}),
@@ -63,30 +70,39 @@ func TestLegacyReceiptDecoding(t *testing.T) {
 	}
 	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 {
 		t.Run(tc.name, func(t *testing.T) {
 			enc, err := tc.encode(receipt)
 			if err != nil {
 				t.Fatalf("Error encoding receipt: %v", err)
 			}
-
 			var dec ReceiptForStorage
 			if err := rlp.DecodeBytes(enc, &dec); err != nil {
 				t.Fatalf("Error decoding RLP receipt: %v", err)
 			}
-
-			have, err := rlp.EncodeToBytes((*Receipt)(receipt))
-			if err != nil {
-				t.Fatalf("Error encoding receipt: %v", err)
+			// Check whether all consensus fields are correct.
+			if dec.Status != receipt.Status {
+				t.Fatalf("Receipt status mismatch, want %v, have %v", receipt.Status, dec.Status)
 			}
-
-			if !bytes.Equal(have, want) {
-				t.Fatalf("receipt mismatch: have %s, want %s", hex.EncodeToString(have), hex.EncodeToString(want))
+			if dec.CumulativeGasUsed != receipt.CumulativeGasUsed {
+				t.Fatalf("Receipt CumulativeGasUsed mismatch, want %v, have %v", receipt.CumulativeGasUsed, dec.CumulativeGasUsed)
+			}
+			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
-func TestSetReceiptsData(t *testing.T) {
+func TestDeriveFields(t *testing.T) {
 	// Create a few transactions to have receipts for
 	txs := Transactions{
 		NewContractCreation(1, big.NewInt(1), 1, big.NewInt(1), nil),
@@ -167,8 +183,6 @@ func TestSetReceiptsData(t *testing.T) {
 			GasUsed:         2,
 		},
 	}
-	receipts[1].Bloom = CreateBloom(Receipts{receipts[1]})
-
 	// Clear all the computed fields and re-derive them
 	number := big.NewInt(1)
 	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())
 		}
 		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])
 		contractAddress := crypto.CreateAddress(from, txs[i].Nonce())
-- 
GitLab