github aleo-labs-protocol/snarkOS testnet-v4.12.0

latest release: v4.12.0
pre-release8 days ago

Testnet consensus version (V22) activation height: 20,415,000 (estimated Tue 2026-10-13 ~08:00 UTC, the evening of Mon 2026-10-12 PT).

Network: testnet. ConsensusVersion::V22 raises the maximum number of mappings in a program to 128 and lowers the testnet maximum number of certificates to 40. This release also carries everything merged to staging through snarkOS #4531 and snarkVM #3485.

Who needs to act

All testnet validators and node operators need to upgrade before the activation height.

Built against snarkVM testnet-v4.12.0 (532d8fdf7).

The Aleo maintainers are excited to announce Aleo Stack testnet-v4.12.0. This release introduces the V22 consensus version, continues the hardening and performance work from v4.10.0, and brings a large set of improvements for node operators: more resilient BFT participation, new REST range endpoints, better observability, and faster CPU proving.

Highlights

  • Consensus V22: programs may declare up to 128 mappings, and the testnet certificate limit is lowered to 40.
  • BFT resilience: validators no longer let peer-reported sync status silence them, proposals fan out to peers concurrently, and certificates propagate before local commit work.
  • Deployment verification hardening: deterministic deployment checks, cyclic struct guards, and tighter wire-format parsing.
  • Faster, more observable nodes: an 8% faster private transfer on CPU, committer keys that share the SRS, RocksDB secondary mode, and new metrics and REST routes.

Consensus upgrade: introducing V22

  • Up to 128 mappings per program. The mapping limit becomes a versioned consensus value: 31 through V21, 128 from V22. Deployment verification enforces the active limit. (snarkVM#3428)
  • Testnet certificate limit lowered to 40 at V22, matching mainnet’s committee bound. (snarkVM#3386, snarkVM#3484)
  • Message version 33 accompanies V22; the latest message version now ignores consensus versions that have no scheduled height. (snarkOS#4511)

For node operators

BFT resilience

  • Consensus participation no longer depends on peer-reported sync status. is_synced() was derived from peer locator messages, so a single peer claiming to be far ahead could silence a validator. Proposing, signing and certifying now rely on the node’s own view. (snarkOS#4461)
  • Batch proposals fan out concurrently, and sends scoped to a round are cancelled when the round advances, so one rate-limited peer no longer delays delivery to the rest. (snarkOS#4487)
  • Certificates are broadcast before waiting on local consensus, so local commit work does not hold up propagation. (snarkOS#4527)
  • Batches that reference aborted transactions are no longer certified. (snarkOS#4412)
  • Concurrent duplicate certificate inserts are ignored rather than treated as errors. (snarkOS#4479)
  • Cached signer addresses on batch certificates are used instead of re-deriving them. (snarkOS#4434)
  • Clients may fetch a single missing block at the tip, improving transaction and mapping visibility. (snarkOS#4529)
  • The expired gateway challenge-response handshake has been removed; validators speak only the Noise handshake. (snarkOS#4506)

Hardening the wire format and network layer

  • Trailing bytes inside length-delimited sub-objects, repeated entries in count-prefixed collections, and oversized preallocations from wire-declared counts are rejected. (snarkVM#3409, snarkVM#3410, snarkVM#3419)
  • Non-canonical curve point encodings (Short Weierstrass y = 0 sign flag, Edwards x = 0) are rejected, and every serialized curve point is asserted to round-trip. (snarkVM#3422, snarkVM#3425, snarkVM#3405)
  • MAX_PING_MESSAGE_SIZE is tightened from 16 MiB to 2 MiB, and Ping block locators are optional for clients and validators. (snarkOS#4426, snarkOS#4425)
  • Remote parameter downloads and REST queries are bounded, with retries for lost requests. (snarkVM#3436, snarkVM#3435)
  • A cached parameter file that fails its checksum is removed rather than reused. (snarkVM#3469)

Storage, history and observability

For external developers

REST API

  • New range routes: /blocks/hashes, /blocks/headers, /blocks/stateRoots and /blocks/transactions over a height range (up to 160 blocks), with allow_partial to clamp ranges to the tip. (snarkOS#4447, snarkOS#4455, snarkOS#4467, snarkOS#4510)
  • Missing resources return 404, v1 errors are identifiable, and the rate limiter’s Retry-After header is forwarded on a 429. (snarkOS#4450, snarkOS#4472)
  • Transaction verification on broadcast?check_transaction=true runs in a blocking task, and operators can cap REST verification concurrency at startup. (snarkOS#4530, snarkOS#4459)
  • The request body limit matches the current maximum transaction size, block lookups no longer fill the block cache, and developer endpoints accept static queries. (snarkOS#4444, snarkOS#4485, snarkOS#4478)

Deployment verification hardening

  • Deterministic deployment checks. A non-deterministic signer sampled during check_deployment could make nodes disagree; the remaining ambient RNG sources are now seeded. (snarkVM#3346, snarkVM#3365)
  • Cyclic struct equivalence is rejected instead of overflowing the stack, guarding legacy cyclic graphs that reach type checking. (snarkVM#3447)
  • The rand.chacha instruction is now costed. (snarkVM#3356)
  • Beacon blocks apply a conservative spend limit, matching production environments. (snarkVM#3386)

Performance

  • CPU proving is about 8% faster on a private transfer, from a set of algorithmic improvements to polynomial arithmetic. (snarkVM#3399)
  • Committer keys share the SRS instead of copying the powers of β·G. (snarkVM#3474)
  • Off-thread speculative reads no longer stall atomic_speculate, and the sequential VM worker is released after the final external clone. (snarkVM#3438, snarkVM#3444)
  • Tokio pools are sized from measured demand, duplicate deserialization allocations are avoided, and a path hasher’s Merkle empty hash is computed once. (snarkOS#4464, snarkVM#3398, snarkVM#3458)
  • Eager error creation is avoided in cost calculation. (snarkVM#3486)

For snarkVM and snarkOS developers

Toolchain and dependencies

  • Rust 1.96 is now the MSRV for both snarkVM and snarkOS. (snarkVM#3395, snarkOS#4432)
  • aleo-std 1.0.4: StorageMode::Custom takes an optional secondary path; use StorageMode::from(path) for the common case.
  • cargo-deny replaces cargo-audit in CI, the unmaintained fxhash is replaced with ahash, and dependencies past the yanked chacha20 and wnaf releases are used. (snarkVM#3453, snarkOS#4470, snarkVM#3454, snarkVM#3406)
  • The macOS release build is fixed (libclang). (snarkOS#4398)

Don't miss a new snarkOS release

NewReleases is sending notifications on new releases.