From bd9da3f08364733229421a2bbdf2c55836099695 Mon Sep 17 00:00:00 2001 From: cwarnerdev <138500512+cwarnerdev@users.noreply.github.com> Date: Mon, 24 Mar 2025 05:12:27 -1000 Subject: [PATCH 1/5] add option to disable websocket rate limit --- components/webapi/component.go | 1 + components/webapi/params.go | 1 + packages/evm/jsonrpc/server.go | 4 ++++ packages/webapi/services/evm_websocket.go | 11 ++++++++++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/components/webapi/component.go b/components/webapi/component.go index 6df3c3ecae..0afb46496f 100644 --- a/components/webapi/component.go +++ b/components/webapi/component.go @@ -303,6 +303,7 @@ func provide(c *dig.Container) error { ParamsWebAPI.Limits.Jsonrpc.WebsocketRateLimitBurst, ParamsWebAPI.Limits.Jsonrpc.WebsocketConnectionCleanupDuration, ParamsWebAPI.Limits.Jsonrpc.WebsocketClientBlockDuration, + ParamsWebAPI.Limits.Jsonrpc.WebsocketRateLimitDisabled, ), ) diff --git a/components/webapi/params.go b/components/webapi/params.go index ab771fc297..6d4e608d47 100644 --- a/components/webapi/params.go +++ b/components/webapi/params.go @@ -33,6 +33,7 @@ type ParametersJSONRPC struct { WebsocketRateLimitMessagesPerSecond int `default:"20" usage:"the websocket rate limit (messages per second)"` WebsocketRateLimitBurst int `default:"5" usage:"the websocket burst limit"` + WebsocketRateLimitDisabled bool `default:"false" usage:"disable rate limiting on the websocket"` WebsocketConnectionCleanupDuration time.Duration `default:"5m" usage:"defines in which interval stale connections will be cleaned up"` WebsocketClientBlockDuration time.Duration `default:"5m" usage:"the duration a misbehaving client will be blocked"` } diff --git a/packages/evm/jsonrpc/server.go b/packages/evm/jsonrpc/server.go index 0eca0c79b6..b05d6cecbf 100644 --- a/packages/evm/jsonrpc/server.go +++ b/packages/evm/jsonrpc/server.go @@ -15,6 +15,7 @@ type Parameters struct { Logs LogsLimits WebsocketRateLimitMessagesPerSecond int WebsocketRateLimitBurst int + WebsocketRateLimitDisabled bool WebsocketConnectionCleanupDuration time.Duration WebsocketClientBlockDuration time.Duration } @@ -26,6 +27,7 @@ func NewParameters( websocketRateLimitBurst int, websocketConnectionCleanupDuration time.Duration, websocketClientBlockDuration time.Duration, + websocketRateLimitDisabled bool, ) *Parameters { return &Parameters{ Logs: LogsLimits{ @@ -34,6 +36,7 @@ func NewParameters( }, WebsocketRateLimitMessagesPerSecond: websocketRateLimitMessagesPerSecond, WebsocketRateLimitBurst: websocketRateLimitBurst, + WebsocketRateLimitDisabled: websocketRateLimitDisabled, WebsocketConnectionCleanupDuration: websocketConnectionCleanupDuration, WebsocketClientBlockDuration: websocketClientBlockDuration, } @@ -47,6 +50,7 @@ func ParametersDefault() *Parameters { }, WebsocketRateLimitMessagesPerSecond: 20, WebsocketRateLimitBurst: 5, + WebsocketRateLimitDisabled: false, WebsocketConnectionCleanupDuration: 5 * time.Minute, WebsocketClientBlockDuration: 5 * time.Minute, } diff --git a/packages/webapi/services/evm_websocket.go b/packages/webapi/services/evm_websocket.go index 2ba8f65e0d..a8c1abb9be 100644 --- a/packages/webapi/services/evm_websocket.go +++ b/packages/webapi/services/evm_websocket.go @@ -104,7 +104,16 @@ func (w *websocketContext) getRateLimiter(remoteIP string) *activityRateLimiter return w.rateLimiters[remoteIP] } - limiter := rate.NewLimiter(rate.Limit(w.jsonRPCParams.WebsocketRateLimitMessagesPerSecond), w.jsonRPCParams.WebsocketRateLimitBurst) + limit := rate.Limit(w.jsonRPCParams.WebsocketRateLimitMessagesPerSecond) + burst := w.jsonRPCParams.WebsocketRateLimitBurst + + if w.jsonRPCParams.WebsocketRateLimitDisabled { + limit = rate.Inf + burst = 0 + } + + limiter := rate.NewLimiter(limit, burst) + w.rateLimiters[remoteIP] = newActivityRateLimiter(limiter) return w.rateLimiters[remoteIP] From 434cc377804dfdea27013076eb67c79c3594fc2c Mon Sep 17 00:00:00 2001 From: cwarnerdev <138500512+cwarnerdev@users.noreply.github.com> Date: Wed, 26 Mar 2025 07:34:43 -1000 Subject: [PATCH 2/5] add test for disabled rate limit --- packages/webapi/services/ratelimit_test.go | 26 ++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 packages/webapi/services/ratelimit_test.go diff --git a/packages/webapi/services/ratelimit_test.go b/packages/webapi/services/ratelimit_test.go new file mode 100644 index 0000000000..e7ad2ec06b --- /dev/null +++ b/packages/webapi/services/ratelimit_test.go @@ -0,0 +1,26 @@ +package services + +import ( + "github.com/iotaledger/hive.go/log" + "github.com/iotaledger/wasp/packages/evm/jsonrpc" + "github.com/stretchr/testify/require" + "testing" +) + +// TestWebsocketContext_RateLimitDisabled ensures no rate limiting occurs when +// WebsocketRateLimitDisabled is set to true. +func TestWebsocketContext_RateLimitDisabled(t *testing.T) { + testLogger := log.NewLogger(log.WithName("TestWebsocketContext_RateLimitDisabled")) + params := jsonrpc.ParametersDefault() + params.WebsocketRateLimitDisabled = true + + wsCtx := newWebsocketContext(testLogger, params) + + remoteIP := "127.0.0.1" + rateLimiter := wsCtx.getRateLimiter(remoteIP) + + // Because the rate limiter is disabled, every call to .Allow() should return true. + for i := 0; i < 50; i++ { + require.True(t, rateLimiter.Allow(), "disabled rate limiter should always allow") + } +} From b36d3b0e9b883ee28cfa88ec9449ed55986eacc3 Mon Sep 17 00:00:00 2001 From: cwarnerdev <138500512+cwarnerdev@users.noreply.github.com> Date: Wed, 26 Mar 2025 08:05:40 -1000 Subject: [PATCH 3/5] run gendoc for new default config file --- config_defaults.json | 1 + documentation/docs/configuration.md | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/config_defaults.json b/config_defaults.json index 1c2b79fb82..f82ccac62d 100755 --- a/config_defaults.json +++ b/config_defaults.json @@ -136,6 +136,7 @@ "maxLogsInResult": 10000, "websocketRateLimitMessagesPerSecond": 20, "websocketRateLimitBurst": 5, + "websocketRateLimitDisabled": false, "websocketConnectionCleanupDuration": "5m", "websocketClientBlockDuration": "5m" } diff --git a/documentation/docs/configuration.md b/documentation/docs/configuration.md index d2fa3c8ae4..59237788a0 100755 --- a/documentation/docs/configuration.md +++ b/documentation/docs/configuration.md @@ -464,14 +464,15 @@ Example: ### Jsonrpc -| Name | Description | Type | Default value | -| ----------------------------------- | -------------------------------------------------------------- | ------ | ------------- | -| maxBlocksInLogsFilterRange | Maximum amount of blocks in eth_getLogs filter range | int | 1000 | -| maxLogsInResult | Maximum amount of logs in eth_getLogs result | int | 10000 | -| websocketRateLimitMessagesPerSecond | The websocket rate limit (messages per second) | int | 20 | -| websocketRateLimitBurst | The websocket burst limit | int | 5 | -| websocketConnectionCleanupDuration | Defines in which interval stale connections will be cleaned up | string | "5m" | -| websocketClientBlockDuration | The duration a misbehaving client will be blocked | string | "5m" | +| Name | Description | Type | Default value | +| ----------------------------------- | -------------------------------------------------------------- | ------- | ------------- | +| maxBlocksInLogsFilterRange | Maximum amount of blocks in eth_getLogs filter range | int | 1000 | +| maxLogsInResult | Maximum amount of logs in eth_getLogs result | int | 10000 | +| websocketRateLimitMessagesPerSecond | The websocket rate limit (messages per second) | int | 20 | +| websocketRateLimitBurst | The websocket burst limit | int | 5 | +| websocketRateLimitDisabled | Disable rate limiting on the websocket | boolean | false | +| websocketConnectionCleanupDuration | Defines in which interval stale connections will be cleaned up | string | "5m" | +| websocketClientBlockDuration | The duration a misbehaving client will be blocked | string | "5m" | Example: @@ -500,6 +501,7 @@ Example: "maxLogsInResult": 10000, "websocketRateLimitMessagesPerSecond": 20, "websocketRateLimitBurst": 5, + "websocketRateLimitDisabled": false, "websocketConnectionCleanupDuration": "5m", "websocketClientBlockDuration": "5m" } From 1b208bf44a6190d76fdb5c4304b6a2597b54d162 Mon Sep 17 00:00:00 2001 From: cwarnerdev <138500512+cwarnerdev@users.noreply.github.com> Date: Mon, 31 Mar 2025 04:12:44 -1000 Subject: [PATCH 4/5] WebsocketRateLimitDisabled -> WebsocketRateLimitEnabled --- components/webapi/component.go | 2 +- components/webapi/params.go | 2 +- packages/evm/jsonrpc/server.go | 8 ++++---- packages/webapi/services/evm_websocket.go | 2 +- packages/webapi/services/ratelimit_test.go | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/components/webapi/component.go b/components/webapi/component.go index 0afb46496f..82e3a2c9cd 100644 --- a/components/webapi/component.go +++ b/components/webapi/component.go @@ -303,7 +303,7 @@ func provide(c *dig.Container) error { ParamsWebAPI.Limits.Jsonrpc.WebsocketRateLimitBurst, ParamsWebAPI.Limits.Jsonrpc.WebsocketConnectionCleanupDuration, ParamsWebAPI.Limits.Jsonrpc.WebsocketClientBlockDuration, - ParamsWebAPI.Limits.Jsonrpc.WebsocketRateLimitDisabled, + ParamsWebAPI.Limits.Jsonrpc.WebsocketRateLimitEnabled, ), ) diff --git a/components/webapi/params.go b/components/webapi/params.go index 6d4e608d47..5d96b41299 100644 --- a/components/webapi/params.go +++ b/components/webapi/params.go @@ -33,7 +33,7 @@ type ParametersJSONRPC struct { WebsocketRateLimitMessagesPerSecond int `default:"20" usage:"the websocket rate limit (messages per second)"` WebsocketRateLimitBurst int `default:"5" usage:"the websocket burst limit"` - WebsocketRateLimitDisabled bool `default:"false" usage:"disable rate limiting on the websocket"` + WebsocketRateLimitEnabled bool `default:"true" usage:"enable rate limiting on the websocket"` WebsocketConnectionCleanupDuration time.Duration `default:"5m" usage:"defines in which interval stale connections will be cleaned up"` WebsocketClientBlockDuration time.Duration `default:"5m" usage:"the duration a misbehaving client will be blocked"` } diff --git a/packages/evm/jsonrpc/server.go b/packages/evm/jsonrpc/server.go index b05d6cecbf..ca20f79d22 100644 --- a/packages/evm/jsonrpc/server.go +++ b/packages/evm/jsonrpc/server.go @@ -15,7 +15,7 @@ type Parameters struct { Logs LogsLimits WebsocketRateLimitMessagesPerSecond int WebsocketRateLimitBurst int - WebsocketRateLimitDisabled bool + WebsocketRateLimitEnabled bool WebsocketConnectionCleanupDuration time.Duration WebsocketClientBlockDuration time.Duration } @@ -27,7 +27,7 @@ func NewParameters( websocketRateLimitBurst int, websocketConnectionCleanupDuration time.Duration, websocketClientBlockDuration time.Duration, - websocketRateLimitDisabled bool, + WebsocketRateLimitEnabled bool, ) *Parameters { return &Parameters{ Logs: LogsLimits{ @@ -36,7 +36,7 @@ func NewParameters( }, WebsocketRateLimitMessagesPerSecond: websocketRateLimitMessagesPerSecond, WebsocketRateLimitBurst: websocketRateLimitBurst, - WebsocketRateLimitDisabled: websocketRateLimitDisabled, + WebsocketRateLimitEnabled: WebsocketRateLimitEnabled, WebsocketConnectionCleanupDuration: websocketConnectionCleanupDuration, WebsocketClientBlockDuration: websocketClientBlockDuration, } @@ -50,7 +50,7 @@ func ParametersDefault() *Parameters { }, WebsocketRateLimitMessagesPerSecond: 20, WebsocketRateLimitBurst: 5, - WebsocketRateLimitDisabled: false, + WebsocketRateLimitEnabled: true, WebsocketConnectionCleanupDuration: 5 * time.Minute, WebsocketClientBlockDuration: 5 * time.Minute, } diff --git a/packages/webapi/services/evm_websocket.go b/packages/webapi/services/evm_websocket.go index a8c1abb9be..b03dfb92e8 100644 --- a/packages/webapi/services/evm_websocket.go +++ b/packages/webapi/services/evm_websocket.go @@ -107,7 +107,7 @@ func (w *websocketContext) getRateLimiter(remoteIP string) *activityRateLimiter limit := rate.Limit(w.jsonRPCParams.WebsocketRateLimitMessagesPerSecond) burst := w.jsonRPCParams.WebsocketRateLimitBurst - if w.jsonRPCParams.WebsocketRateLimitDisabled { + if !w.jsonRPCParams.WebsocketRateLimitEnabled { limit = rate.Inf burst = 0 } diff --git a/packages/webapi/services/ratelimit_test.go b/packages/webapi/services/ratelimit_test.go index e7ad2ec06b..3789299f13 100644 --- a/packages/webapi/services/ratelimit_test.go +++ b/packages/webapi/services/ratelimit_test.go @@ -8,11 +8,11 @@ import ( ) // TestWebsocketContext_RateLimitDisabled ensures no rate limiting occurs when -// WebsocketRateLimitDisabled is set to true. +// WebsocketRateLimitEnabled is set to false. func TestWebsocketContext_RateLimitDisabled(t *testing.T) { testLogger := log.NewLogger(log.WithName("TestWebsocketContext_RateLimitDisabled")) params := jsonrpc.ParametersDefault() - params.WebsocketRateLimitDisabled = true + params.WebsocketRateLimitEnabled = false wsCtx := newWebsocketContext(testLogger, params) From 4cfe0fcda0c54b96ad3bca858c713af13882afd0 Mon Sep 17 00:00:00 2001 From: cwarnerdev <138500512+cwarnerdev@users.noreply.github.com> Date: Mon, 31 Mar 2025 04:15:20 -1000 Subject: [PATCH 5/5] run gendoc --- config_defaults.json | 2 +- documentation/docs/configuration.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config_defaults.json b/config_defaults.json index f82ccac62d..f38e63efe8 100755 --- a/config_defaults.json +++ b/config_defaults.json @@ -136,7 +136,7 @@ "maxLogsInResult": 10000, "websocketRateLimitMessagesPerSecond": 20, "websocketRateLimitBurst": 5, - "websocketRateLimitDisabled": false, + "websocketRateLimitEnabled": true, "websocketConnectionCleanupDuration": "5m", "websocketClientBlockDuration": "5m" } diff --git a/documentation/docs/configuration.md b/documentation/docs/configuration.md index 59237788a0..939ee0d8d2 100755 --- a/documentation/docs/configuration.md +++ b/documentation/docs/configuration.md @@ -470,7 +470,7 @@ Example: | maxLogsInResult | Maximum amount of logs in eth_getLogs result | int | 10000 | | websocketRateLimitMessagesPerSecond | The websocket rate limit (messages per second) | int | 20 | | websocketRateLimitBurst | The websocket burst limit | int | 5 | -| websocketRateLimitDisabled | Disable rate limiting on the websocket | boolean | false | +| websocketRateLimitEnabled | Enable rate limiting on the websocket | boolean | true | | websocketConnectionCleanupDuration | Defines in which interval stale connections will be cleaned up | string | "5m" | | websocketClientBlockDuration | The duration a misbehaving client will be blocked | string | "5m" | @@ -501,7 +501,7 @@ Example: "maxLogsInResult": 10000, "websocketRateLimitMessagesPerSecond": 20, "websocketRateLimitBurst": 5, - "websocketRateLimitDisabled": false, + "websocketRateLimitEnabled": true, "websocketConnectionCleanupDuration": "5m", "websocketClientBlockDuration": "5m" }