Skip to main content
Version: v2.0.2

v2.0.2 (from v1.2.1)

Overview

Version 2.0.2 introduces significant configuration simplification, an integrated keystore system, and enhanced P2P capabilities. This release includes breaking changes that require migration from v1.2.1.

Migration difficulty: Moderate to High

Breaking changes

L1 contract addresses

v1.2.1:

--rollup-address <value>                    ($ROLLUP_CONTRACT_ADDRESS)
--inbox-address <value> ($INBOX_CONTRACT_ADDRESS)
--outbox-address <value> ($OUTBOX_CONTRACT_ADDRESS)
--fee-juice-address <value> ($FEE_JUICE_CONTRACT_ADDRESS)
--staking-asset-address <value> ($STAKING_ASSET_CONTRACT_ADDRESS)
--fee-juice-portal-address <value> ($FEE_JUICE_PORTAL_CONTRACT_ADDRESS)
--registry-address <value> ($REGISTRY_CONTRACT_ADDRESS)

v2.0.2:

--registry-address <value>                  ($REGISTRY_CONTRACT_ADDRESS)
--rollup-version <value> ($ROLLUP_VERSION) # Default: canonical

Migration: Only registry address is required. All other contract addresses are derived automatically.

Keystore integration

v1.2.1:

--sequencer.publisherPrivateKey <value>     ($SEQ_PUBLISHER_PRIVATE_KEY)
--proverNode.publisherPrivateKey <value> ($PROVER_PUBLISHER_PRIVATE_KEY)

v2.0.2:

--proverNode.keyStoreDirectory <value>      ($KEY_STORE_DIRECTORY)

# Multiple publishers supported
--sequencer.publisherPrivateKeys <value> ($SEQ_PUBLISHER_PRIVATE_KEYS)
--sequencer.publisherAddresses <value> ($SEQ_PUBLISHER_ADDRESSES)

--proverNode.publisherPrivateKeys <value> ($PROVER_PUBLISHER_PRIVATE_KEYS)
--proverNode.publisherAddresses <value> ($PROVER_PUBLISHER_ADDRESSES)

Migration: Create keystore directory, change singular to plural. Use *_ADDRESSES for remote signers. See Advanced Keystore Guide.

Validator configuration

v1.2.1:

--sequencer.validatorPrivateKeys <value>    ($VALIDATOR_PRIVATE_KEYS)

v2.0.2:

--sequencer.validatorPrivateKeys <value>    ($VALIDATOR_PRIVATE_KEYS)
--sequencer.validatorAddresses <value> ($VALIDATOR_ADDRESSES) # For remote signers
--sequencer.disabledValidators <value> # Temporarily disable

Sync mode relocated

v1.2.1: Component-specific

--node.syncMode <value>                     ($SYNC_MODE)
--node.snapshotsUrl <value> ($SYNC_SNAPSHOTS_URL)
--proverNode.syncMode <value> ($SYNC_MODE)
--proverNode.snapshotsUrl <value> ($SYNC_SNAPSHOTS_URL)

v2.0.2: Global setting

--sync-mode <value>                         ($SYNC_MODE)          # Options: full, snapshot, force-snapshot
--snapshots-url <value> ($SYNC_SNAPSHOTS_URL)

World state separation

v1.2.1: Prover-node-specific

--proverNode.worldStateBlockCheckIntervalMS <value>         ($WS_BLOCK_CHECK_INTERVAL_MS)
--proverNode.worldStateProvenBlocksOnly <value> ($WS_PROVEN_BLOCKS_ONLY)
--proverNode.worldStateBlockRequestBatchSize <value> ($WS_BLOCK_REQUEST_BATCH_SIZE)
--proverNode.worldStateDbMapSizeKb <value> ($WS_DB_MAP_SIZE_KB)
--proverNode.archiveTreeMapSizeKb <value> ($ARCHIVE_TREE_MAP_SIZE_KB)
--proverNode.nullifierTreeMapSizeKb <value> ($NULLIFIER_TREE_MAP_SIZE_KB)
--proverNode.noteHashTreeMapSizeKb <value> ($NOTE_HASH_TREE_MAP_SIZE_KB)
--proverNode.messageTreeMapSizeKb <value> ($MESSAGE_TREE_MAP_SIZE_KB)
--proverNode.publicDataTreeMapSizeKb <value> ($PUBLIC_DATA_TREE_MAP_SIZE_KB)
--proverNode.worldStateDataDirectory <value> ($WS_DATA_DIRECTORY)
--proverNode.worldStateBlockHistory <value> ($WS_NUM_HISTORIC_BLOCKS)

v2.0.2: Global settings only

