Tx receipt query fix (#126)

* Fixed tx receipt error on failed transaction

* Add returnData to failed transaction for logs bloom

* Change comment to TODO
This commit is contained in:
Austin Abell 2019-10-23 01:04:51 +09:00 committed by GitHub
parent 160e82b2ad
commit 475919274e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 16 deletions

View File

@ -605,8 +605,14 @@ func (e *PublicEthAPI) GetTransactionReceipt(hash common.Hash) (map[string]inter
var logs types.QueryETHLogs var logs types.QueryETHLogs
e.cliCtx.Codec.MustUnmarshalJSON(res, &logs) e.cliCtx.Codec.MustUnmarshalJSON(res, &logs)
txData := tx.TxResult.GetData()
var bloomFilter ethtypes.Bloom
var contractAddress common.Address
if len(txData) >= 20 {
// TODO: change hard coded indexing of bytes // TODO: change hard coded indexing of bytes
bloomFilter := ethtypes.BytesToBloom(tx.TxResult.GetData()[20:]) bloomFilter = ethtypes.BytesToBloom(txData[20:])
contractAddress = common.BytesToAddress(txData[:20])
}
fields := map[string]interface{}{ fields := map[string]interface{}{
"blockHash": blockHash, "blockHash": blockHash,
@ -623,7 +629,6 @@ func (e *PublicEthAPI) GetTransactionReceipt(hash common.Hash) (map[string]inter
"status": status, "status": status,
} }
contractAddress := common.BytesToAddress(tx.TxResult.GetData()[:20])
if contractAddress != (common.Address{}) { if contractAddress != (common.Address{}) {
// TODO: change hard coded indexing of first 20 bytes // TODO: change hard coded indexing of first 20 bytes
fields["contractAddress"] = contractAddress fields["contractAddress"] = contractAddress

View File

@ -74,19 +74,6 @@ func (st StateTransition) TransitionCSDB(ctx sdk.Context) (sdk.Result, *big.Int)
_, leftOverGas, vmerr = vmenv.Call(senderRef, *st.Recipient, st.Payload, gasLimit, st.Amount) _, leftOverGas, vmerr = vmenv.Call(senderRef, *st.Recipient, st.Payload, gasLimit, st.Amount)
} }
// handle errors
if vmerr != nil {
return emint.ErrVMExecution(vmerr.Error()).Result(), nil
}
// Refunds would happen here, if intended in future
st.Csdb.Finalise(true) // Change to depend on config
// Consume gas from evm execution
// Out of gas check does not need to be done here since it is done within the EVM execution
ctx.GasMeter().ConsumeGas(gasLimit-leftOverGas, "EVM execution consumption")
// Generate bloom filter to be saved in tx receipt data // Generate bloom filter to be saved in tx receipt data
bloomInt := big.NewInt(0) bloomInt := big.NewInt(0)
var bloomFilter ethtypes.Bloom var bloomFilter ethtypes.Bloom
@ -99,6 +86,21 @@ func (st StateTransition) TransitionCSDB(ctx sdk.Context) (sdk.Result, *big.Int)
// TODO: coniditionally add either/ both of these to return data // TODO: coniditionally add either/ both of these to return data
returnData := append(addr.Bytes(), bloomFilter.Bytes()...) returnData := append(addr.Bytes(), bloomFilter.Bytes()...)
// handle errors
if vmerr != nil {
res := emint.ErrVMExecution(vmerr.Error()).Result()
res.Data = returnData
return res, nil
}
// TODO: Refund unused gas here, if intended in future
st.Csdb.Finalise(true) // Change to depend on config
// Consume gas from evm execution
// Out of gas check does not need to be done here since it is done within the EVM execution
ctx.GasMeter().ConsumeGas(gasLimit-leftOverGas, "EVM execution consumption")
return sdk.Result{Data: returnData, GasUsed: st.GasLimit - leftOverGas}, bloomInt return sdk.Result{Data: returnData, GasUsed: st.GasLimit - leftOverGas}, bloomInt
} }