-
Notifications
You must be signed in to change notification settings - Fork 827
Client: make JSON-RPC payload limits configurable for eth and engine servers #3993
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 1 commit
0eba2ce
dd46b41
5e47e75
91a2c93
dcfa7fa
c0af203
c5defc6
95aae7c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -196,6 +196,16 @@ export function getArgs(): ClientOpts { | |
boolean: true, | ||
default: true, | ||
}) | ||
.option('rpcEthMaxPayload', { | ||
describe: 'Define max JSON payload size for eth/debug RPC requests', | ||
string: true, | ||
default: '5mb', | ||
}) | ||
.option('rpcEngineMaxPayload', { | ||
describe: 'Define max JSON payload size for engine RPC requests', | ||
string: true, | ||
default: '15mb', | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you point this to |
||
}) | ||
.option('jwtSecret', { | ||
describe: 'Provide a file containing a hex encoded jwt secret for Engine RPC server', | ||
coerce: (arg: string) => (arg ? path.resolve(arg) : undefined), | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -346,6 +346,16 @@ export interface ConfigOptions { | |
* Enables Prometheus Metrics that can be collected for monitoring client health | ||
*/ | ||
prometheusMetrics?: PrometheusMetrics | ||
|
||
/** | ||
* Max JSON payload size for eth/eth RPC requests (untrusted) | ||
*/ | ||
rpcEthMaxPayload?: string | ||
|
||
/* | ||
* Max JSON payload size for engine RPC requests (trusted) | ||
*/ | ||
rpcEngineMaxPayload?: string | ||
} | ||
|
||
export class Config { | ||
|
@@ -356,7 +366,7 @@ export class Config { | |
public readonly events: EventEmitter<EventParams> | ||
|
||
public static readonly CHAIN_DEFAULT = Mainnet | ||
public static readonly SYNCMODE_DEFAULT = SyncMode.Full | ||
public static readonly SYNCMODE_DEFAULT = SyncMode.None | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is this changed? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sorry changed it while testing, fixing it now |
||
public static readonly DATADIR_DEFAULT = `./datadir` | ||
public static readonly PORT_DEFAULT = 30303 | ||
public static readonly MAXPERREQUEST_DEFAULT = 100 | ||
|
@@ -365,6 +375,8 @@ export class Config { | |
public static readonly MINPEERS_DEFAULT = 1 | ||
public static readonly MAXPEERS_DEFAULT = 25 | ||
public static readonly DNSADDR_DEFAULT = '8.8.8.8' | ||
public static readonly RPC_ETH_MAXPAYLOAD_DEFAULT = '5mb' | ||
jochem-brouwer marked this conversation as resolved.
Show resolved
Hide resolved
|
||
public static readonly RPC_ENGINE_MAXPAYLOAD_DEFAULT = '15mb' | ||
public static readonly EXECUTION = true | ||
public static readonly NUM_BLOCKS_PER_ITERATION = 100 | ||
public static readonly ACCOUNT_CACHE = 400000 | ||
|
@@ -458,6 +470,9 @@ export class Config { | |
|
||
public readonly blobsAndProofsCacheBlocks: number | ||
|
||
public readonly rpcEthMaxPayload: string | ||
public readonly rpcEngineMaxPayload: string | ||
|
||
public synchronized: boolean | ||
public lastSynchronized?: boolean | ||
/** lastSyncDate in ms */ | ||
|
@@ -563,6 +578,9 @@ export class Config { | |
this.blobsAndProofsCacheBlocks = | ||
options.blobsAndProofsCacheBlocks ?? Config.BLOBS_AND_PROOFS_CACHE_BLOCKS | ||
|
||
this.rpcEthMaxPayload = options.rpcEthMaxPayload ?? Config.RPC_ETH_MAXPAYLOAD_DEFAULT | ||
this.rpcEngineMaxPayload = options.rpcEngineMaxPayload ?? Config.RPC_ENGINE_MAXPAYLOAD_DEFAULT | ||
|
||
this.discDns = this.getDnsDiscovery(options.discDns) | ||
this.discV4 = options.discV4 ?? true | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,6 +32,7 @@ describe('[Util/RPC]', () => { | |
const httpServer = createRPCServerListener({ | ||
server, | ||
withEngineMiddleware: { jwtSecret: new Uint8Array(32) }, | ||
maxPayload: '15mb', | ||
}) | ||
const wsServer = createWsRPCServerListener({ | ||
server, | ||
|
@@ -74,6 +75,7 @@ describe('[Util/RPC]', () => { | |
const httpServer = createRPCServerListener({ | ||
server, | ||
withEngineMiddleware: { jwtSecret: new Uint8Array(32) }, | ||
maxPayload: '15mb', | ||
}) | ||
const wsServer = createWsRPCServerListener({ | ||
server, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you add a test here to verify that for both engine/eth the config is handled correctly? You can likely just set it to some low limit and then try to push more data over the RPC than the limit to verify that it fails. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done ✅ |
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm fine with these limits, but could you motivate this choice?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you also point these to
RPC_ENGINE_MAXPAYLOAD_DEFAULT
(also for eth)?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For the
eth
RPC size limit, I based it on the average block sizes observed on Etherscan. The highest daily average recorded was ~0.25 MB, so I multiplied it by 20 in anticipation of more intensive use of block space.For the
engine
RPC size limit, according to EIP-4844 the total maximum blob data per block is ~0.75 MB, and I also multiplied it by 20.This provides a safety margin while still avoiding excessive resource usage. Maybe that's too much, what do you think? 🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So the eth RPC engine is intended to be used by "third parties" and it is OK to expose this port to others. For instance providers like Infura/Quicknode also expose those. Also note that this is the limit of incoming messages, so actual requests. Not the reports. So for
eth
one could requesteth_getBlock
and this request itself would be very small (just a block hash or number). But the response will be bigger (block itself).For engine, this is a trusted RPC endpoint and one can only reach it with authentication. This is also the endpoint from which the consensus layer (CL) will send new payloads (new block-like requests). So we can up that limit.
I'm fine with these limits but just wanted to check your motivation, thanks 😄 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the clarification!
I’ll make sure to better explain my motivations in future PRs 🫡