___
/\ \
/::\ \
/:/\:\ \
/:/ \:\ \
/:/__/ \:\__\
\:\ \ /:/ /
\:\ /:/ /
\:\/:/ /
\::/ /
\/ /
___
/\ \
/::\ \
/:/\:\ \
/:/ \:\ \
/:/__/ \:\__\ ╔═══════════════════════════════════════╗
\:\ \ \/__/ ║ ║
\:\ \ ║ A L P H A I S C O M I N G ║
\:\ \ ║ ║
\:\__\ ║ aztec-packages ║
\/__/ ║ v4.1.0-rc.4 ║
╚═══════════════════════════════════════╝
████████████████
███░░░░░░░░░░░░░░░███
██░░░░░░░░░░░░░░░░░░░░░██
█░░░░░░░▓▓▓▓▓▓▓▓▓░░░░░░░░█
█░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░█
█░░░░░▓▓▓▓▓░░░░░░░▓▓▓▓░░░░░░░█
█░░░░▓▓▓▓░░░░░░░░░░░▓▓▓░░░░░░█
█░░░▓▓▓▓░░░░░████░░░░▓▓▓░░░░░█
█░░░▓▓▓░░░░██ ██░░░▓▓░░░░░█
█░░░▓▓▓░░░██ ▲▲ ██░░▓▓░░░░░█
█░░░▓▓▓░░░██ ▲▲ ██░░▓▓░░░░░█
█░░░▓▓▓░░░░██ ██░░░▓▓░░░░░█
█░░░▓▓▓▓░░░░░████░░░░▓▓▓░░░░░█
█░░░░▓▓▓▓░░░░░░░░░░░▓▓▓░░░░░░█
█░░░░░▓▓▓▓▓░░░░░░░▓▓▓▓░░░░░░░█
█░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░█
█░░░░░░░▓▓▓▓▓▓▓▓▓░░░░░░░░█
██░░░░░░░░░░░░░░░░░░░░░██
███░░░░░░░░░░░░░░░███
████████████████
Summary
Release 4.1.0-rc.4 is a mandatory upgrade for node operators running on Testnet. This release candidate is intended to be promoted to the first stable release of protocol version 4, which is what operators will run on the Alpha network.
The following describes major changes since the last release candidate (4.1.0-rc.2). The upcoming stable release will contain a comprehensive list of all major changes from protocol version 2.
Breaking Changes
-
L2-to-L1 message witness API redesigned (#21231): The API now takes
(message, txHash)instead of requiring the epoch number, which was difficult to obtain. Duplicate messages within a transaction are now supported via an optionalmessageIndexInTxparameter. The relatedgetL1ToL2MessageBlockmethod has been renamed togetL1ToL2MessageCheckpointand returns a checkpoint number instead of a block number. -
Offchain effects exposed in
simulate()andsend()(#21110): Contract interaction results now include offchain effects (public events, private logs) alongside the transaction result. Callers that destructure the return value will need to update. -
Public event pagination on wallet (#21197): Public event queries on the wallet API now accept pagination parameters (
from,limit), matching the existing node API.
Node Improvements
-
Early rejection of oversized transactions (#21219): Transactions exceeding the block or checkpoint mana limit are now rejected at gossip, RPC, and pending pool entry points. Previously, these were silently dropped during block building, causing
.wait()to hang indefinitely. -
Public log filtering by tag (#21561): Public logs can now be filtered by tag. Also fixes a bug where combining
afterLogwithtxHashfilters caused thetxHashto be ignored. -
Rollup compatibility pre-checks (#21537): Nodes now verify VK tree root and protocol contracts hash against L1 before starting, preventing startup against a rollup deployed with incompatible circuits.
-
Public setup allowlist hardened (#21154, #21139, #21129): Non-protocol contracts (Token-class entries) removed from the default allowlist — Token class IDs change with aztec-nr releases, making the list hard to maintain. Calldata length validation added to reject malformed setup calls. Node operators who need custom Token FPC support must manually extend the allowlist.
PublicFeePaymentMethodandPrivateFeePaymentMethodare deprecated. -
Checkpoint-based L1-to-L2 message readiness (#20913): Message readiness is now checked against checkpoint numbers instead of block numbers, reflecting how messages are actually grouped on L1.
-
Package version in RPC headers (#21526): RPC responses now include an
x-aztec-packageVersionheader for easier debugging and monitoring. -
P2P priority fee simplification (#21420): The tx pool now uses only the L2 priority fee for transaction ordering, simplifying priority computation across gas dimensions.
Bug Fixes
-
Reorg log deletion fix (#21687): During reorgs,
deleteLogswas removing the entire log entry for a tag instead of only the logs from rolled-back blocks, causing logs from earlier blocks to be permanently lost. -
HA deadlock on last block (#21690): Fixed a deadlock when creating checkpoint proposals for the last block in an epoch by reordering the sign-then-checkpoint sequence.
-
Broadcasted function storage (#21686): Only the first contract class's functions were stored when multiple classes had broadcasts in the same block, due to an early return in the loop.
-
Block proposal race condition (#21336): Validators now wait for the archiver to sync L1 data up to slot
N-1before processing a block proposal for slotN, preventing false rejections when a checkpoint prune hasn't been processed yet. -
findLeavesIndexesmisalignment (#21327):undefinedgaps in results caused wrong block numbers to be mapped to wrong leaves. Replaced array-index-based lookups with Maps. -
Priority fee inflation (#21279): Transactions with a max priority fee greater than their max fee could get unfairly high mempool priority. The priority fee is now capped.
-
Blob gas estimation flakiness (#21323): Added 2x buffer to
maxFeePerBlobGasduring gas estimation to prevent intermittent EIP-4844 validation failures when the blob base fee changes between RPC calls. Also fixed integer truncation in the fee bump loop at small values. -
Finalized block lookback (#21597): Updated the heuristic to account for checkpoints (4 blocks each) instead of individual blocks, preventing premature finalization.
-
Testnet slashing penalties (#21722): All penalty values aligned with
AZTEC_SLASH_AMOUNT_SMALL(100,000 TST). Previously, the per-offense penalty of 10 TST was below the minimum threshold, causing all slash votes to compute as zero. -
Orchestrator event loop starvation (#21247, #21286): Proving job enqueuing now uses a serial queue and only gates the enqueue operation, giving the event loop room to breathe.
-
Prover parallelism default (#21320): Reduced default
MAX_PARALLEL_BLOCKSfrom 32 to 4 to better match available CPU resources. -
CLI version detection (#21382):
aztec --versionno longer returnsunknownwhen installed viainstall.aztec.network. -
P2P validation reporting (#21185): When multiple validators fail, the most severe failure is now reported instead of whichever appeared first.
-
Non-validator block handling (#21105): Replaced the limited default block handler with the full block proposal handler for non-validator nodes, fixing issues with out-of-order proposals and missed validations.
-
Private kernel reset hints (#20760): Fixed the hints builder to correctly handle note hash squashing when future logs are linked, and to use contract address to distinguish pending vs settled read requests.
-
Proving job ID performance (#21292): Switched from
hash.jsSHA-256 to Node's nativecrypto.createHash, significantly speeding up hashing of multi-megabyte buffers sent to the broker.
BB / AVM
-
AVM thread pool deadlock eliminated (#21138): AVM NAPI simulations now run on dedicated
std::threads instead of the libuv thread pool. Previously, simulations and their JS callback I/O competed for the same libuv threads, causing deadlocks in multi-sequencer setups. This removes the need for carefulUV_THREADPOOL_SIZEtuning. -
Chonk proof compression (#20645, #21067): New compression scheme stores EC points as
(x, sign_bit)and packs fields as u256, achieving ~1.7x compression (60 KB → 35 KB). Adapted for v4's Translator proof layout. -
arm64-linux AVM transpiler (#20814): Fixed cross-compilation for arm64-linux.
-
Prover broker standby mode (#21098): The prover broker now waits for a compatible L1 rollup before starting, instead of crashing on incompatible rollup contracts.
-
barretenberg-rson crates.io (#20496): Addedcargo publishsupport to the release flow.
Aztec.nr
- Ciphertext field masking (#21140): All ciphertext fields are now masked with Poseidon2-derived values. Previously, AES-encrypted logs packed bytes at 31 per field (never exceeding 2^248), allowing observers to distinguish them from other log types. Now all fields appear as uniformly random values. Migration:
get_random_byteshas been removed fromaztec::utils::random— useaztec::oracle::randomdirectly.
Aztec.js
Option<T>conversions (#21107): Added ergonomicFrom/Intoconversions for Noir'sOption<T>type, making it straightforward to call contract functions with optional parameters.
Configuration Changes
- Slasher penalties tuned for mainnet: inactivity target lowered to 0.7, duplicate proposal/attestation penalties disabled, grace period increased to 8400 slots, per-block allocation multiplier reduced to 1.2 (#21451)
SEQ_MAX_TX_PER_BLOCKrenamed toSEQ_MAX_TX_PER_CHECKPOINT(#21165)- Default snapshot URL and multiplier configs removed from deployment scripts in favor of network config JSON (#21412, #21413)
- Lighthouse consensus client bumped from v7.1.0 to v8.0.1 (#21170)
All Changes
59 commits since v4.1.0-rc.2
- feat!: improve L2ToL1MessageWitness API (#21231)
- feat!: Expose offchain effects when simulating/sending txs (#21110)
- feat!: exposing pub event pagination on wallet (#21197)
- feat: add public log filtering by tag (#21561)
- feat(ethereum): check VK tree root and protocol contracts hash in rollup compatibility (#21537)
- feat(rpc): add package version to RPC response headers (#21526)
- feat: rollup mana limit gas validation (#21219)
- feat(p2p): use l2 priority fee only for tx priority (#21420)
- feat: Remove non-protocol contracts from public setup allowlist (#21154)
- feat: calldata length validation of public setup function allowlist (#21139)
- feat: reenable function selectors + additional validation in public setup allowlist (#21129)
- feat: Update L1 to L2 message APIs (#20913)
- feat: run AVM NAPI simulations on dedicated threads instead of libuv pool (#21138)
- feat: standby mode for prover broker (#21098)
- feat: orchestrator enqueues via serial queue (#21247)
- feat: mask all ciphertext fields with Poseidon2-derived values (#21140)
- feat: add ergonomic conversions for Noir's
Option<T>(#21107) - fix: only delete logs from rolled-back blocks, not entire tag (#21687)
- fix: align testnet slashing penalties with L1 slash amounts (#21722)
- fix: process all contract classes in storeBroadcastedIndividualFunctions (#21686)
- fix: HA deadlock for last block edge case (#21690)
- fix(archiver): update finalized block lookback to account for checkpoints (#21597)
- fix(validator): wait for l1 sync before processing block proposals (#21336)
- fix(node): fix index misalignment in findLeavesIndexes (#21327)
- fix(txpool): cap priority fee with max fees when computing priority (#21279)
- fix: (A-643) add buffer to maxFeePerBlobGas for gas estimation (#21323)
- fix: orchestrator enqueue yield (#21286)
- fix: limit parallel blocks in prover to max AVM parallel simulations (#21320)
- fix: use native sha256 to speed up proving job id generation (#21292)
- fix: fall back to package.json for CLI version detection (#21382)
- fix(p2p): report most severe failure in runValidations (#21185)
- fix(p2p): remove default block handler in favor of block handler (#21105)
- fix(log): do not log validation error if unregistered handler (#21111)
- fix(sequencer): fix log when not enough txs (#21297)
- fix: omit bigint priceBumpPercentage from IPC config in testbench worker (#21086)
- fix: update private kernel reset hints builder (#20760)
- fix: backport arm64-linux avm-transpiler cross-compilation (#20814)
- fix: adapt chonk proof compression for v4 Translator layout (#21067)
- fix: update dependencies (#20997)
- fix: bump lighthouse consensus client v7.1.0 -> v8.0.1 (#21170)
- fix: Simulate gas in n tps test (#21329)
- chore: tune mainnet slasher penalties and sequencer allocation (#21451)
- chore: chonk proof compression poc (#20645)
- chore: prepare barretenberg-rs for crates.io publishing (#20496)
- chore: Read tx filestores from network config (#21416)
- chore: reduce severity of errors due to HA node not acquiring signature (#21311)
- chore: code deduplication + refactor (public setup allowlist) (#21200)
- chore: New alpha-net environment (#21202)
- chore: Reduce log spam (#21436)
- chore: Removed default snapshot url config (#21413)
- chore: Removed multiplier config (#21412)
- chore: deploy SPONSORED_FPC in test networks (#21254)
- chore: disable sponsored FPC in testnet (#21235)
- chore: More updated Alpha configuration (#21165)
- chore: backport tally slashing pruning improvements (#21166)
- chore: default multiplier (#21482)
- chore: remove stale aes comments (#21133)
- refactor(pxe): narrow tryGetPublicKeysAndPartialAddress return type (#21236)
- docs: clarifying Noir fields vs struct fields in event metadata (#21172)