Skip to content

Commit

Permalink
core, eth, rpc: proper gas used. Closes ethereum#1417
Browse files Browse the repository at this point in the history
Added some additional backward compatibility code for old receipts
  • Loading branch information
obscuren committed Jul 6, 2015
1 parent 4c30f0f commit 666a7dd
Show file tree
Hide file tree
Showing 6 changed files with 13 additions and 9 deletions.
1 change: 1 addition & 0 deletions core/block_processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
2 changes: 1 addition & 1 deletion core/transaction_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
6 changes: 4 additions & 2 deletions core/types/receipt.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
}
Expand All @@ -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 {
Expand Down
4 changes: 3 additions & 1 deletion eth/gasprice.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
1 change: 0 additions & 1 deletion rpc/api/eth.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
8 changes: 4 additions & 4 deletions rpc/api/parsing.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 666a7dd

Please sign in to comment.