From 40d36e15a48ed7c78d0b52a2fe2c97513af3352c Mon Sep 17 00:00:00 2001 From: rjl493456442 Date: Thu, 15 Jun 2017 21:46:57 +0800 Subject: [PATCH] core/types: add a `reverted` field in receipt --- .idea/vcs.xml | 6 ++++++ core/types/gen_receipt_json.go | 6 ++++++ core/types/receipt.go | 9 +++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 .idea/vcs.xml diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..35eb1ddfbb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/core/types/gen_receipt_json.go b/core/types/gen_receipt_json.go index edbd64ba4e..ce6cc0e7a1 100644 --- a/core/types/gen_receipt_json.go +++ b/core/types/gen_receipt_json.go @@ -20,6 +20,7 @@ func (r Receipt) MarshalJSON() ([]byte, error) { TxHash common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress common.Address `json:"contractAddress"` GasUsed *hexutil.Big `json:"gasUsed" gencodec:"required"` + Reverted bool `json:"reverted" gencode:"required"` } var enc Receipt enc.PostState = r.PostState @@ -29,6 +30,7 @@ func (r Receipt) MarshalJSON() ([]byte, error) { enc.TxHash = r.TxHash enc.ContractAddress = r.ContractAddress enc.GasUsed = (*hexutil.Big)(r.GasUsed) + enc.Reverted = r.Reverted return json.Marshal(&enc) } @@ -41,6 +43,7 @@ func (r *Receipt) UnmarshalJSON(input []byte) error { TxHash *common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress *common.Address `json:"contractAddress"` GasUsed *hexutil.Big `json:"gasUsed" gencodec:"required"` + Reverted *bool `json:"reverted" gencode:"required"` } var dec Receipt if err := json.Unmarshal(input, &dec); err != nil { @@ -73,5 +76,8 @@ func (r *Receipt) UnmarshalJSON(input []byte) error { return errors.New("missing required field 'gasUsed' for Receipt") } r.GasUsed = (*big.Int)(dec.GasUsed) + if dec.Reverted != nil { + r.Reverted = *dec.Reverted + } return nil } diff --git a/core/types/receipt.go b/core/types/receipt.go index ef6f6a2bb2..598a37bdd9 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -40,6 +40,10 @@ type Receipt struct { TxHash common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress common.Address `json:"contractAddress"` GasUsed *big.Int `json:"gasUsed" gencodec:"required"` + // The Reverted field is true if transaction is reverted during state transition, + // As the transaction revert will cause all the remaining gas to be consumed, + // This field could help to gas estimation. + Reverted bool `json:"reverted" gencode:"required"` } type receiptMarshaling struct { @@ -91,7 +95,7 @@ func (r *ReceiptForStorage) EncodeRLP(w io.Writer) error { for i, log := range r.Logs { logs[i] = (*LogForStorage)(log) } - return rlp.Encode(w, []interface{}{r.PostState, r.CumulativeGasUsed, r.Bloom, r.TxHash, r.ContractAddress, logs, r.GasUsed}) + return rlp.Encode(w, []interface{}{r.PostState, r.CumulativeGasUsed, r.Bloom, r.TxHash, r.ContractAddress, logs, r.GasUsed, r.Reverted}) } // DecodeRLP implements rlp.Decoder, and loads both consensus and implementation @@ -105,6 +109,7 @@ func (r *ReceiptForStorage) DecodeRLP(s *rlp.Stream) error { ContractAddress common.Address Logs []*LogForStorage GasUsed *big.Int + Reverted bool } if err := s.Decode(&receipt); err != nil { return err @@ -116,7 +121,7 @@ func (r *ReceiptForStorage) DecodeRLP(s *rlp.Stream) error { r.Logs[i] = (*Log)(log) } // Assign the implementation fields - r.TxHash, r.ContractAddress, r.GasUsed = receipt.TxHash, receipt.ContractAddress, receipt.GasUsed + r.TxHash, r.ContractAddress, r.GasUsed, r.Reverted = receipt.TxHash, receipt.ContractAddress, receipt.GasUsed, receipt.Reverted return nil }