make MaxTxGasWanted configurable (#1004)

This commit is contained in:
yihuang 2022-03-21 17:01:21 +08:00 committed by GitHub
parent 93a57bc330
commit 8bcdb2c0e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 28 additions and 9 deletions

View File

@ -42,6 +42,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (rpc) [tharsis#990](https://github.com/tharsis/ethermint/pull/990) Calculate reward values from all `MsgEthereumTx` from a block in `eth_feeHistory`. * (rpc) [tharsis#990](https://github.com/tharsis/ethermint/pull/990) Calculate reward values from all `MsgEthereumTx` from a block in `eth_feeHistory`.
* (ante) [tharsis#991](https://github.com/tharsis/ethermint/pull/991) Set an upper bound to gasWanted to prevent DoS attack. * (ante) [tharsis#991](https://github.com/tharsis/ethermint/pull/991) Set an upper bound to gasWanted to prevent DoS attack.
* (ante) [tharsis#1004](https://github.com/tharsis/ethermint/pull/1004) make MaxTxGasWanted configurable.
## [v0.11.0] - 2022-03-06 ## [v0.11.0] - 2022-03-06

View File

@ -137,14 +137,17 @@ func (avd EthAccountVerificationDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx
// gas consumption. // gas consumption.
type EthGasConsumeDecorator struct { type EthGasConsumeDecorator struct {
evmKeeper EVMKeeper evmKeeper EVMKeeper
maxGasWanted uint64
} }
// NewEthGasConsumeDecorator creates a new EthGasConsumeDecorator // NewEthGasConsumeDecorator creates a new EthGasConsumeDecorator
func NewEthGasConsumeDecorator( func NewEthGasConsumeDecorator(
evmKeeper EVMKeeper, evmKeeper EVMKeeper,
maxGasWanted uint64,
) EthGasConsumeDecorator { ) EthGasConsumeDecorator {
return EthGasConsumeDecorator{ return EthGasConsumeDecorator{
evmKeeper: evmKeeper, evmKeeper,
maxGasWanted,
} }
} }
@ -188,8 +191,8 @@ func (egcd EthGasConsumeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simula
if ctx.IsCheckTx() { if ctx.IsCheckTx() {
// We can't trust the tx gas limit, because we'll refund the unused gas. // We can't trust the tx gas limit, because we'll refund the unused gas.
if txData.GetGas() > MaxTxGasWanted { if txData.GetGas() > egcd.maxGasWanted {
gasWanted += MaxTxGasWanted gasWanted += egcd.maxGasWanted
} else { } else {
gasWanted += txData.GetGas() gasWanted += txData.GetGas()
} }

View File

@ -6,6 +6,7 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/tharsis/ethermint/app/ante" "github.com/tharsis/ethermint/app/ante"
"github.com/tharsis/ethermint/server/config"
"github.com/tharsis/ethermint/tests" "github.com/tharsis/ethermint/tests"
"github.com/tharsis/ethermint/x/evm/statedb" "github.com/tharsis/ethermint/x/evm/statedb"
evmtypes "github.com/tharsis/ethermint/x/evm/types" evmtypes "github.com/tharsis/ethermint/x/evm/types"
@ -201,7 +202,7 @@ func (suite AnteTestSuite) TestEthNonceVerificationDecorator() {
} }
func (suite AnteTestSuite) TestEthGasConsumeDecorator() { func (suite AnteTestSuite) TestEthGasConsumeDecorator() {
dec := ante.NewEthGasConsumeDecorator(suite.app.EvmKeeper) dec := ante.NewEthGasConsumeDecorator(suite.app.EvmKeeper, config.DefaultMaxTxGasWanted)
addr := tests.GenerateAddress() addr := tests.GenerateAddress()

View File

@ -25,6 +25,7 @@ type HandlerOptions struct {
FeegrantKeeper ante.FeegrantKeeper FeegrantKeeper ante.FeegrantKeeper
SignModeHandler authsigning.SignModeHandler SignModeHandler authsigning.SignModeHandler
SigGasConsumer func(meter sdk.GasMeter, sig signing.SignatureV2, params authtypes.Params) error SigGasConsumer func(meter sdk.GasMeter, sig signing.SignatureV2, params authtypes.Params) error
MaxTxGasWanted uint64
} }
func (options HandlerOptions) Validate() error { func (options HandlerOptions) Validate() error {
@ -53,7 +54,7 @@ func newEthAnteHandler(options HandlerOptions) sdk.AnteHandler {
NewEthValidateBasicDecorator(options.EvmKeeper), NewEthValidateBasicDecorator(options.EvmKeeper),
NewEthSigVerificationDecorator(options.EvmKeeper), NewEthSigVerificationDecorator(options.EvmKeeper),
NewEthAccountVerificationDecorator(options.AccountKeeper, options.BankKeeper, options.EvmKeeper), NewEthAccountVerificationDecorator(options.AccountKeeper, options.BankKeeper, options.EvmKeeper),
NewEthGasConsumeDecorator(options.EvmKeeper), NewEthGasConsumeDecorator(options.EvmKeeper, options.MaxTxGasWanted),
NewCanTransferDecorator(options.EvmKeeper), NewCanTransferDecorator(options.EvmKeeper),
NewEthIncrementSenderSequenceDecorator(options.AccountKeeper), // innermost AnteDecorator. NewEthIncrementSenderSequenceDecorator(options.AccountKeeper), // innermost AnteDecorator.
) )

View File

@ -567,6 +567,7 @@ func NewEthermintApp(
// use Ethermint's custom AnteHandler // use Ethermint's custom AnteHandler
maxGasWanted := cast.ToUint64(appOpts.Get(srvflags.EVMMaxTxGasWanted))
options := ante.HandlerOptions{ options := ante.HandlerOptions{
AccountKeeper: app.AccountKeeper, AccountKeeper: app.AccountKeeper,
BankKeeper: app.BankKeeper, BankKeeper: app.BankKeeper,
@ -576,6 +577,7 @@ func NewEthermintApp(
FeeMarketKeeper: app.FeeMarketKeeper, FeeMarketKeeper: app.FeeMarketKeeper,
SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), SignModeHandler: encodingConfig.TxConfig.SignModeHandler(),
SigGasConsumer: ante.DefaultSigVerificationGasConsumer, SigGasConsumer: ante.DefaultSigVerificationGasConsumer,
MaxTxGasWanted: maxGasWanted,
} }
if err := options.Validate(); err != nil { if err := options.Validate(); err != nil {

View File

@ -28,6 +28,8 @@ const (
// DefaultEVMTracer is the default vm.Tracer type // DefaultEVMTracer is the default vm.Tracer type
DefaultEVMTracer = "" DefaultEVMTracer = ""
DefaultMaxTxGasWanted = 500000
DefaultGasCap uint64 = 25000000 DefaultGasCap uint64 = 25000000
DefaultFilterCap int32 = 200 DefaultFilterCap int32 = 200
@ -64,6 +66,8 @@ type EVMConfig struct {
// Tracer defines vm.Tracer type that the EVM will use if the node is run in // Tracer defines vm.Tracer type that the EVM will use if the node is run in
// trace mode. Default: 'json'. // trace mode. Default: 'json'.
Tracer string `mapstructure:"tracer"` Tracer string `mapstructure:"tracer"`
// MaxTxGasWanted defines the gas wanted for each eth tx returned in ante handler in check tx mode.
MaxTxGasWanted uint64 `mapstructure:"max-tx-gas-wanted"`
} }
// JSONRPCConfig defines configuration for the EVM RPC server. // JSONRPCConfig defines configuration for the EVM RPC server.
@ -153,6 +157,7 @@ func DefaultConfig() *Config {
func DefaultEVMConfig() *EVMConfig { func DefaultEVMConfig() *EVMConfig {
return &EVMConfig{ return &EVMConfig{
Tracer: DefaultEVMTracer, Tracer: DefaultEVMTracer,
MaxTxGasWanted: DefaultMaxTxGasWanted,
} }
} }
@ -278,6 +283,7 @@ func GetConfig(v *viper.Viper) Config {
Config: cfg, Config: cfg,
EVM: EVMConfig{ EVM: EVMConfig{
Tracer: v.GetString("evm.tracer"), Tracer: v.GetString("evm.tracer"),
MaxTxGasWanted: v.GetUint64("evm.max-tx-gas-wanted"),
}, },
JSONRPC: JSONRPCConfig{ JSONRPC: JSONRPCConfig{
Enable: v.GetBool("json-rpc.enable"), Enable: v.GetBool("json-rpc.enable"),

View File

@ -13,6 +13,9 @@ const DefaultConfigTemplate = `
# Valid types are: json|struct|access_list|markdown # Valid types are: json|struct|access_list|markdown
tracer = "{{ .EVM.Tracer }}" tracer = "{{ .EVM.Tracer }}"
# MaxTxGasWanted defines the gas wanted for each eth tx returned in ante handler in check tx mode.
max-tx-gas-wanted = {{ .EVM.MaxTxGasWanted }}
############################################################################### ###############################################################################
### JSON RPC Configuration ### ### JSON RPC Configuration ###
############################################################################### ###############################################################################

View File

@ -49,6 +49,7 @@ const (
// EVM flags // EVM flags
const ( const (
EVMTracer = "evm.tracer" EVMTracer = "evm.tracer"
EVMMaxTxGasWanted = "evm.max-tx-gas-wanted"
) )
// TLS flags // TLS flags

View File

@ -166,6 +166,7 @@ which accepts a path for the resulting pprof file.
cmd.Flags().Int32(srvflags.JSONRPCBlockRangeCap, config.DefaultBlockRangeCap, "Sets the max block range allowed for `eth_getLogs` query") cmd.Flags().Int32(srvflags.JSONRPCBlockRangeCap, config.DefaultBlockRangeCap, "Sets the max block range allowed for `eth_getLogs` query")
cmd.Flags().String(srvflags.EVMTracer, config.DefaultEVMTracer, "the EVM tracer type to collect execution traces from the EVM transaction execution (json|struct|access_list|markdown)") cmd.Flags().String(srvflags.EVMTracer, config.DefaultEVMTracer, "the EVM tracer type to collect execution traces from the EVM transaction execution (json|struct|access_list|markdown)")
cmd.Flags().Uint64(srvflags.EVMMaxTxGasWanted, config.DefaultMaxTxGasWanted, "the gas wanted for each eth tx returned in ante handler in check tx mode")
cmd.Flags().String(srvflags.TLSCertPath, "", "the cert.pem file path for the server TLS configuration") cmd.Flags().String(srvflags.TLSCertPath, "", "the cert.pem file path for the server TLS configuration")
cmd.Flags().String(srvflags.TLSKeyPath, "", "the key.pem file path for the server TLS configuration") cmd.Flags().String(srvflags.TLSKeyPath, "", "the key.pem file path for the server TLS configuration")