Forráskód Böngészése

Merge pull request #1423 from obscuren/gasused-receipt-fix

core, eth, rpc: proper gas used. Closes #1422
Jeffrey Wilcke 10 éve
szülő
commit
d764bd0584

+ 1 - 0
core/block_processor.go

@@ -82,6 +82,7 @@ func (self *BlockProcessor) ApplyTransaction(coinbase *state.StateObject, stated
 	usedGas.Add(usedGas, gas)
 	receipt := types.NewReceipt(statedb.Root().Bytes(), usedGas)
 	receipt.TxHash = tx.Hash()
+	receipt.GasUsed = new(big.Int).Set(gas)
 	if MessageCreatesContract(tx) {
 		from, _ := tx.From()
 		receipt.ContractAddress = crypto.CreateAddress(from, tx.Nonce())

+ 1 - 1
core/transaction_util.go

@@ -64,7 +64,7 @@ func GetReceipt(db common.Database, txHash common.Hash) *types.Receipt {
 	var receipt types.Receipt
 	err := rlp.DecodeBytes(data, &receipt)
 	if err != nil {
-		glog.V(logger.Error).Infoln("GetReceipt err:", err)
+		glog.V(logger.Core).Infoln("GetReceipt err:", err)
 	}
 	return &receipt
 }

+ 4 - 2
core/types/receipt.go

@@ -18,6 +18,7 @@ type Receipt struct {
 	TxHash            common.Hash
 	ContractAddress   common.Address
 	logs              state.Logs
+	GasUsed           *big.Int
 }
 
 func NewReceipt(root []byte, cumalativeGasUsed *big.Int) *Receipt {
@@ -44,11 +45,12 @@ func (self *Receipt) DecodeRLP(s *rlp.Stream) error {
 		TxHash            common.Hash
 		ContractAddress   common.Address
 		Logs              state.Logs
+		GasUsed           *big.Int
 	}
 	if err := s.Decode(&r); err != nil {
 		return err
 	}
-	self.PostState, self.CumulativeGasUsed, self.Bloom, self.TxHash, self.ContractAddress, self.logs = r.PostState, r.CumulativeGasUsed, r.Bloom, r.TxHash, r.ContractAddress, r.Logs
+	self.PostState, self.CumulativeGasUsed, self.Bloom, self.TxHash, self.ContractAddress, self.logs, self.GasUsed = r.PostState, r.CumulativeGasUsed, r.Bloom, r.TxHash, r.ContractAddress, r.Logs, r.GasUsed
 
 	return nil
 }
@@ -60,7 +62,7 @@ func (self *ReceiptForStorage) EncodeRLP(w io.Writer) error {
 	for i, log := range self.logs {
 		storageLogs[i] = (*state.LogForStorage)(log)
 	}
-	return rlp.Encode(w, []interface{}{self.PostState, self.CumulativeGasUsed, self.Bloom, self.TxHash, self.ContractAddress, storageLogs})
+	return rlp.Encode(w, []interface{}{self.PostState, self.CumulativeGasUsed, self.Bloom, self.TxHash, self.ContractAddress, storageLogs, self.GasUsed})
 }
 
 func (self *Receipt) RlpEncode() []byte {

+ 3 - 1
eth/gasprice.go

@@ -134,7 +134,9 @@ func (self *GasPriceOracle) lowestPrice(block *types.Block) *big.Int {
 
 	receipts := self.eth.BlockProcessor().GetBlockReceipts(block.Hash())
 	if len(receipts) > 0 {
-		gasUsed = receipts[len(receipts)-1].CumulativeGasUsed
+		if cgu := receipts[len(receipts)-1].CumulativeGasUsed; cgu != nil {
+			gasUsed = receipts[len(receipts)-1].CumulativeGasUsed
+		}
 	}
 
 	if new(big.Int).Mul(gasUsed, big.NewInt(100)).Cmp(new(big.Int).Mul(block.GasLimit(),

+ 0 - 1
rpc/api/eth.go

@@ -615,7 +615,6 @@ func (self *ethApi) GetTransactionReceipt(req *shared.Request) (interface{}, err
 		v := NewReceiptRes(rec)
 		v.BlockHash = newHexData(bhash)
 		v.BlockNumber = newHexNum(bnum)
-		v.GasUsed = newHexNum(tx.Gas().Bytes())
 		v.TransactionIndex = newHexNum(txi)
 		return v, nil
 	}

+ 4 - 4
rpc/api/parsing.go

@@ -421,11 +421,11 @@ func NewReceiptRes(rec *types.Receipt) *ReceiptRes {
 
 	var v = new(ReceiptRes)
 	v.TransactionHash = newHexData(rec.TxHash)
-	// v.TransactionIndex = newHexNum(input)
-	// v.BlockNumber = newHexNum(input)
-	// v.BlockHash = newHexData(input)
+	if rec.GasUsed != nil {
+		v.GasUsed = newHexNum(rec.GasUsed.Bytes())
+	}
 	v.CumulativeGasUsed = newHexNum(rec.CumulativeGasUsed)
-	// v.GasUsed = newHexNum(input)
+
 	// If the ContractAddress is 20 0x0 bytes, assume it is not a contract creation
 	if bytes.Compare(rec.ContractAddress.Bytes(), bytes.Repeat([]byte{0}, 20)) != 0 {
 		v.ContractAddress = newHexData(rec.ContractAddress)