From a7b83c98644eaef82f73aa63a12eb739d64ad9fa Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 26 Jun 2025 15:59:45 +0800 Subject: [PATCH 1/5] feat: add limit for eth_call return value --- rpc/backend/call_tx.go | 5 ++++- server/config/config.go | 6 ++++++ server/config/toml.go | 3 +++ server/flags/flags.go | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index edd4084ab..4e18933ea 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -369,7 +369,10 @@ func (b *Backend) DoCall( if err != nil { return nil, err } - + length := len(res.Ret) + if length > int(b.Cfg.JSONRPC.ReturnDataLimit) && b.Cfg.JSONRPC.ReturnDataLimit != 0 { + return nil, fmt.Errorf("response too large %d exceeding limit %d", length, b.Cfg.JSONRPC.ReturnDataLimit) + } if err = handleRevertError(res.VmError, res.Ret); err != nil { return nil, err } diff --git a/server/config/config.go b/server/config/config.go index 8bb8df2ee..696aaa06f 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -104,6 +104,9 @@ const ( // DefaultGasAdjustment value to use as default in gas-adjustment flag DefaultGasAdjustment = 1.2 + + // DefaultReturnDataLimit is maximum number of bytes returned from eth_call or similar invocations + DefaultReturnDataLimit = 100000 ) var evmTracers = []string{"json", "markdown", "struct", "access_list"} @@ -173,6 +176,8 @@ type JSONRPCConfig struct { MetricsAddress string `mapstructure:"metrics-address"` // FixRevertGasRefundHeight defines the upgrade height for fix of revert gas refund logic when transaction reverted FixRevertGasRefundHeight int64 `mapstructure:"fix-revert-gas-refund-height"` + // ReturnDataLimit defines maximum number of bytes returned from `eth_call` or similar invocations + ReturnDataLimit int64 `mapstructure:"return-data-limit"` } // TLSConfig defines the certificate and matching private key for the server. @@ -234,6 +239,7 @@ func DefaultJSONRPCConfig() *JSONRPCConfig { EnableIndexer: false, MetricsAddress: DefaultJSONRPCMetricsAddress, FixRevertGasRefundHeight: DefaultFixRevertGasRefundHeight, + ReturnDataLimit: DefaultReturnDataLimit, } } diff --git a/server/config/toml.go b/server/config/toml.go index 3994d3ce1..4e693c854 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -89,6 +89,9 @@ metrics-address = "{{ .JSONRPC.MetricsAddress }}" # Upgrade height for fix of revert gas refund logic when transaction reverted. fix-revert-gas-refund-height = {{ .JSONRPC.FixRevertGasRefundHeight }} +# Maximum number of bytes returned from eth_call or similar invocations. +return-data-limit = {{ .JSONRPC.ReturnDataLimit }} + ############################################################################### ### TLS Configuration ### ############################################################################### diff --git a/server/flags/flags.go b/server/flags/flags.go index b4eebbfa7..226203600 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -57,6 +57,7 @@ const ( // https://github.com/ethereum/go-ethereum/blob/master/metrics/metrics.go#L35-L55 JSONRPCEnableMetrics = "metrics" JSONRPCFixRevertGasRefundHeight = "json-rpc.fix-revert-gas-refund-height" + JSONRPCReturnDataLimit = "json-rpc.return-data-limit" ) // EVM flags From 9da4563b35b4039b0983f773fa9988714433f093 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Fri, 27 Jun 2025 17:48:49 +0800 Subject: [PATCH 2/5] align batch limit --- rpc/backend/call_tx.go | 4 ---- server/config/config.go | 18 +++++++++++++----- server/config/toml.go | 7 +++++-- server/flags/flags.go | 7 ++++--- server/json_rpc.go | 1 + server/start.go | 2 ++ 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index 4e18933ea..766cb4afa 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -369,10 +369,6 @@ func (b *Backend) DoCall( if err != nil { return nil, err } - length := len(res.Ret) - if length > int(b.Cfg.JSONRPC.ReturnDataLimit) && b.Cfg.JSONRPC.ReturnDataLimit != 0 { - return nil, fmt.Errorf("response too large %d exceeding limit %d", length, b.Cfg.JSONRPC.ReturnDataLimit) - } if err = handleRevertError(res.VmError, res.Ret); err != nil { return nil, err } diff --git a/server/config/config.go b/server/config/config.go index 696aaa06f..0a0ccb649 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -105,8 +105,13 @@ const ( // DefaultGasAdjustment value to use as default in gas-adjustment flag DefaultGasAdjustment = 1.2 - // DefaultReturnDataLimit is maximum number of bytes returned from eth_call or similar invocations - DefaultReturnDataLimit = 100000 + // DefaultBatchRequestLimit is the maximum number of requests in a batch. + // https://github.com/ethereum/go-ethereum/blob/v1.15.11/node/defaults.go#L67 + DefaultBatchRequestLimit = 1000 + + // DefaultBatchResponseMaxSize is the maximum number of bytes returned from a batched rpc call. + // https://github.com/ethereum/go-ethereum/blob/v1.15.11/node/defaults.go#L68 + DefaultBatchResponseMaxSize = 25 * 1000 * 1000 ) var evmTracers = []string{"json", "markdown", "struct", "access_list"} @@ -176,8 +181,10 @@ type JSONRPCConfig struct { MetricsAddress string `mapstructure:"metrics-address"` // FixRevertGasRefundHeight defines the upgrade height for fix of revert gas refund logic when transaction reverted FixRevertGasRefundHeight int64 `mapstructure:"fix-revert-gas-refund-height"` - // ReturnDataLimit defines maximum number of bytes returned from `eth_call` or similar invocations - ReturnDataLimit int64 `mapstructure:"return-data-limit"` + // BatchRequestLimit defines maximum number of requests in a batch + BatchRequestLimit int `mapstructure:"batch-request-limit"` + // BatchResponseMaxSize defines maximum number of bytes returned from a batched call + BatchResponseMaxSize int `mapstructure:"batch-response-max-size"` } // TLSConfig defines the certificate and matching private key for the server. @@ -239,7 +246,8 @@ func DefaultJSONRPCConfig() *JSONRPCConfig { EnableIndexer: false, MetricsAddress: DefaultJSONRPCMetricsAddress, FixRevertGasRefundHeight: DefaultFixRevertGasRefundHeight, - ReturnDataLimit: DefaultReturnDataLimit, + BatchRequestLimit: DefaultBatchRequestLimit, + BatchResponseMaxSize: DefaultBatchResponseMaxSize, } } diff --git a/server/config/toml.go b/server/config/toml.go index 4e693c854..63e5f957f 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -89,8 +89,11 @@ metrics-address = "{{ .JSONRPC.MetricsAddress }}" # Upgrade height for fix of revert gas refund logic when transaction reverted. fix-revert-gas-refund-height = {{ .JSONRPC.FixRevertGasRefundHeight }} -# Maximum number of bytes returned from eth_call or similar invocations. -return-data-limit = {{ .JSONRPC.ReturnDataLimit }} +# Maximum number of requests in a batch. +batch-request-limit = {{ .JSONRPC.BatchRequestLimit }} + +# Maximum number of bytes returned from a batched call. +batch-response-max-size = {{ .JSONRPC.BatchResponseMaxSize }} ############################################################################### ### TLS Configuration ### diff --git a/server/flags/flags.go b/server/flags/flags.go index 226203600..dfe1f607d 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -55,9 +55,10 @@ const ( // JSONRPCEnableMetrics enables EVM RPC metrics server. // Set to `metrics` which is hardcoded flag from go-ethereum. // https://github.com/ethereum/go-ethereum/blob/master/metrics/metrics.go#L35-L55 - JSONRPCEnableMetrics = "metrics" - JSONRPCFixRevertGasRefundHeight = "json-rpc.fix-revert-gas-refund-height" - JSONRPCReturnDataLimit = "json-rpc.return-data-limit" + JSONRPCEnableMetrics = "metrics" + JSONRPCFixRevertGasRefundHeight = "json-rpc.fix-revert-gas-refund-height" + JSONRPCDefaultBatchRequestLimit = "json-rpc.batch-request-limit" + JSONRPCDefaultBatchResponseMaxSize = "json-rpc.batch-response-max-size" ) // EVM flags diff --git a/server/json_rpc.go b/server/json_rpc.go index 86c22b5fd..5fe8f66e0 100644 --- a/server/json_rpc.go +++ b/server/json_rpc.go @@ -33,6 +33,7 @@ func StartJSONRPC(ctx *server.Context, slog.SetDefault(slog.New(handler)) rpcServer := ethrpc.NewServer() + rpcServer.SetBatchLimits(config.JSONRPC.BatchRequestLimit, config.JSONRPC.BatchResponseMaxSize) allowUnprotectedTxs := config.JSONRPC.AllowUnprotectedTxs rpcAPIArr := config.JSONRPC.API diff --git a/server/start.go b/server/start.go index 643818e4b..8fee2ed16 100644 --- a/server/start.go +++ b/server/start.go @@ -198,6 +198,8 @@ which accepts a path for the resulting pprof file. cmd.Flags().Int(srvflags.JSONRPCMaxOpenConnections, cosmosevmserverconfig.DefaultMaxOpenConnections, "Sets the maximum number of simultaneous connections for the server listener") //nolint:lll cmd.Flags().Bool(srvflags.JSONRPCEnableIndexer, false, "Enable the custom tx indexer for json-rpc") cmd.Flags().Bool(srvflags.JSONRPCEnableMetrics, false, "Define if EVM rpc metrics server should be enabled") + cmd.Flags().Int(srvflags.JSONRPCDefaultBatchRequestLimit, cosmosevmserverconfig.DefaultBatchRequestLimit, "Define the default batch request limit for json-rpc") + cmd.Flags().Int(srvflags.JSONRPCDefaultBatchResponseMaxSize, cosmosevmserverconfig.DefaultBatchResponseMaxSize, "Define the default batch response max size for json-rpc") cmd.Flags().String(srvflags.EVMTracer, cosmosevmserverconfig.DefaultEVMTracer, "the EVM tracer type to collect execution traces from the EVM transaction execution (json|struct|access_list|markdown)") //nolint:lll cmd.Flags().Uint64(srvflags.EVMMaxTxGasWanted, cosmosevmserverconfig.DefaultMaxTxGasWanted, "the gas wanted for each eth tx returned in ante handler in check tx mode") //nolint:lll From 83dd13a7b81e771163e66f478f6477ea9963ad02 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Fri, 4 Jul 2025 22:20:24 +0800 Subject: [PATCH 3/5] add back space --- rpc/backend/call_tx.go | 1 + 1 file changed, 1 insertion(+) diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index 766cb4afa..525fe703b 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -318,6 +318,7 @@ func (b *Backend) EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rp if err != nil { return 0, err } + if err = handleRevertError(res.VmError, res.Ret); err != nil { return 0, err } From 1c6aa0a4f7820f5c28affa01e4bc6017b20c60d0 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Fri, 4 Jul 2025 22:21:34 +0800 Subject: [PATCH 4/5] add back space --- rpc/backend/call_tx.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index 525fe703b..edd4084ab 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -318,7 +318,6 @@ func (b *Backend) EstimateGas(args evmtypes.TransactionArgs, blockNrOptional *rp if err != nil { return 0, err } - if err = handleRevertError(res.VmError, res.Ret); err != nil { return 0, err } @@ -370,6 +369,7 @@ func (b *Backend) DoCall( if err != nil { return nil, err } + if err = handleRevertError(res.VmError, res.Ret); err != nil { return nil, err } From 7d5352e30d359116d3228128f30b173b64c91588 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Wed, 6 Aug 2025 09:24:48 +0800 Subject: [PATCH 5/5] resolve --- server/flags/flags.go | 6 ++---- server/start.go | 2 -- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/server/flags/flags.go b/server/flags/flags.go index 0da433155..d100872b0 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -60,10 +60,8 @@ const ( // JSONRPCEnableMetrics enables EVM RPC metrics server. // Set to `metrics` which is hardcoded flag from go-ethereum. // https://github.com/ethereum/go-ethereum/blob/master/metrics/metrics.go#L35-L55 - JSONRPCEnableMetrics = "metrics" - JSONRPCFixRevertGasRefundHeight = "json-rpc.fix-revert-gas-refund-height" - JSONRPCDefaultBatchRequestLimit = "json-rpc.batch-request-limit" - JSONRPCDefaultBatchResponseMaxSize = "json-rpc.batch-response-max-size" + JSONRPCEnableMetrics = "metrics" + JSONRPCFixRevertGasRefundHeight = "json-rpc.fix-revert-gas-refund-height" ) // EVM flags diff --git a/server/start.go b/server/start.go index 12941b431..34312ee7a 100644 --- a/server/start.go +++ b/server/start.go @@ -197,8 +197,6 @@ which accepts a path for the resulting pprof file. cmd.Flags().Int(srvflags.JSONRPCMaxOpenConnections, cosmosevmserverconfig.DefaultMaxOpenConnections, "Sets the maximum number of simultaneous connections for the server listener") //nolint:lll cmd.Flags().Bool(srvflags.JSONRPCEnableIndexer, false, "Enable the custom tx indexer for json-rpc") cmd.Flags().Bool(srvflags.JSONRPCEnableMetrics, false, "Define if EVM rpc metrics server should be enabled") - cmd.Flags().Int(srvflags.JSONRPCDefaultBatchRequestLimit, cosmosevmserverconfig.DefaultBatchRequestLimit, "Define the default batch request limit for json-rpc") - cmd.Flags().Int(srvflags.JSONRPCDefaultBatchResponseMaxSize, cosmosevmserverconfig.DefaultBatchResponseMaxSize, "Define the default batch response max size for json-rpc") cmd.Flags().Bool(srvflags.JSONRPCEnableProfiling, false, "Enables the profiling in the debug namespace") cmd.Flags().String(srvflags.EVMTracer, cosmosevmserverconfig.DefaultEVMTracer, "the EVM tracer type to collect execution traces from the EVM transaction execution (json|struct|access_list|markdown)") //nolint:lll