Für Entwickler / JSON-RPC

Fehler und Grenzen

Fünf Fehlercodes tragen alles. -32005 ist der eine, den es lohnt, richtig zu behandeln, denn er bedeutet eine Grenze und keinen Fehler Ihrerseits - dieselbe Anfrage gelingt später.

Die fünf Codes

CodeValue
-32602Invalid paramsa malformed address, block tag, filter id or topic filter
-32601Method not found or not availablean unregistered name, or one refused by design such as eth_sendTransaction
-32000Executiona revert, a decode failure, a signature failure, or a consensus rejection
-32005Limita rate limit, a full queue, a timeout, a size cap or a filter cap - every row on this page
-32603Internala write-ahead-log or coordinator failure; also every non-send error when you are on the WebSocket transport

Der im Betrieb entscheidende Unterschied liegt zwischen -32000 und -32005. Ein Ausführungsfehler ist eine Tatsache über Ihre Transaktion, und ein erneuter Versuch ändert nichts; ein Grenzfehler ist eine Tatsache über die aktuelle Last des Node, und die identische Anfrage gelingt, sobald wieder Platz ist.

Kein error.data

Revert-Gründe können von Ihrer Bibliothek nicht dekodiert werden

A revert arrives as message text - "execution reverted: 0x<returndata>" - and error.data is absent.

Libraries decode custom errors and revert strings out of error.data, so on this chain they cannot. ethers and viem will both surface the raw message instead of a decoded error. If you need the reason, parse the hex out of the message yourself and decode it against your own ABI.

Die Seite zu den Abweichungen hat den Umweg.

Sending a transaction

GrenzeWertVariableBei Überschreitung
Raw transaction sizechecked on the hex string BEFORE decoding, so an oversized transaction is a limit error rather than a decode error128 KiBKonstante zur Übersetzungszeit-32005
Admission queuequeued transactions across all senders4,096 totalADMISSION_CAPACITY-32005 "sequencer admission queue is full"
Per sendercompile-time, so one sender cannot fill the queue with unfillable nonces64Konstante zur Übersetzungszeit-32005
Execution waitthe coordinator's own deadline is 5 s; the call waits until the transaction executes or this expires6 sKonstante zur Übersetzungszeit-32005 "transaction timed out waiting for execution"
Per execution batchMAX_ADMIT_PER_BATCH - a throughput mechanism, not a caller-visible limit512Konstante zur Übersetzungszeit-

Expensive reads

GrenzeWertVariableBei Überschreitung
Token bucket burstguards eth_call, eth_estimateGas and eth_getLogs together256HEAVY_READ_BURST-32005 "rate limit exceeded for expensive read methods"
Refill rateprocess-wide and shared by every caller - explicitly a backstop, not per-client limiting128/sHEAVY_READ_PER_SEC-
eth_getLogs spana span of 5,000 or more is refused outrightunder 5,000 blocksKonstante zur Übersetzungszeit-32005 "log block range is too wide"
eth_getLogs matchesnarrow the filter or walk the range in windows10,000Konstante zur Übersetzungszeit-32005 "eth_getLogs matched too many logs"

The HTTP listener

GrenzeWertVariableBei Überschreitung
Connections512RPC_MAX_CONNECTIONS-
Request bodythe public vhost caps a request at 1 MiB before this applies, and 1 MiB of JSON-RPC batch is already thousands of calls2 MiBRPC_MAX_REQUEST_BYTES-
Response body16 MiBRPC_MAX_RESPONSE_BYTES-
Batch lengthsplit a larger batch client-side32RPC_MAX_BATCH-
Keep-aliveTCP_NODELAY is on30 sRPC_KEEP_ALIVE_SECS-

Filters

GrenzeWertVariableBei Überschreitung
Filters per node1,024MAX_FILTERS-32005 "filter limit reached"
Buffer per filterthe OLDEST entries are trimmed when you stop polling, so a slow poller loses the beginning of its backlog rather than the end1,024 entriesMAX_FILTER_BUFFER-
Idle expirymeasured since the last poll, and expiry is silent - the next poll answers -32602 "filter not found"300 sFILTER_TTL_SECS-32602

Zwei Werte, die keine Konfiguration sind

MIN_GAS_PRICE (1 wei) und EXECUTION_SPEC (Cancun) sehen aus wie Einstellungen und sind bewusst Konstanten zur Übersetzungszeit.

Both are compile-time constants rather than environment variables, and that is a correctness requirement rather than an oversight. Either one made operator-tunable would let a replica reject or re-price a transaction the leader had accepted, and derivation would halt on the divergence. Pinning the hardfork also means a revm upgrade cannot silently change gas accounting underneath an already-settled chain.

Grenzen richtig behandeln

Es gibt weder eine Ratenbegrenzung pro Client noch einen Header mit dem verbleibenden Budget, ein Client kann sich also nicht anhand eines Signals selbst drosseln - er muss von Bauart aus wohlerzogen sein. Drei Dinge zählen:

  • Bei -32005 zurückweichen, nicht sofort erneut versuchen. Der Eimer für schwere Lesezugriffe wird von allen Aufrufern geteilt, eine enge Wiederholungsschleife ist also der schnellste Weg, ihn für alle leer zu halten, Sie eingeschlossen.
  • Fenstern Sie Ihre eth_getLogs-Bereiche unter 5.000 Blöcke und rechnen Sie mit der Treffer-Obergrenze bei 10.000. Auf einer Chain, die etwa zwei Minuten an Blöcken aufbewahrt, ist die praktische Grenze, auf die Sie zuerst stoßen, die Aufbewahrung und nicht die Spanne.
  • Halten Sie Batches bei 32. Darüber wird der Batch abgelehnt statt gekürzt.
javascript
// RPC_URL: https://rpc.picklechain.xyz on the public testnet, or a node of your own.
async function call(body, attempt = 0) {
  const res = await fetch(RPC_URL, {
    method: "POST",
    headers: { "content-type": "application/json" },
    body: JSON.stringify(body),
  });
  const json = await res.json();

  // -32005 is a limit, not a mistake: the same request works later.
  if (json.error?.code === -32005 && attempt < 5) {
    await new Promise((r) => setTimeout(r, 2 ** attempt * 250));
    return call(body, attempt + 1);
  }
  return json;
}