Protocol
This release introduces protocol version 33
On alphanet, this protocol version can be enabled no earlier than 2026-08-15 01:03 UTC (start of epoch 85). Please ensure that you update your validators before this epoch change. Otherwise, if the upgrade threshold is reached, the protocol will remove you from the committee, and both you and your delegators will lose rewards.
#12614: Protocol version 33 amortizes the minimum checkpoint interval over a sliding window of 20 checkpoints on mainnet, holding the sustained checkpoint rate at the ceiling.
Nodes (Validators and Full nodes)
#12386: The db-checkpoint-config node config section is removed; nodes no longer generate or upload RocksDB snapshots, and the first_missing_db_checkpoint_epoch and num_local_db_checkpoints metrics are removed.
#12202: the Prometheus metrics exposure filter can be inspected and overridden at runtime through the admin server; metrics.groups gains a free-form overrides map for per-module, per-metric, or per-group levels, and the hardware group is now toggleable at runtime (hardware: off hides the collector instead of skipping its registration at startup).
#12582: iota-tool download-formal-snapshot now supports --network devnet for restoring a devnet node from a formal snapshot.
#11956: Add an opt-in ExecutionScheduler (selected via the ENABLE_EXECUTION_SCHEDULER env var); off by default, default behavior unchanged.
#12615: The consensus gRPC per-peer admission control and inbound resource bounds are now plain configuration defaults; CONSENSUS_GRPC_PROTECTIVE_LIMITS is removed. Set the individual bound to 0 under consensus-config.parameters.tonic to disable it.
#12654: removed the EventFilter::matches, TransactionFilter::matches and TransactionFilterV2::matches entries from the monitored_scope metrics
#12455: Faster catch-up from the checkpoint archive — downloaded checkpoints are now verified in parallel (new checkpoint-archive.verify-concurrency config, default: CPU cores) and inserted in batches, and archive sync pauses while it is more than checkpoint-archive.max-checkpoints-ahead-of-execution checkpoints (default: 100 000) ahead of execution; checkpoint execution loads transaction data outside the ordered pipeline. Node logs gain per-stage checkpoint pipeline times and the synced-checkpoint rate.
Indexer
#12658: ⚠️ Fixed the restore command not populating the checkpointed_objects table, which made GraphQL consistent queries return incomplete results on indexers restored from a formal snapshot. Deployments that were already restored are not fixed by this change - they need to be restored again.
JSON-RPC
#12508: iota_dryRunTransactionBlock and iota_devInspectTransactionBlock now fill in unset gas the same way and report what the simulation charged.
- Unset gas is resolved: no payment gets a mock gas coin, a zero
gas_pricethe epoch's reference gas price, and a zerogas_budgetwhat the gas coins can back — capped at the protocol maximum, and raised to the smallest budget a transaction may declare if the coins hold less. iota_devInspectTransactionBlockno longer fails on a zerogas_priceorgas_budget, and meters against agas_budgetyou do supply instead of always the protocol maximum.- The gas coins must cover the resolved budget (
GasBalanceTooLow), every object in the payment must be an address-ownedCoin<IOTA>(InvalidGasObject/GasObjectNotOwnedObject), andmax_gas_payment_objectsapplies (SizeLimitExceeded). - With
gas_budget: 0the reported transaction carries the gas charged and the price it was charged at, so the estimate can be read back — matching gRPCsimulate_transactions. - Both report the digest of what actually ran, so a transaction sent without a gas payment reports different created object IDs than before, and the same ones on every run.
- A system transaction is now rejected with
simulatein the message rather thandev-inspect/dry-exec.
CLI
#12266: iota move build warns when a package nears/exceeds the protocol maximum package size; a new --package-info flag prints the package name, direct dependencies, and exact on-chain size.
#12386: The iota-tool download-db-snapshot and iota-tool restore-db commands are removed; use iota-tool download-formal-snapshot to restore a node.
#12468: iota-tool download-formal-snapshot now shows download progress with size totals, speed, and ETA.
#12341: iota client transfer, pay, pay-iota and pay-all-iota now build transactions via the gRPC API; the active environment needs a grpc URL (default environments already include one, older config files must add it).
#12595: iota client split-coin and iota client merge-coin now build transactions via the gRPC API; the active environment needs a grpc URL (default environments already include one, older config files must add it).
#12665: iota-localnet start --disable-fullnode-pruning keeps the fullnode's full history.
gRPC
#12508: simulate_transactions now reports the gas the run actually used.
- The returned transaction carries the price it was charged at, and the mock gas coin for a transaction sent without a gas payment, in place of the empty payment echoed back before.
- Estimating no longer depends on
DisableVmChecks: a zerogas_budgetresolves and comes back as the cost charged in either check mode, where with the checks enabled it previously failed withGasBudgetTooLow. - The resolved budget is capped at the gas coins' balance, so estimating with a real gas coin no longer requires it to cover the protocol maximum. A balance below the smallest declarable budget is still reported as
GasBalanceTooLow.