v5.2.0
Overview
Migration difficulty: low. No action is required. Every new setting defaults to the previous behaviour, protocol constants are unchanged, and v5.1.0 and v5.2.0 nodes interoperate, so you can roll your fleet in any order with no downtime window.
Behaviour changes
A node whose p2p service fails to start now exits
Previously a node whose libp2p stack failed to start kept running with a dead p2p service: peerless, silently useless, and indistinguishable from a healthy node in the process table. It now logs Failed to start p2p service at fatal and aborts startup. The usual cause is the TCP listener failing to bind, so free or change the P2P port and restart.
A peerless node stops acting
While a node has zero connected peers it:
- warns periodically that gossip and transaction propagation are unavailable,
- skips building and proposing checkpoints while below
SEQ_MIN_PEERS_TO_PROPOSE(default1), - does not file data-withholding slashing offenses for slots probed while peerless,
- rejects incoming
sendTxcalls rather than dropping them silently.
L1-only duties (governance and slashing votes, prune, invalidation) still run, and setups that disable p2p entirely are unaffected. Set SEQ_MIN_PEERS_TO_PROPOSE=0 to restore the previous proposing behaviour.
You are warned when the network votes to slash your validators
The node logs Own validator 0x... targeted by slashing vote (N of Q votes needed to slash) on every vote naming one of your attesters, and Own validator 0x... was slashed for ... once a round executes. The same signal is exported as metrics: alert on aztec_slasher_own_validator_current_round_votes_max against aztec_slasher_quorum_size. See Metrics reference.
L1 event watching moved off eth_newFilter
L1 event watchers now poll eth_getLogs over a bounded block range instead of installing server-side filters. Behind a load-balanced RPC provider, filter polls could be routed to a backend that had never seen the filter, producing request storms of 30 to 40 req/s while silently missing slashing and governance events. Hosted providers no longer need to support filter methods.
A stale governance payload no longer wastes gas
A sequencer left with an outdated GOVERNANCE_PROPOSER_PAYLOAD kept signalling a payload that had already executed, burning roughly 100k gas per slot. The node now detects a live or already-executed proposal for the configured payload and stops signalling. Set GOVERNANCE_PROPOSER_FORCE_PAYLOAD_VOTE=true to keep signalling anyway.
GET /status returns a JSON body
The status endpoint previously set only an HTTP status code. It now also returns per-component health as JSON, for example { "ok": true, "components": { "p2p": { "healthy": true, "enabled": true, "connectedPeers": 12 } } }. Consumers that only read the HTTP status code are unaffected.
JSON-RPC internal errors use code -32603
Internal server failures returned -32600 ("Invalid Request"); they now return -32603 ("Internal error"), which is what the JSON-RPC 2.0 specification defines. Genuine malformed requests still return -32600.
New configuration
All defaults preserve v5.1.0 behaviour. See the CLI reference for the full flag list.
| Environment variable | Flag | Default | What it does |
|---|---|---|---|
SEQ_MIN_PEERS_TO_PROPOSE | --sequencer.minPeersToPropose | 1 | Minimum connected peers required to build and propose a checkpoint. 0 disables the gate. |
P2P_HEALTH_MIN_PEERS | --p2p.p2pHealthMinPeers | 0 | Peer count below which the p2p component reports unhealthy on /status. 0 never fails. |
GOVERNANCE_PROPOSER_FORCE_PAYLOAD_VOTE | --sequencer.governanceProposerForcePayloadVote | false | Keep signalling the configured governance payload even after its proposal went live or executed. |
RPC_HTTP_KEEP_ALIVE_TIMEOUT_MS | --rpc-http-keep-alive-timeout-ms | 5000 | HTTP keep-alive timeout for JSON-RPC connections. |
RPC_HTTP_HEADERS_TIMEOUT_MS | --rpc-http-headers-timeout-ms | 60000 | Timeout for receiving complete HTTP headers on JSON-RPC connections. |
RPC_CORS_ALLOWED_HEADERS | --rpc-cors-allowed-headers | empty | Headers allowed in cross-origin JSON-RPC requests. |
RPC_CORS_ALLOWED_ORIGINS | --rpc-cors-allowed-origins | empty | Origins allowed to make credentialed cross-origin JSON-RPC requests. |
RPC_CORS_ALLOW_ANY_ORIGIN | --rpc-cors-allow-any-origin | false | Allow credentialed cross-origin JSON-RPC requests from any origin. |
USE_AWS_LOGGING | false | Map log levels to AWS severity values. |
Reliability and performance
- Prover memory. The prover stack held every checkpoint's transactions, circuit inputs, and proofs in memory long after they were needed, some of it duplicating data already on disk. That data is now released promptly and read back from disk on demand.
- Epoch proving retries instead of giving up. An epoch is declared failed only when its submission window expires, not on the first fault. A chain prune during proving no longer counts as a failure, stuck epochs are not pointlessly re-proved, and per-checkpoint failure diagnostics are uploaded as they happen.
- Mempool. Incoming gossiped transactions are no longer held up by the pool's background archiving work, and every transaction dropped from the mempool during block building is logged at warn with its reason.
- Archiver. Reorged blocks are fully cleaned up, including blocks whose transactions were re-included elsewhere, and a race reading L2 to L1 message proofs is fixed.
- Sync. A race causing spurious
block_not_availableerrors is fixed. - L1. Spurious "insufficient funds" errors when simulating L1 calls are fixed, and the KZG trusted setup loads at startup rather than stalling the first blob operation.
- Slashing accountability. Block proposals containing invalid transactions are now correctly flagged as slashable; an error in transaction validation previously let such proposers escape accountability.
- Observability. JSON-RPC servers report request-level metrics, and JSON-RPC clients accept and send cookies so load balancers using session affinity work.
Security
Everything the node parses from untrusted input now has explicit size bounds, closing memory-exhaustion holes: tree sibling paths and vectors are bounded, arrays in the Tx and HashedValues schemas are capped, simulation overrides and checkpoint queries on the RPC surface are capped, and gaps in checkpoint block-shape and block-count validation are closed. Most of this lives in shared serialization code, so clients talking to a node they do not trust get the same protection.