--world-state-data-directory <value>        ($WS_DATA_DIRECTORY)
--world-state-db-map-size-kb <value> ($WS_DB_MAP_SIZE_KB)
--world-state-block-history <value> ($WS_NUM_HISTORIC_BLOCKS)

Migration: Move to global WORLD STATE section. Tree-specific map sizes and other world state settings removed.

Removed features

Faucet service

# All removed in v2.0.2
--faucet
--faucet.apiServer
--faucet.apiServerPort <value> ($FAUCET_API_SERVER_PORT)
--faucet.viemPollingIntervalMS <value> ($L1_READER_VIEM_POLLING_INTERVAL_MS)
--faucet.l1Mnemonic <value> ($MNEMONIC)
--faucet.mnemonicAddressIndex <value> ($FAUCET_MNEMONIC_ADDRESS_INDEX)
--faucet.interval <value> ($FAUCET_INTERVAL_MS)
--faucet.ethAmount <value> ($FAUCET_ETH_AMOUNT)
--faucet.l1Assets <value> ($FAUCET_L1_ASSETS)

L1 transaction monitoring

All removed from archiver and sequencer:

--archiver.gasLimitBufferPercentage <value>             ($L1_GAS_LIMIT_BUFFER_PERCENTAGE)
--archiver.maxGwei <value> ($L1_GAS_PRICE_MAX)
--archiver.maxBlobGwei <value> ($L1_BLOB_FEE_PER_GAS_MAX)
--archiver.priorityFeeBumpPercentage <value> ($L1_PRIORITY_FEE_BUMP_PERCENTAGE)
--archiver.priorityFeeRetryBumpPercentage <value> ($L1_PRIORITY_FEE_RETRY_BUMP_PERCENTAGE)
--archiver.fixedPriorityFeePerGas <value> ($L1_FIXED_PRIORITY_FEE_PER_GAS)
--archiver.maxAttempts <value> ($L1_TX_MONITOR_MAX_ATTEMPTS)
--archiver.checkIntervalMs <value> ($L1_TX_MONITOR_CHECK_INTERVAL_MS)
--archiver.stallTimeMs <value> ($L1_TX_MONITOR_STALL_TIME_MS)
--archiver.txTimeoutMs <value> ($L1_TX_MONITOR_TX_TIMEOUT_MS)
--archiver.txPropagationMaxQueryAttempts <value> ($L1_TX_PROPAGATION_MAX_QUERY_ATTEMPTS)
--archiver.cancelTxOnTimeout <value> ($L1_TX_MONITOR_CANCEL_TX_ON_TIMEOUT)

# Same settings removed from --sequencer.*

Migration: L1 transaction management now uses optimized internal defaults.

Rollup constants from archiver

All rollup constants now derived from L1 contracts:

# All removed in v2.0.2
--archiver.ethereumSlotDuration <value> ($ETHEREUM_SLOT_DURATION)
--archiver.aztecSlotDuration <value> ($AZTEC_SLOT_DURATION)
--archiver.aztecEpochDuration <value> ($AZTEC_EPOCH_DURATION)
--archiver.aztecTargetCommitteeSize <value> ($AZTEC_TARGET_COMMITTEE_SIZE)
--archiver.aztecProofSubmissionEpochs <value> ($AZTEC_PROOF_SUBMISSION_EPOCHS)
--archiver.depositAmount <value> ($AZTEC_DEPOSIT_AMOUNT)
--archiver.minimumStake <value> ($AZTEC_MINIMUM_STAKE)
--archiver.slashingQuorum <value> ($AZTEC_SLASHING_QUORUM)
--archiver.slashingRoundSize <value> ($AZTEC_SLASHING_ROUND_SIZE)
--archiver.governanceProposerQuorum <value> ($AZTEC_GOVERNANCE_PROPOSER_QUORUM)
--archiver.governanceProposerRoundSize <value> ($AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE)
--archiver.manaTarget <value> ($AZTEC_MANA_TARGET)
--archiver.provingCostPerMana <value> ($AZTEC_PROVING_COST_PER_MANA)
--archiver.exitDelaySeconds <value> ($AZTEC_EXIT_DELAY_SECONDS)

# Same settings removed from --sequencer.*

Node deployment options

# All removed in v2.0.2 (moved to sandbox only)
--node.deployAztecContracts ($DEPLOY_AZTEC_CONTRACTS)
--node.deployAztecContractsSalt <value> ($DEPLOY_AZTEC_CONTRACTS_SALT)
--node.assumeProvenThroughBlockNumber <value> ($ASSUME_PROVEN_THROUGH_BLOCK_NUMBER)
--node.publisherPrivateKey <value> ($L1_PRIVATE_KEY)

Migration: Contract deployment now sandbox-only via --sandbox.deployAztecContractsSalt. For production, deploy contracts separately.

Other removed settings

