Skip to content

Releases: aztec-labs-eng/aztec-node

v6.0.0

Choose a tag to compare

@aminsammara aminsammara released this 22 Oct 11:28
d2e67c1
   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_HOSTS now defaults to false: the node refuses to start unless ETHEREUM_DEBUG_HOSTS (or ETHEREUM_HOSTS) serves debug_traceTransaction or trace_transaction. Without traces, a node silently stops syncing at the first checkpoint published through a non-standard contract. Set the flag to true to accept that risk.

  • The Docker image moved to the azteclabs Docker Hub organization: azteclabs/aztec (and azteclabs/aztec-prover-agent). The image name is unchanged, but aztecprotocol/aztec has 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_PORT and P2P_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_VERSION unset 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 the azteclabs Docker Hub organization: azteclabs/aztec (and azteclabs/aztec-prover-agent). aztecprotocol/aztec has 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, the noir-* packages, l1-artifacts, and others) to @aztec-foundation (#113). Subpaths are unchanged beyond the scope. The @aztec scope 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 upstream viem, not the @aztec/viem fork (#304). If you aliased viem to the fork, depend on upstream viem at the version @aztec-labs/aztec.js uses.

  • [Aztec.nr] Aztec.nr is published from aztec-labs-eng/aztec-nr. AztecProtocol/aztec-nr has no v6 tags, so bumping only tag fails with Remote branch v6.x.x not found. Update git as 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 from aztec-labs-eng/aztec-nr at the same tag as aztec. Pulling them from the old repositories brings in a second copy of aztec and fails with No 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_salt in the private context becomes protocol_nullifier. Wallets must draw a fresh salt for every transaction. Contracts need only a recompile.
  • The standard contracts are at new addresses. MultiCallEntrypoint, HandshakeRegistry, AuthRegistry and PublicChecks are 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 FactScope instead of an AztecAddress (#426). FactScope::account(address) is the old behaviour; the new FactScope::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);
  • OriginBlock is replaced by aztec::oracle::block_reference::BlockReference, with the same fields (#157).

  • Nullifier existence checks are batched: get_nullifier_statuses checks any number of nullifiers in one oracle call and reports each one's inclusion block. check_nullifier_exists still works (#157).

  • Writer::advance_offset is removed. Serialize the skipped fields instead (#387).

  • DelayedPublicMutable rejects delays below one hour, at compile time for the initial delay and at runtime in schedule_delay_change (#99).

  • Nine DOM_SEP__* constants left the protocol constants module. DOM_SEP__PARTIAL_NOTE_COMMITMENT and DOM_SEP__NOTE_COMPLETION_LOG_TAG move to aztec::note::partial_note; the other seven are now internal. Custom account entrypoints should call compute_tx_nullifier instead of hashing DOM_SEP__TX_NULLIFIER themselves (AztecProtocol/aztec-packages#25014).

Aztec.js

  • Protocol contract wrappers moved to @aztec-labs/aztec.js/protocol and out of @aztec-labs/noir-contracts.js. They are bound to their canonical address, so they attach with withWallet(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...
Read more

v6.0.0-rc.1

v6.0.0-rc.1 Pre-release
Pre-release

Choose a tag to compare

@aminsammara aminsammara released this 29 Sep 05:13
68274e7

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/aztec to azteclabs/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_getLogs back to the v6 Inbox deployment block.