Back to Blog

Table of Contents

Highlights

Agave 4.0 Patch Notes: What's Coming

Written By

Brian Wong - DevRel, Anza

May 19, 2026

Agave 4.0 is the latest major release shipping from the Anza team. This release dramatically accelerates Turbine retransmit via XDP, moves transaction ingestion to QUIC, speeds up Replay Stage with asynchronous verification, and activates a long list of feature-gated SIMDs across the runtime, stake program, and cryptography. Agave 4.0 is currently a mainnet upgrade candidate and targets a full mainnet rollout in May 2026.

Notable Agave 4.0 Updates

Feature

Summary

XDP for Turbine

Turbine retransmit accelerated by orders of magnitude. Linux capability handling hardened.

Faster Replay Stage

PoH entry verification and Ed25519 signature verification moved off the critical path.

QUIC-Only TPU

UDP transaction ingestion removed. QUIC is now the only option for submitting transactions.

SIMD-0406

Caps instruction account references at 255 for builtins and precompiles, aligning with the Transaction V1 format.

Cost Model

Simple vote transactions no longer use statically defined CU costs.

External Scheduler Bindings

New --enable-scheduler-bindings flag exposes an IPC server for external schedulers to connect to.

Agave Validator exit

agave-validator exit now saves bank state before exiting, enabling fast restarts from local state.

Accounts Index

The --enable-accounts-disk-index flag is now deprecated. Use --accounts-index-limit instead.

Direct I/O for Snapshots

Snapshot unpacking now uses direct I/O by default, bypassing the OS page cache.

Agave Unstable API

All non-SDK monorepo crates are now private. Enable the agave-unstable-api feature flag to use them.

Geyser Notifications

Account update notifications now use post-execution values. Most programs already zero out accounts on close, so the end result is largely the same.

Version Format

New wire format encodes prerelease state (alpha, beta, RC, stable) in gossip version messages.

XDP for Turbine

XDP (eXpress Data Path) is the high-performance networking path Agave uses to accelerate Turbine. It loads an eBPF program close to the network interface card, letting shred traffic bypass much of the standard Linux packet-processing path.

With Agave 4.0, XDP is ready for wider validator adoption. It has been stress-tested, hardened, and seen routing improvements. Production results on large mainnet validators show Turbine retransmit dropping from 600ms to ~0.8ms — orders of magnitude faster. This matters as Solana pushes toward higher block limits and the long-term goal of 100M CU blocks. XDP now also works over DoubleZero.

For setup instructions and benchmarks, see the Agave XDP Setup Guide.

XDP & Linux Capability Hardening