# Prover coordination
--proverNode.proverCoordinationNodeUrls <value> ($PROVER_COORDINATION_NODE_URLS)

# Custom forwarder
--sequencer.customForwarderContractAddress <value> ($CUSTOM_FORWARDER_CONTRACT_ADDRESS)
--proverNode.customForwarderContractAddress <value> ($CUSTOM_FORWARDER_CONTRACT_ADDRESS)

# Component-specific settings now global
--archiver.viemPollingIntervalMS <value> ($ARCHIVER_VIEM_POLLING_INTERVAL_MS)
--sequencer.viemPollingIntervalMS <value> ($L1_READER_VIEM_POLLING_INTERVAL_MS)
--blobSink.viemPollingIntervalMS <value> ($L1_READER_VIEM_POLLING_INTERVAL_MS)
--proverBroker.viemPollingIntervalMS <value> ($L1_READER_VIEM_POLLING_INTERVAL_MS)

--archiver.rollupVersion <value> ($ROLLUP_VERSION)
--sequencer.rollupVersion <value> ($ROLLUP_VERSION)
--blobSink.rollupVersion <value> ($ROLLUP_VERSION)
--proverBroker.rollupVersion <value> ($ROLLUP_VERSION)
--pxe.rollupVersion <value> ($ROLLUP_VERSION)

--archiver.dataStoreMapSizeKB <value> ($DATA_STORE_MAP_SIZE_KB)
--pxe.dataStoreMapSizeKB <value> ($DATA_STORE_MAP_SIZE_KB)
--blobSink.dataStoreMapSizeKB <value> ($DATA_STORE_MAP_SIZE_KB)
--proverBroker.dataStoreMapSizeKB <value> ($DATA_STORE_MAP_SIZE_KB)
--p2pBootstrap.dataStoreMapSizeKB <value> ($DATA_STORE_MAP_SIZE_KB)

# Aztec node specific
--node.worldStateBlockCheckIntervalMS <value> ($WS_BLOCK_CHECK_INTERVAL_MS)
--node.archiverUrl <value> ($ARCHIVER_URL)

New features

P2P transaction collection

--p2p.txCollectionNodeRpcUrls <value>                           ($TX_COLLECTION_NODE_RPC_URLS)
--p2p.txCollectionFastNodeIntervalMs <value> ($TX_COLLECTION_FAST_NODE_INTERVAL_MS)
--p2p.txCollectionFastMaxParallelRequestsPerNode <value> ($TX_COLLECTION_FAST_MAX_PARALLEL_REQUESTS_PER_NODE)
--p2p.txCollectionNodeRpcMaxBatchSize <value> ($TX_COLLECTION_NODE_RPC_MAX_BATCH_SIZE)
--p2p.txCollectionFastNodesTimeoutBeforeReqRespMs <value> ($TX_COLLECTION_FAST_NODES_TIMEOUT_BEFORE_REQ_RESP_MS)
--p2p.txCollectionSlowNodesIntervalMs <value> ($TX_COLLECTION_SLOW_NODES_INTERVAL_MS)
--p2p.txCollectionSlowReqRespIntervalMs <value> ($TX_COLLECTION_SLOW_REQ_RESP_INTERVAL_MS)
--p2p.txCollectionSlowReqRespTimeoutMs <value> ($TX_COLLECTION_SLOW_REQ_RESP_TIMEOUT_MS)
--p2p.txCollectionReconcileIntervalMs <value> ($TX_COLLECTION_RECONCILE_INTERVAL_MS)
--p2p.txCollectionDisableSlowDuringFastRequests <value> ($TX_COLLECTION_DISABLE_SLOW_DURING_FAST_REQUESTS)

P2P security and testing

# Discovery and security
--p2p.p2pDiscoveryDisabled <value> ($P2P_DISCOVERY_DISABLED)
--p2p.p2pAllowOnlyValidators <value> ($P2P_ALLOW_ONLY_VALIDATORS)
--p2p.p2pMaxFailedAuthAttemptsAllowed <value> ($P2P_MAX_AUTH_FAILED_ATTEMPTS_ALLOWED)

# Testing features
--p2p.dropTransactions <value> ($P2P_DROP_TX)
--p2p.dropTransactionsProbability <value> ($P2P_DROP_TX_CHANCE)

# Transaction handling
--p2p.disableTransactions <value> ($TRANSACTIONS_DISABLED)
--p2p.txPoolDeleteTxsAfterReorg <value> ($P2P_TX_POOL_DELETE_TXS_AFTER_REORG)

# Preferred peers
--p2p.preferredPeers <value> ($P2P_PREFERRED_PEERS)

Sequencer invalidation controls

