fix: traceTransaction returns zero gas used (#1179)
* Problem: traceTransaction returns zero gas used Solution: - call CaptureTxStart and CaptureTxEnd * fix trace unit tests * add overflow check * add comment * check gas used is positive * Update x/evm/keeper/state_transition.go Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>
This commit is contained in:
parent
da8fcc3ae2
commit
b74b37f5f0
@ -48,6 +48,10 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
|||||||
* (feemarket) [\#1165](https://github.com/evmos/ethermint/pull/1165) Add hint in specs about different gas terminology for gas in Cosmos and Ethereum.
|
* (feemarket) [\#1165](https://github.com/evmos/ethermint/pull/1165) Add hint in specs about different gas terminology for gas in Cosmos and Ethereum.
|
||||||
* (rpc) [\#1169](https://github.com/evmos/ethermint/pull/1169) Remove unnecessary queries from `getBlockNumber` function
|
* (rpc) [\#1169](https://github.com/evmos/ethermint/pull/1169) Remove unnecessary queries from `getBlockNumber` function
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* (rpc) [#1179](https://github.com/evmos/ethermint/pull/1179) Fix gas used in traceTransaction response.
|
||||||
|
|
||||||
## [v0.17.0] - 2022-06-27
|
## [v0.17.0] - 2022-06-27
|
||||||
|
|
||||||
### State Machine Breaking
|
### State Machine Breaking
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
"github.com/ethereum/go-ethereum/core/vm"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
|
ethlogger "github.com/ethereum/go-ethereum/eth/tracers/logger"
|
||||||
ethparams "github.com/ethereum/go-ethereum/params"
|
ethparams "github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/evmos/ethermint/x/evm/statedb"
|
"github.com/evmos/ethermint/x/evm/statedb"
|
||||||
|
|
||||||
@ -613,7 +614,7 @@ func (suite *KeeperTestSuite) TestTraceTx() {
|
|||||||
msg string
|
msg string
|
||||||
malleate func()
|
malleate func()
|
||||||
expPass bool
|
expPass bool
|
||||||
traceResponse []byte
|
traceResponse string
|
||||||
enableFeemarket bool
|
enableFeemarket bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
@ -623,7 +624,7 @@ func (suite *KeeperTestSuite) TestTraceTx() {
|
|||||||
predecessors = []*types.MsgEthereumTx{}
|
predecessors = []*types.MsgEthereumTx{}
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x7b, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x70, 0x63, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x22, 0x50, 0x55, 0x53, 0x48, 0x31, 0x22, 0x2c, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x33, 0x30, 0x32, 0x39},
|
traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
msg: "default trace with filtered response",
|
msg: "default trace with filtered response",
|
||||||
@ -636,7 +637,7 @@ func (suite *KeeperTestSuite) TestTraceTx() {
|
|||||||
predecessors = []*types.MsgEthereumTx{}
|
predecessors = []*types.MsgEthereumTx{}
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x7b, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x70, 0x63, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x22, 0x50, 0x55, 0x53, 0x48, 0x31, 0x22, 0x2c, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x33, 0x30, 0x32, 0x39},
|
traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":",
|
||||||
enableFeemarket: false,
|
enableFeemarket: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -648,7 +649,7 @@ func (suite *KeeperTestSuite) TestTraceTx() {
|
|||||||
predecessors = []*types.MsgEthereumTx{}
|
predecessors = []*types.MsgEthereumTx{}
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x5b, 0x5d},
|
traceResponse: "[]",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
msg: "default trace with enableFeemarket",
|
msg: "default trace with enableFeemarket",
|
||||||
@ -661,7 +662,7 @@ func (suite *KeeperTestSuite) TestTraceTx() {
|
|||||||
predecessors = []*types.MsgEthereumTx{}
|
predecessors = []*types.MsgEthereumTx{}
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x7b, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x70, 0x63, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x22, 0x50, 0x55, 0x53, 0x48, 0x31, 0x22, 0x2c, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x33, 0x30, 0x32, 0x39},
|
traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":",
|
||||||
enableFeemarket: true,
|
enableFeemarket: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -673,7 +674,7 @@ func (suite *KeeperTestSuite) TestTraceTx() {
|
|||||||
predecessors = []*types.MsgEthereumTx{}
|
predecessors = []*types.MsgEthereumTx{}
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x5b, 0x5d},
|
traceResponse: "[]",
|
||||||
enableFeemarket: true,
|
enableFeemarket: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -696,7 +697,7 @@ func (suite *KeeperTestSuite) TestTraceTx() {
|
|||||||
predecessors = append(predecessors, firstTx)
|
predecessors = append(predecessors, firstTx)
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x7b, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x70, 0x63, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x22, 0x50, 0x55, 0x53, 0x48, 0x31, 0x22, 0x2c, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x31, 0x33, 0x31, 0x39},
|
traceResponse: "{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PUSH1\",\"gas\":",
|
||||||
enableFeemarket: false,
|
enableFeemarket: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -725,9 +726,14 @@ func (suite *KeeperTestSuite) TestTraceTx() {
|
|||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
// if data is to big, slice the result
|
// if data is to big, slice the result
|
||||||
if len(res.Data) > 150 {
|
if len(res.Data) > 150 {
|
||||||
suite.Require().Equal(tc.traceResponse, res.Data[:150])
|
suite.Require().Equal(tc.traceResponse, string(res.Data[:150]))
|
||||||
} else {
|
} else {
|
||||||
suite.Require().Equal(tc.traceResponse, res.Data)
|
suite.Require().Equal(tc.traceResponse, string(res.Data))
|
||||||
|
}
|
||||||
|
if traceConfig == nil || traceConfig.Tracer == "" {
|
||||||
|
var result ethlogger.ExecutionResult
|
||||||
|
suite.Require().NoError(json.Unmarshal(res.Data, &result))
|
||||||
|
suite.Require().Positive(result.Gas)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
suite.Require().Error(err)
|
suite.Require().Error(err)
|
||||||
@ -748,7 +754,7 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
|
|||||||
msg string
|
msg string
|
||||||
malleate func()
|
malleate func()
|
||||||
expPass bool
|
expPass bool
|
||||||
traceResponse []byte
|
traceResponse string
|
||||||
enableFeemarket bool
|
enableFeemarket bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
@ -757,7 +763,7 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
|
|||||||
traceConfig = nil
|
traceConfig = nil
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x5b, 0x7b, 0x22, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x70, 0x63, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x22, 0x50, 0x55, 0x53, 0x48, 0x31, 0x22},
|
traceResponse: "[{\"result\":{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PU",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
msg: "filtered trace",
|
msg: "filtered trace",
|
||||||
@ -769,7 +775,7 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x5b, 0x7b, 0x22, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x70, 0x63, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x22, 0x50, 0x55, 0x53, 0x48, 0x31, 0x22},
|
traceResponse: "[{\"result\":{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PU",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
msg: "javascript tracer",
|
msg: "javascript tracer",
|
||||||
@ -779,7 +785,7 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x5b, 0x7b, 0x22, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x5b, 0x5d, 0x7d, 0x5d},
|
traceResponse: "[{\"result\":[]}]",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
msg: "default trace with enableFeemarket and filtered return",
|
msg: "default trace with enableFeemarket and filtered return",
|
||||||
@ -791,7 +797,7 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x5b, 0x7b, 0x22, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x70, 0x63, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x22, 0x50, 0x55, 0x53, 0x48, 0x31, 0x22},
|
traceResponse: "[{\"result\":{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PU",
|
||||||
enableFeemarket: true,
|
enableFeemarket: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -802,7 +808,7 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x5b, 0x7b, 0x22, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x5b, 0x5d, 0x7d, 0x5d},
|
traceResponse: "[{\"result\":[]}]",
|
||||||
enableFeemarket: true,
|
enableFeemarket: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -825,7 +831,7 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
|
|||||||
txs = append([]*types.MsgEthereumTx{}, firstTx, secondTx)
|
txs = append([]*types.MsgEthereumTx{}, firstTx, secondTx)
|
||||||
},
|
},
|
||||||
expPass: true,
|
expPass: true,
|
||||||
traceResponse: []byte{0x5b, 0x7b, 0x22, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x67, 0x61, 0x73, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x22, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x70, 0x63, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x6f, 0x70, 0x22, 0x3a, 0x22, 0x50, 0x55, 0x53, 0x48, 0x31, 0x22},
|
traceResponse: "[{\"result\":{\"gas\":34828,\"failed\":false,\"returnValue\":\"0000000000000000000000000000000000000000000000000000000000000001\",\"structLogs\":[{\"pc\":0,\"op\":\"PU",
|
||||||
enableFeemarket: false,
|
enableFeemarket: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -855,9 +861,9 @@ func (suite *KeeperTestSuite) TestTraceBlock() {
|
|||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
// if data is to big, slice the result
|
// if data is to big, slice the result
|
||||||
if len(res.Data) > 150 {
|
if len(res.Data) > 150 {
|
||||||
suite.Require().Equal(tc.traceResponse, res.Data[:150])
|
suite.Require().Equal(tc.traceResponse, string(res.Data[:150]))
|
||||||
} else {
|
} else {
|
||||||
suite.Require().Equal(tc.traceResponse, res.Data)
|
suite.Require().Equal(tc.traceResponse, string(res.Data))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
suite.Require().Error(err)
|
suite.Require().Error(err)
|
||||||
|
@ -357,6 +357,15 @@ func (k *Keeper) ApplyMessageWithConfig(ctx sdk.Context, msg core.Message, trace
|
|||||||
stateDB := statedb.New(ctx, k, txConfig)
|
stateDB := statedb.New(ctx, k, txConfig)
|
||||||
evm := k.NewEVM(ctx, msg, cfg, tracer, stateDB)
|
evm := k.NewEVM(ctx, msg, cfg, tracer, stateDB)
|
||||||
|
|
||||||
|
leftoverGas := msg.Gas()
|
||||||
|
// Allow the tracer captures the tx level events, mainly the gas consumption.
|
||||||
|
if evm.Config.Debug {
|
||||||
|
evm.Config.Tracer.CaptureTxStart(leftoverGas)
|
||||||
|
defer func() {
|
||||||
|
evm.Config.Tracer.CaptureTxEnd(leftoverGas)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
sender := vm.AccountRef(msg.From())
|
sender := vm.AccountRef(msg.From())
|
||||||
contractCreation := msg.To() == nil
|
contractCreation := msg.To() == nil
|
||||||
isLondon := cfg.ChainConfig.IsLondon(evm.Context.BlockNumber)
|
isLondon := cfg.ChainConfig.IsLondon(evm.Context.BlockNumber)
|
||||||
@ -368,12 +377,11 @@ func (k *Keeper) ApplyMessageWithConfig(ctx sdk.Context, msg core.Message, trace
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Should check again even if it is checked on Ante Handler, because eth_call don't go through Ante Handler.
|
// Should check again even if it is checked on Ante Handler, because eth_call don't go through Ante Handler.
|
||||||
if msg.Gas() < intrinsicGas {
|
if leftoverGas < intrinsicGas {
|
||||||
// eth_estimateGas will check for this exact error
|
// eth_estimateGas will check for this exact error
|
||||||
return nil, sdkerrors.Wrap(core.ErrIntrinsicGas, "apply message")
|
return nil, sdkerrors.Wrap(core.ErrIntrinsicGas, "apply message")
|
||||||
}
|
}
|
||||||
|
leftoverGas -= intrinsicGas
|
||||||
leftoverGas := msg.Gas() - intrinsicGas
|
|
||||||
|
|
||||||
// access list preparation is moved from ante handler to here, because it's needed when `ApplyMessage` is called
|
// access list preparation is moved from ante handler to here, because it's needed when `ApplyMessage` is called
|
||||||
// under contexts where ante handlers are not run, for example `eth_call` and `eth_estimateGas`.
|
// under contexts where ante handlers are not run, for example `eth_call` and `eth_estimateGas`.
|
||||||
@ -403,14 +411,8 @@ func (k *Keeper) ApplyMessageWithConfig(ctx sdk.Context, msg core.Message, trace
|
|||||||
if msg.Gas() < leftoverGas {
|
if msg.Gas() < leftoverGas {
|
||||||
return nil, sdkerrors.Wrap(types.ErrGasOverflow, "apply message")
|
return nil, sdkerrors.Wrap(types.ErrGasOverflow, "apply message")
|
||||||
}
|
}
|
||||||
|
// refund gas
|
||||||
temporaryGasUsed := msg.Gas() - leftoverGas
|
leftoverGas += GasToRefund(stateDB.GetRefund(), msg.Gas()-leftoverGas, refundQuotient)
|
||||||
refund := GasToRefund(stateDB.GetRefund(), temporaryGasUsed, refundQuotient)
|
|
||||||
if refund > temporaryGasUsed {
|
|
||||||
return nil, sdkerrors.Wrap(types.ErrGasOverflow, "apply message")
|
|
||||||
}
|
|
||||||
|
|
||||||
temporaryGasUsed -= refund
|
|
||||||
|
|
||||||
// EVM execution error needs to be available for the JSON-RPC client
|
// EVM execution error needs to be available for the JSON-RPC client
|
||||||
var vmError string
|
var vmError string
|
||||||
@ -431,7 +433,14 @@ func (k *Keeper) ApplyMessageWithConfig(ctx sdk.Context, msg core.Message, trace
|
|||||||
gasLimit := sdk.NewDec(int64(msg.Gas()))
|
gasLimit := sdk.NewDec(int64(msg.Gas()))
|
||||||
minGasMultiplier := k.GetMinGasMultiplier(ctx)
|
minGasMultiplier := k.GetMinGasMultiplier(ctx)
|
||||||
minimumGasUsed := gasLimit.Mul(minGasMultiplier)
|
minimumGasUsed := gasLimit.Mul(minGasMultiplier)
|
||||||
|
|
||||||
|
if msg.Gas() < leftoverGas {
|
||||||
|
return nil, sdkerrors.Wrapf(types.ErrGasOverflow, "message gas limit < leftover gas (%d < %d)", msg.Gas(), leftoverGas)
|
||||||
|
}
|
||||||
|
temporaryGasUsed := msg.Gas() - leftoverGas
|
||||||
gasUsed := sdk.MaxDec(minimumGasUsed, sdk.NewDec(int64(temporaryGasUsed))).TruncateInt().Uint64()
|
gasUsed := sdk.MaxDec(minimumGasUsed, sdk.NewDec(int64(temporaryGasUsed))).TruncateInt().Uint64()
|
||||||
|
// reset leftoverGas, to be used by the tracer
|
||||||
|
leftoverGas = msg.Gas() - gasUsed
|
||||||
|
|
||||||
return &types.MsgEthereumTxResponse{
|
return &types.MsgEthereumTxResponse{
|
||||||
GasUsed: gasUsed,
|
GasUsed: gasUsed,
|
||||||
|
Loading…
Reference in New Issue
Block a user