Linux capability handling has been significantly hardened for validators using XDP. (#9133)

  • It is now an explicit error + exit if the process hasn't been permitted a capability required by the current configuration.

  • A warning is logged if the process has capabilities permitted that aren't required by any supported configuration.

  • All permitted capabilities not required by the current configuration are dropped at startup, including for all validator subcommands which never require capabilities.

  • Capability-requiring operations are now performed on the main thread and capabilities are dropped before any other threads are spawned, with two exceptions: one thread retains cap_net_admin for netlink socket reinitialization, and if niceness flags are passed, all threads retain cap_sys_nice.

For operators, the setup instructions are as follows. Choose whichever fits your operational procedures:

Option 1 — Systemd: Add the following to your [Service] section:

AmbientCapabilities=CAP_NET_RAW CAP_NET_ADMIN CAP_BPF CAP_PERFMON

CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN CAP_BPF CAP_PERFMON

Option 2 — setcap: Set xattr capabilities directly on the binary (must be repeated after every binary update):

sudo setcap cap_net_raw,cap_net_admin,cap_bpf,cap_perfmon=p /path/to/agave-validator

Faster Replay Stage

Agave 4.0 speeds up replay by moving two expensive verification steps off the replay threads' critical path.

  • PoH entry verification is now dispatched asynchronously. Previously, replay verified the entry hash chain inline before continuing.

  • Transaction signature verification is split: transaction hash/message verification still runs up front so transactions can be sanitized and executed safely, while the more expensive Ed25519 signature checks run in the background and are joined before the block is accepted.

The practical impact is a much less blocked replay stage, especially during busy slots where signature checks scale with transaction count.

Wincode Serialization

Wincode is a serialization and deserialization library developed by Anza, built for in-place initialization and direct memory writes to minimize intermediate buffering. It delivers top-tier performance among Rust serializers while remaining fully compatible with bincode. In Agave 4.0, more performance-critical serialization paths are transitioning from bincode to wincode. Since nearly all data written to disk or sent over the network in Solana relies on bincode, optimizing these paths has broad impact.

SIMD-0459 & SIMD-0460: Direct Mapping

We're shipping two related SIMDs authored by Alexander Meißner that tighten the sBPF execution environment. These are critical for cross-client consistency with Firedancer.

  • SIMD-0459 enforces that syscall parameters can only reference valid memory regions — input, heap, or stack — preventing undefined memory access patterns during syscall invocations like sol_log and sol_invoke_signed. (#10348)

  • SIMD-0460 reorganizes how the sBPF VM maps its memory regions (program text, stack, heap, input data), creating clearer boundaries.

SIMD-0406: Maximum Instruction Accounts

We're capping the number of account references per instruction at 255 for all instruction types, including builtins and precompiles. The feature gate was rekeyed for testnet activation in 4.0. (#11033)

QUIC-Only TPU

We've removed support for ingestion of transactions via UDP. QUIC is now the only option for submitting transactions to the validator. This has been the recommended path for several releases and finalizes the transition.

  • --public-tpu-address and --public-tpu-forwards-address now specify QUIC ports, not UDP.

  • The setPublicTpuAddress and setPublicTpuForwardsAddress RPC methods also now refer to QUIC ports.

  • CLI arguments --use-quic and --use-udp have been removed since there's nothing to toggle anymore.

  • solana-test-validator now shows the TPU QUIC address instead of the TPU UDP address in its dashboard.

Agave Unstable API

From 4.0 onward, all monorepo crates falling outside the backward compatibility policy have had their symbols made private. You must explicitly opt in with features = ["agave-unstable-api"] to use them.

  • Only five crates carry stability guarantees: solana-sdk, solana-program, solana-client, solana-cli-config, and agave-geyser-plugin-interface.

  • Everything else — including solana-accounts-db, solana-runtime, solana-core, solana-ledger, and solana-stake-program — falls under the unstable designation. Projects depending on any internal crate must add the feature flag to their Cargo.toml.

  • On-chain program developers using only solana-program or solana-sdk are completely unaffected.

External Scheduler Bindings

We've added --enable-scheduler-bindings, which binds an IPC server at <ledger-path>/scheduler_bindings.ipc. This allows external schedulers to connect and manage transaction scheduling outside the validator process. This is a new extension point for teams building custom scheduling logic.

RPC Updates
  • Added a clientId field to each node in the getClusterNodes response, improving node identification for monitoring and tooling.

  • getSignaturesForAddress now returns an error with code -32020 if the before or until signatures are not found in the ledger. Previously, the method returned a successful response with an empty array, which made it difficult to distinguish between "no matching transactions" and "invalid signature parameter." App developers relying on the old empty-array behavior will need to handle this new error code.

Accounts Index & AccountsDB

The accounts index is now kept entirely in RAM by default. The new --accounts-index-limit flag gives operators direct control over the memory threshold for the accounts index.

  • The --disable-accounts-disk-index flag has been removed (no longer needed since in-memory is the default).

  • The --enable-accounts-disk-index flag is deprecated. Use --accounts-index-limit instead. To retain the old disk-backed behavior, use --accounts-index-limit minimal.

  • Using mmap for --accounts-db-access-storages-method is now deprecated.

We also split monitoring metrics and fixed edge cases in the accounts storage layer:

  • Store stats separated into unfrozen (active slot processing) and frozen (bank freeze/snapshot) categories, giving operators granular visibility into performance bottlenecks. (#10918, #10986)

  • Zero-size file handling fixed — an edge case where account files with zero size or zero limit could cause panics during memory-mapped reads. (#10900)

Direct I/O for Snapshot Unpacking

Agave 4.0 changes snapshot unpacking to use direct I/O by default, instead of routing snapshot writes through the operating system page cache. This improves startup time and snapshot restore performance, especially because snapshot data is typically streamed to disk and does not need to displace hotter validator data from memory. Operators can opt out with --no-accounts-db-snapshots-direct-io if their filesystem does not support O_DIRECT. Direct I/O is expected to be extended to snapshot creation in a future release.

Blockstore Legacy Format Removal

We've removed fallback support for several legacy blockstore column formats: SlotMeta (pre-v2.2), Index (pre-v3.1), PerfSamples (pre-v1.15), and the transaction metadata columns TransactionStatus, TransactionMemos, and AddressSignatures (pre-v1.18).

Tiered Storage Removed

The experimental Tiered Storage backend has been fully removed from the codebase. This was a proposed alternative accounts storage format that never reached production readiness. Removing it simplifies the AccountsDB code path and reduces maintenance. (#10992)

Cost Model: Simple Votes Removed

The transaction scheduler's cost model previously counted vote transactions against the block's compute budget alongside user transactions. They're now accounted for using the same cost model as normal transactions, and the dedicated vote CU limit has been removed. This frees up block capacity that was previously reserved for votes. (#10855)

Geyser Plugin Changes

We've updated how account notifications work for Geyser consumers.

  • Account update notifications now have their fields populated from the post-execution account values. In practice, most programs already zero out accounts on close, so the end result is largely the same for most consumers.

Validator Changes

agave-validator exit now saves bank state before exiting. Most validators have snapshot generation disabled, meaning every reboot requires downloading or copying a snapshot from another machine. Now, exiting via agave-validator exit saves local state so the validator can restart without needing a new snapshot archive, significantly speeding up restarts.

Version Format

We've changed the interpretation of the Version struct fields in gossip ContactInfo to support semver prerelease notation. The top two bits (14 and 15) of the minor field are now reserved for prerelease status: 3 = alpha, 2 = beta, 1 = release candidate, 0 = stable. When prerelease status bits are non-zero, the patch field is interpreted as the prerelease number and the actual patch value is implicitly zero. (#10883)

Implementations lacking this support will observe a larger-than-expected minor version field from nodes publishing from a prerelease version.

CLI & Platform Tools
  • Support for Trezor hardware wallets using usb://trezor.

  • cargo-build-sbf --debug now outputs program.so.debug and places debug objects inside target/deploy/debug.

Feature Gate Activations During the 4.0 Cycle

Several feature-gated SIMDs are scheduled to activate on mainnet during the Agave 4.0 release cycle. These are protocol-level changes that go live independently of the client release itself but are part of the broader 4.0 rollout.

  • P-token program — A drop-in compute-optimized replacement for the SPL Token program, built on Pinocchio. Same instruction set and account layouts, dramatically lower CU costs. The original SIMD estimates roughly 12% of block capacity freed up across the network.

  • Stake Program v5 (SIMD-0490) — Minimum stake delegation raised from 1 lamport to 1 SOL. Existing accounts below the threshold are grandfathered. Tooling and dapps that interact with the stake program will need to check their logic for the new minimum.

  • SBPFv3 program support (SIMD-0178, SIMD-0189, SIMD-0377) — Static syscalls, stricter ELF layout, and a VM update aligning with modern eBPF generated by LLVM.

  • Prefunded account creation (SIMD-0312) — New CreateAccountAllowPrefund system program instruction that consolidates transfer + allocate + assign into a single call.

  • ZK ElGamal Proof Program re-enabled — Re-activated on mainnet after the June 2025 vulnerability fix and audits.

  • BLS12-381 syscalls (SIMD-0388) — Native support for BLS12-381 elliptic curve operations. Key enabler for Alpenglow's on-chain BLS Proof-of-Possession verification.

  • G2 arithmetic for alt_bn128 (SIMD-0302) — Adds G2 curve operations (addition, subtraction, scalar multiplication) to existing alt_bn128 syscalls.

  • Little-endian alt_bn128 (SIMD-0284) — Adds little-endian compatibility for alt_bn128 syscalls.

  • Chained Block ID validation (SIMD-0340) — Defines explicit chain validation rules so validators can verify block ancestry consistently under both TowerBFT and Alpenglow.

  • Fast Leader Handover Markers (SIMD-0337) — Standardizes how validators detect a slot is fully transmitted, enabling faster leader transitions for Alpenglow.

Important Breaking Changes
  • UDP transaction ingestion removed. QUIC is the only option. --public-tpu-address and --public-tpu-forwards-address now specify QUIC ports.

  • Agave Unstable API enforced. All monorepo crates outside the backward compatibility policy require the agave-unstable-api feature flag. Symbols are private without it.

  • Linux capability handling hardened. Missing required capabilities now cause an explicit error and exit.

  • Geyser notifications changed. Account update notifications now use post-execution values for closed accounts.

  • Legacy blockstore column formats no longer supported.

  • Removed validator arguments: --accounts-db-clean-threads, --accounts-db-hash-threads, --accounts-db-read-cache-limit-mb, --accounts-hash-cache-path, --disable-accounts-disk-index, --dev-halt-at-slot, --monitor, --wait-for-exit, --tpu-disable-quic, --tpu-enable-udp, --block-verification-method blockstore-processor (switch to unified-scheduler).

  • Removed CLI arguments: --use-quic, --use-udp.

Deprecations:

  • --enable-accounts-disk-index — use --accounts-index-limit instead.

  • --accounts-db-access-storages-method mmap

  • CLI ping command (removed in v4.1).

Agave 4.0 lays the groundwork for Alpenglow and the Anza 2026 roadmap ahead. Validators and developers are encouraged to begin testing with Agave 4.0 on testnet and prepare for the mainnet rollout. Stay tuned for future updates as Anza continues to improve the protocol and help Solana remain competitive at scale.

Useful Links