--sequencer.attestationPropagationTime <value>                              ($SEQ_ATTESTATION_PROPAGATION_TIME)
--sequencer.secondsBeforeInvalidatingBlockAsCommitteeMember <value> ($SEQ_SECONDS_BEFORE_INVALIDATING_BLOCK_AS_COMMITTEE_MEMBER)
--sequencer.secondsBeforeInvalidatingBlockAsNonCommitteeMember <value> ($SEQ_SECONDS_BEFORE_INVALIDATING_BLOCK_AS_NON_COMMITTEE_MEMBER)

Other new features

# Archiver - skip validation (testing only)
--archiver.skipValidateBlockAttestations

# Prover - transaction gathering timeout
--proverNode.txGatheringTimeoutMs <value> ($PROVER_NODE_TX_GATHERING_TIMEOUT_MS)

Changed defaults

FlagEnvironment Variablev1.2.1v2.0.2
--p2p.overallRequestTimeoutMs$P2P_REQRESP_OVERALL_REQUEST_TIMEOUT_MS400010000
--p2p.individualRequestTimeoutMs$P2P_REQRESP_INDIVIDUAL_REQUEST_TIMEOUT_MS200010000
--p2p.dialTimeoutMs$P2P_REQRESP_DIAL_TIMEOUT_MS10005000
--proverAgent.proverAgentPollIntervalMs$PROVER_AGENT_POLL_INTERVAL_MS1001000
--bot.l1ToL2MessageTimeoutSeconds$BOT_L1_TO_L2_TIMEOUT_SECONDS603600
--bot.recipientEncryptionSecret$BOT_RECIPIENT_ENCRYPTION_SECRET[Redacted]0x...cafecafe

Migration checklist

All nodes

  • Update to --registry-address only (remove all other contract addresses)
  • Add --rollup-version canonical if needed
  • Move --sync-mode and --snapshots-url to global config
  • Remove component-specific --*.rollupVersion, --*.dataStoreMapSizeKB
  • Set global --data-store-map-size-kb if needed (default: 134217728 KB)

Sequencer nodes

  • Create and configure --sequencer.keyStoreDirectory (actually --proverNode.keyStoreDirectory)
  • Change --sequencer.publisherPrivateKey--sequencer.publisherPrivateKeys
  • Update --sequencer.validatorPrivateKeys or add --sequencer.validatorAddresses
  • Remove all --sequencer.gasLimitBufferPercentage and related L1 settings
  • Remove --sequencer.customForwarderContractAddress, --sequencer.viemPollingIntervalMS
  • Consider using --sequencer.disabledValidators for temporary disabling

Prover nodes

  • Create and configure --proverNode.keyStoreDirectory
  • Change --proverNode.publisherPrivateKey--proverNode.publisherPrivateKeys
  • Move world state settings to global WORLD STATE section
  • Remove --proverNode.archiveTreeMapSizeKb and other tree-specific sizes
  • Remove --proverNode.proverCoordinationNodeUrls, --proverNode.customForwarderContractAddress
  • Set --proverNode.txGatheringTimeoutMs if needed

Archiver nodes

  • Remove all --archiver.gasLimitBufferPercentage and related L1 settings
  • Remove --archiver.ethereumSlotDuration, --archiver.aztecSlotDuration, etc.
  • Remove --archiver.viemPollingIntervalMS

P2P configuration

  • Configure --p2p.txCollectionNodeRpcUrls if using external nodes
  • Review --p2p.p2pAllowOnlyValidators security settings
  • Consider using --p2p.preferredPeers

Sandbox/development

  • Move deployment to --sandbox.deployAztecContractsSalt
  • Configure --sandbox.l1Mnemonic if needed
  • Remove all faucet flags

Troubleshooting

Node fails with contract address errors

Solution: Remove all individual contract addresses, keep only --registry-address, add --rollup-version canonical

Publisher key not found

Solution:

  • Check --proverNode.keyStoreDirectory ($KEY_STORE_DIRECTORY) is set
  • Change --*.publisherPrivateKey to --*.publisherPrivateKeys (plural)
  • See Advanced Keystore Guide

World state sync failures (prover)

Solution:

  • Move --proverNode.worldStateDataDirectory to --world-state-data-directory
  • Remove prover-specific world state settings
  • Use global --world-state-db-map-size-kb

Slow P2P after upgrade

Solution:

  • Configure --p2p.txCollectionNodeRpcUrls ($TX_COLLECTION_NODE_RPC_URLS)
  • Adjust --p2p.txCollectionFastNodeIntervalMs

Validator not attesting

Solution:

  • Check not in --sequencer.disabledValidators list
  • Verify --sequencer.validatorPrivateKeys or --sequencer.validatorAddresses
  • Check keystore permissions

Missing sync snapshots

Solution:

  • Move --node.syncMode to --sync-mode (global)
  • Set --snapshots-url at global level

Next steps