Repository navigation
Releases: aztec-labs-eng/aztec-node
Release list
v6.0.0
v5 L1 ▕░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▏ L2 24–108s
v6 L1 ▕████████▏ L2 12–30s
A Z T E C · 6 · 0 · 0
Date: 2026-10-22 · Tag: v6.0.0 · Baseline: v5.2.0 · Major release
Install: aztec-up install 6.0.0 · Docker: azteclabs/aztec:6.0.0 (note the new Docker Hub organization)
Summary
v6 is the new Aztec rollup deployment proposed in AZUP-3. It is a major protocol upgrade, and upgrading to v6.0.0 is required for everyone. The new rollup becomes canonical on Mainnet no earlier than Monday 26 October 2026, 08:00 UTC, and Testnet upgrades at the same time.
Node operators: two breaking changes. A trace-capable L1 endpoint is now required by default, and the Docker image moved to the azteclabs Docker Hub organization. See Breaking changes for node operators.
Almost everything you pull from has moved: the Docker image is now published under azteclabs (azteclabs/aztec), the npm packages are now under @aztec-labs and @aztec-foundation, and Aztec.nr is now published from aztec-labs-eng/aztec-nr.
Breaking changes for node operators
-
A trace-capable L1 endpoint is required by default (#511).
ETHEREUM_ALLOW_NO_DEBUG_HOSTSnow defaults tofalse: the node refuses to start unlessETHEREUM_DEBUG_HOSTS(orETHEREUM_HOSTS) servesdebug_traceTransactionortrace_transaction. Without traces, a node silently stops syncing at the first checkpoint published through a non-standard contract. Set the flag totrueto accept that risk. -
The Docker image moved to the
azteclabsDocker Hub organization:azteclabs/aztec(andazteclabs/aztec-prover-agent). The image name is unchanged, butaztecprotocol/aztechas no v6 releases; a compose file still pointing at it pulls v5.- image: aztecprotocol/aztec:5.2.0 + image: azteclabs/aztec:6.0.0
When to switch on Mainnet
Option 1 (recommended): standby. Start a v6 node next to your v5 node any time before the execution date. At startup it compares the canonical rollup's genesis archive root, VK tree root and protocol contracts hash with its own. While v5 is canonical they differ, so the node enters standby: it serves only a health endpoint (which reports healthy), checks L1 once a minute, and uses very few resources. When the v6 rollup becomes canonical it logs Compatible rollup found and starts normally, with nothing for you to do.
- Run it on a separate host, or give it its own container name,
AZTEC_PORTandP2P_PORT. Standby binds the HTTP port as soon as it starts, and the node binds the P2P port when it leaves standby, so reusing the v5 values makes it fail. - Use a new, empty data directory.
- Leave
ROLLUP_VERSIONunset so the node follows the canonical rollup. Pinning it to the v6 rollup's version makes the node fail at startup, because that version is not in the registry until the proposal executes. - Keep your v5 node running until the v6 node has left standby and is attesting.
Option 2: upgrade at execution time. Stop the v5 node and start v6 on Monday 26 October 2026 at 08:00 UTC, or as soon after as the proposal executes. Your sequencer is idle until the v6 node has started and synced. Slashing is disabled for the first 8,400 slots (about 7 days) after the v6 rollup becomes canonical, so the slots you miss while starting up cost you rewards but do not get you slashed.
High-availability signing on a shared PostgreSQL database: v5 nodes delete other rollups' signing records when they start (#352 fixes this in v6 only). Give your v6 replicas their own database, or do not restart v5 replicas after the switch, so the v6 replicas keep their double-signing protection.
Full operator migration guide: v6.0.0 operator changelog.
Breaking changes
Everything below applies to every project moving from v5.2.0.
Where things live
-
[Docker]The image moved to theazteclabsDocker Hub organization:azteclabs/aztec(andazteclabs/aztec-prover-agent).aztecprotocol/aztechas no v6 releases; a compose file still pointing at it pulls v5.- image: aztecprotocol/aztec:5.2.0 + image: azteclabs/aztec:6.0.0
-
[npm]Packages moved to@aztec-labs(#93), and the foundation packages (bb.js, thenoir-*packages,l1-artifacts, and others) to@aztec-foundation(#113). Subpaths are unchanged beyond the scope. The@aztecscope keeps everything already published, so v5 projects keep installing.-import { Contract } from '@aztec/aztec.js'; +import { Contract } from '@aztec-labs/aztec.js';
-
[npm]The packages depend on upstreamviem, not the@aztec/viemfork (#304). If you aliasedviemto the fork, depend on upstreamviemat the version@aztec-labs/aztec.jsuses. -
[Aztec.nr]Aztec.nr is published fromaztec-labs-eng/aztec-nr.AztecProtocol/aztec-nrhas no v6 tags, so bumping onlytagfails withRemote branch v6.x.x not found. Updategitas well (#135):-aztec = { git = "https://github.com/AztecProtocol/aztec-nr", tag = "v5.2.0", directory = "aztec" } +aztec = { git = "https://github.com/aztec-labs-eng/aztec-nr", tag = "v6.0.0", directory = "aztec" }
-
[Aztec.nr]The ECDSA note and the protocol contract interfaces ship with aztec-nr (#404). Depend on them fromaztec-labs-eng/aztec-nrat the same tag asaztec. Pulling them from the old repositories brings in a second copy ofaztecand fails withNo matching impl found.
Protocol: every address changes, every contract recompiles
- The contract address domain separator is bumped to V3, so every contract address, account addresses included, differs from v5 for the same class, salt, initialization and keys. This is deliberate: an address can never be live on two rollups at once. Anything that hard-codes an address must be updated. Protocol contracts keep their magic addresses (
1,2, ...). - Block headers commit to a per-block tx effects tree (#123). A block header alone now proves a transaction's inclusion and exact effects with a short membership proof. Every transaction hash, verification key, contract artifact and canonical address changes with it.
- The protocol nullifier is derived from the tx request's salt alone (#310). Two transactions with the same origin and salt (a fee bump or a cancellation) are mutually exclusive: at most one is mined.
tx_request_saltin the private context becomesprotocol_nullifier. Wallets must draw a fresh salt for every transaction. Contracts need only a recompile. - The standard contracts are at new addresses.
MultiCallEntrypoint,HandshakeRegistry,AuthRegistryandPublicChecksare all re-pinned. Handshakes made with the v5 registry must be re-established. - The PXE oracle interface is now version 33. Contracts must be recompiled against Aztec.nr v6.0.0 to run against a v6 PXE.
Aztec.nr
-
Fact collections are scoped by
FactScopeinstead of anAztecAddress(#426).FactScope::account(address)is the old behaviour; the newFactScope::public()is shared by all accounts.- record_retractable_fact(contract_address, recipient, type_id, collection_id, fact_type_id, payload, origin_block); + record_retractable_fact(contract_address, FactScope::account(recipient), type_id, collection_id, fact_type_id, payload, origin_block);
-
OriginBlockis replaced byaztec::oracle::block_reference::BlockReference, with the same fields (#157). -
Nullifier existence checks are batched:
get_nullifier_statuseschecks any number of nullifiers in one oracle call and reports each one's inclusion block.check_nullifier_existsstill works (#157). -
Writer::advance_offsetis removed. Serialize the skipped fields instead (#387). -
DelayedPublicMutablerejects delays below one hour, at compile time for the initial delay and at runtime inschedule_delay_change(#99). -
Nine
DOM_SEP__*constants left the protocol constants module.DOM_SEP__PARTIAL_NOTE_COMMITMENTandDOM_SEP__NOTE_COMPLETION_LOG_TAGmove toaztec::note::partial_note; the other seven are now internal. Custom account entrypoints should callcompute_tx_nullifierinstead of hashingDOM_SEP__TX_NULLIFIERthemselves (AztecProtocol/aztec-packages#25014).
Aztec.js
-
Protocol contract wrappers moved to
@aztec-labs/aztec.js/protocoland out of@aztec-labs/noir-contracts.js. They are bound to their canonical address, so they attach withwithWallet(wallet).at(wallet)still works but is deprecated (AztecProtocol/aztec-packages#24998).- import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice'; + import { FeeJuiceContract } from '@aztec-labs/aztec.js/protocol'; - const feeJuice = FeeJuiceContract.at(ProtocolContractAddress.FeeJ...
v6.0.0-rc.1
Caution
DO NOT RUN THIS ON MAINNET. v6.0.0-rc.1 is a release candidate for testnet only. Mainnet stays on v5 until the v6 governance upgrade executes there. Keep mainnet nodes on aztecprotocol/aztec:5.2.0.
Upgrading is optional. v6 has been the canonical rollup on testnet since 2026-09-28 (rollup 0x8c2fb2A68A3d362ab1DE99E06F83f8903160BbD9), and this release runs a node against it.
The v6 migration guide is here and the v6.0.0-rc.1 image is here.
Before you start
- New Docker image name. The image moved from
aztecprotocol/aztectoazteclabs/aztec. The old repository has no v6 releases. - Use a fresh data directory. v6 is a new rollup and syncs from its own genesis. v5 state doesn't carry over.
- L1 RPC history. Your L1 execution RPC must serve
eth_getLogsback to the v6 Inbox deployment block.