Programs Calls
credits.aleo
puzzle_arcade_coin_v002.aleo
token_registry.aleo
puzzle_arcade_ticket_v002.aleo
pondo_protocol.aleo
Validators
Coinbase
aleo185v9k487zd22gd5fddy05yhwch7ecw0ex6w7gwq95qalwl2trsxqqup5zc
Aleo Network Foundation
Everstake
DeFi TVL
Use the Provable SDK to build secure, private applications on Aleo. Empowering digital privacy.
refetching data...
The Aleo maintainers are excited to announce a new version of the Aleo Stack. This update includes changes to the node implementation snarkOS and the high-level programming language Leo - as well as their supporting libraries. This release is one of the largest and most significant upgrades to Aleo since the launch of Mainnet. It introduces three major capabilities: Leo v4.0.0: a complete overhaul of the Leo language, unifying five function-like constructs into a single fn keyword with explicit execution context modifiers. Interfaces and Dynamic Dispatch: compile-time program contracts and runtime function resolution, enabling standardized interfaces, pluggable architectures, and open composability. Leo Libraries: Reusable packages of types, constants, and functions that are shared across programs and fully inlined at compile time Onchain SNARK Verification: new snark.verify and snark.verify.batch opcodes that allow programs to verify Varuna proofs directly onchain. If you want to try it out, you can build from source today or download the mainnet release from Github March 30th. Find the current release schedule at:https://aleo.org/roadmap. Consensus Upgrade: V14 The release schedule and upgrade block heights for v4.6.0 can be found here: https://roadmap.aleo.org/ ATTENTION: Validators and clients that do not upgrade in time will be at risk of forking and require manual intervention to recover. Leo v4.0.0 Leo v4.0.0 is a ground-up rethinking of how Leo programs are written. The previous version of Leo required developers to choose between five distinct function-like constructs — transition, function, inline, async transition, and async function — each with different semantics, calling restrictions, and execution contexts. This release replaces all of them with a single fn keyword. Unified fn Syntax All functions now use fn. Where a function executes depends on two things: whether it is inside a program block (making it an entry point), and whether it uses the final modifier (marking it for onchain execution during finalization). Previous Syntax New Syntax Location transition fn Inside program block function fn Outside program block inline fn (compiler decides) Outside program block async transition fn returning Final Inside program block async function final fn or final { } block Outside program block Future Final Type name .await() .run() Execution operator Before (Leo v3.x): program token.aleo { mapping balances: address => u64; async transition transfer(to: address, amount: u64) -> Future { return finalize_transfer(to, amount); } async function finalize_transfer(to: address, amount: u64) { let current: u64 = balances.get_or_use(to, 0u64); balances.set(to, current + amount); } } After (Leo v4.0.0): final fn update_balance(to: address, amount: u64) { let current: u64 = balances.get_or_use(to, 0u64); balances.set(to, current + amount); } program token.aleo { mapping balances: address => u64; fn transfer(to: address, amount: u64) -> Final { return final { update_balance(to, amount); }; } } The program block now clearly defines the program's public interface — only entry points, record declarations, and storage live inside it. Helper functions and type declarations are placed outside. The final keyword explicitly marks functions and blocks that execute on-chain during finalization, replacing the overloaded async terminology. The result is that the distinction between private ZK proof execution and public onchain finalization is visible at a glance. Automatic Optimization The compiler now makes inlining decisions automatically. Functions called only once are auto-inlined, and functions never called are eliminated. Developers no longer need to choose between function and inline — the compiler handles it. A @no_inline annotation is available for cases where you want to prevent inlining of a specific function. Migration Only the new syntax will be supported going forward from this release. Programs written with transition, function, inline, and async will continue to compile identically. We recommend migrating to the new syntax for all new code. Deprecation warnings for the old syntax will be introduced in a future release. For detailed migration guidance, refer to the Leo documentation. Interfaces Interfaces introduce compile-time contracts for Leo programs. An interface declares what a program must provide — entry point function signatures, record types, and mappings — and the compiler verifies that any program claiming to implement the interface actually does. interface ARC20 { record Token { owner: address, balance: u64, .. } fn transfer(input: Token, to: address, amount: u64) -> Token; } program my_token.aleo : ARC20 { record Token { owner: address, balance: u64, memo: field, } fn transfer(input: Token, to: address, amount: u64) -> Token { // ... } } The Token annotation here is a compile-time obligation. If any required member is missing or has the wrong signature, the compiler rejects the program. Composition and Inheritance Interfaces compose using the + operator and support inheritance: interface Transfer { record Token; fn transfer(input: Token, to: address, amount: u64) -> Token; } interface Balances { mapping balances: address => u64; } interface ARC20 : Transfer + Balances {} program my_token.aleo : ARC20 { // Must implement everything from Transfer and Balances } Record Constraints Interfaces can require that a record has certain fields without fully specifying its structure. The .. syntax means "these fields are required; the implementor may add more": interface ARC20 { record Token { owner: address, balance: u64, .. } } This allows programs to extend the record with additional fields (like a memo or created_at timestamp) while still satisfying the interface contract. Dynamic Dispatch Until now, every cross-program call in Leo was static — the target program was hardcoded in source and baked into the circuit. To support a second token, you wrote a second function. To support an arbitrary token, you redeployed or upgraded your program. fn route_transfer_static(to: address, amount: u64) { return token_a.aleo::transfer(to, amount); // Static } Dynamic dispatch changes this. A single function can now route to any program that implements a known interface, with the target resolved at runtime. // Dynamic: any program that implements TokenStandard can be called fn transfer_dynamic(token_program:identifier, to:address, amount:u64) { return TokenStandard@(token_program)::transfer_public(to, amount); } Dynamic Records Dynamic dispatch solves the problem for program logic. Data has the same rigidity problem — if your function accepts a Token record, it must know the record's exact layout at compile time. The new dyn record type removes this limitation. Programs can accept, inspect, and forward records whose structure is determined at runtime: fn route_private_transfer( token_program: field, input: dyn record, to: address, amount: u64 ) -> dyn record { } Field access on dynamic records is verified by Merkle proof inside the circuit. If a field doesn't exist or has the wrong type, the proof fails. Security Model Dynamic dispatch is opt-in and interface-constrained. Static dispatch remains the default. When a program makes a dynamic call, translation proofs automatically verify that records passed across call boundaries are consistent between their static and dynamic representations. The target program, network, and function name are publicly witnessed — private variables influencing the call target are implicitly revealed. Leo Libraries Leo now supports libraries — reusable packages of types, constants, and functions that are shared across programs and fully inlined at compile time. Libraries have no transitions, no mappings, and no onchain footprint. Every struct, constant, and function call is resolved and inlined by the compiler before bytecode is emitted. Creating a Library A library lives in its own package with a lib.leo entry point (created with leo new --lib). It can define constants, structs (including generic ones), and plain fn functions: // lib.leo (package: math) const PRECISION: u32 = 1000u32; struct Vec2 { x: u32, y: u32, } fn dot(a: Vec2, b: Vec2) -> u32 { return a.x * b.x + a.y * b.y; } fn scale::[N: u32](v: Vec2) -> Vec2 { return Vec2 { x: v.x * N, y: v.y * N }; } Declaring the Dependency Add the library to your program's program.json manifest under "dependencies": { "program": "myapp.aleo", "version": "0.1.0", "description": "", "license": "MIT", "dependencies": [ { "name": "math", "location": "local", "path": "../math" } ] } Using the Library All library items are accessed under the library name as a namespace: program physics.aleo { fn kinetic_energy(vx: u32, vy: u32, mass: u32) -> u32 { let v: math::Vec2 = math::Vec2 { x: vx, y: vy }; let v3: math::Vec2 = math::scale::[3u32](v); // const arg resolved at compile time return math::dot(v3, v3) * mass / math::PRECISION; } @noupgrade constructor() {} } The compiler monomorphizes scale::[3u32] into a concrete function, folds PRECISION to 1000u32, and inlines everything. The resulting bytecode contains no trace of math. Key Properties Because libraries are inlined rather than deployed, there are no cross-program call overhead, no ABI boundaries to cross, and generic parameters (array sizes, loop bounds, etc.) are all resolved at compile time — making them the natural home for shared utilities, data structures, and constants. Libraries Programs Compiled to bytecode No — fully inlined Yes Structs (incl. const generic) ✓ ✓ Constants ✓ ✓ Functions (incl. Const generic) fn only All variants Mappings / storage — ✓ Deployed onchain No Yes Onchain SNARK Verification Aleo Stack v4.6.0 introduces snark.verify and snark.verify.batch; new opcodes that verify Varuna proofs directly onchain within the finalize scope of a program. This implements ARC-0008. In Leo, these are available as: program verifier.aleo { fn verify_proof( vk: [u8; 1024], varuna_version: u8, inputs: [field; 16], proof: [u8; 512] ) -> Final { return final { let valid: bool = Snark::verify(vk, varuna_version, inputs, proof); assert(valid); }; } } snark.verify.batch supports batch verification of multiple proofs, with compile-time enforcement of snarkVM limits (max 32 circuits, max 128 total instances). To accommodate the larger data sizes required for verifying keys and proofs, the maximum array size has been increased from 512 to 2,048 elements. This feature enables proof composition, cross-chain verification, and trustless bridging — any external computation that produces a Varuna proof can now be verified natively by an on-chain Aleo program. Improvements for Developers Leo leo fmt — Code Formatter: Leo now ships with a built-in code formatter. Run leo fmt to format all .leo files in a project, or leo fmt --check for CI integration. The formatter wraps lines at 100 characters and is built on a new lossless Rowan-based parser that preserves comments and whitespace. leo abi — ABI Generation: A new leo abi command generates a JSON ABI from compiled .aleo files. The ABI includes struct and record definitions, mapping declarations, and transition signatures with input/output types and modes. leo build now automatically writes an abi.json alongside main.aleo. Faster Testing: leo test now skips proof generation by default, dramatically speeding up test cycles. Opt in to full proof generation with leo test --prove. Group Generator Access: Two new built-ins — Aleo::generator() and Aleo::generator_powers() — expose the network's group generator point to programs. Aleo::generator() returns the generator as a group, and Aleo::generator_powers() returns a [group; 251] array of precomputed powers, enabling in-program address derivation and other elliptic curve operations. External Structs: Programs can now reference structs defined in imported programs. Two structs with the same name and identical member structure are considered equivalent, resolving a common pain point when working with multi-program deployments. Increased Program Limits: Maximum program size has been increased from 100 KB to 512 KB. Maximum transaction size is now 540 KB. Maximum writes per finalize scope increased from 16 to 32. VK Migration (Amendment Deployments): A new deployment type allows updating a program's verifying keys without changing the program edition, owner, or re-running the constructor. This is essential for adding dynamic dispatch support to existing deployed programs. New REST endpoints support querying amendment counts and transaction history. Structured Error Messages: When an instruction fails, error messages now include the failing instruction index and a formatted instruction string, producing stack-trace-like output for nested calls. SDK Dynamic Dispatch: The DynamicRecord and DynamicFuture types have been added to support dynamic dispatch , Utilities: A stringToField()method has been added for converting program names to field elements Privacy and Security: Proving requests for the Delegated Proving Service can now be encrypted. A KeyStore abstraction has been added for persistent key storage across environments. Zeroizing destructors have been added that scrub private key material from WASM memory. MPC (multi-party computation) support has been added for constructing execution requests. WASM Memory: Maximum WASM memory has been raised to ~4 GB. API Endpoints: The API endpoint has migrated from api.explorer.provable.com/v1 to api.provable.com/v2. Improvements for Node Operators Automated Ledger Checkpoints: A new --auto_db_checkpoints=<path> flag enables rolling RocksDB checkpoint-based ledger backups every 1,000 blocks, maintaining up to 5 rolling snapshots. Filesystem Reorganization: Node-specific data (peer lists, proposal cache) now lives in a dedicated node-data directory, separate from the ledger. Use --node-data for custom paths and --auto-migrate-node-data for automatic migration. Dynamic Validator Whitelist: Nodes now maintain a file listing all currently connected validators, updated with every heartbeat. The format is IP-port pairs for easy scripting and firewall integration. New Metrics: Build info (version, git commit, branch) is now exposed as Prometheus gauge metrics. New gauges track total connected validator stake and the combined stake of validators running the same snarkOS SHA, useful during rolling upgrades. Network Stability: TCP socket configuration has been hardened, connection timeouts relaxed (handshake increased from 1s to 3s, high-level from 3s to 5s), and the BFT communication layer refactored from channel-based to direct callbacks, reducing async overhead and improving error propagation. CDN sync performance is improved through unchecked deserialization and threadpool reuse. New REST Endpoints: New routes for historical staking rewards, connected validator queries (/{network}/connections/bft/…), and amendment deployment metadata (/program/{programID}/amendment_count). Looking Ahead Interfaces, dynamic dispatch, and dynamic records provide the language-level machinery for standardized program contracts, runtime polymorphism, and open composability on Aleo — with privacy guarantees the EVM cannot provide and interface enforcement that extends beyond function signatures to records and mappings. The first major consumer of these features is already in progress: ARC-20, Aleo's interoperable token standard. More on that soon. Closing Notes The full changelogs for the referenced releases can be found here: https://github.com/ProvableHQ/snarkVM/compare/v4.5.0...v4.6.0 https://github.com/ProvableHQ/snarkOS/compare/v4.5.0…v4.6.0 https://github.com/ProvableHQ/leo/compare/v3.5.0…v4.0.0 https://github.com/ProvableHQ/sdk/compare/v0.9.16...v0.10.0 If you want to try it out, you can build from source today or download the mainnet release from Github March 30th. Find the current release schedule at:https://aleo.org/roadmap. Please report any issues you might come across! Contributors A big thank you to all the contributors on Github to this snarkOS, snarkVM, Leo, and SDK release! @AleoAlexander @Antonio95 @aripiprazole @awatts73 @d0cd @damons @dgrkotsonis @eranrund @iamalwaysuncomfortable @IGI-111 @JoshuaBatty @kaimast @ljedrz @marshacb @meddle0x53 @mitchmindtree @mohammadfawaz @raychu86 @Roee-87 @shaaibu7 @tcrypt25519 @tenequm @vicsn
Shield Wallet Changelog V1.16.0 Key highlights in this release: Add privacy-safe wallet analytics events for state snapshots and swap lifecycle tracking. Faster record updates after transactions. Improve record management stability and record usage for auto-join. Avoid RSS race conditions. Mark swap transaction as failed if swap send transaction failed. Linked Chinese translation for help center documentation and account derivation page. Polish light mode across tab bar, drawers, icons, and inputs. Upgrade SDK to 0.9.18. Dependency updates. V1.15.0 Key highlights in this release: Reduce RSS calls for active usage. Show pending auto-join transactions in the activity tab. Support paging for RSS records and enforce tags limit. Improve onboarding seed phrase UX with inline copy button and checkbox pulse animation. Update base URI of service status service to wallet API. Configurable stablecoin and token support for e2e tests. Dependency updates. V1.14.0 Key highlights in this release: Add animated transaction confirmation on Send, Swap, and Shield flows. Encrypted Record Scanning using Secure Enclave. Increase transaction confirmation speed with reduced polling frequency and more frequent record updates. Show balances and sort by balance in Swap token selector. Tap FROM token balance to autofill amount. Min/Max labels on token price chart with improved Y-axis scaling for low-volatility prices. New styling for drawer header and UI improvements on the settings screen. Dim amount input placeholder on focus. Telemetry for onboarding and network switch tracking. Replace TEE terminology with Secure Enclave in UI copy. Update proving mode descriptions in Settings. Fetch public balances independently of private balances. Scope auto-join to account. Multiple fixes across fee calculations, address formatting, transaction details display, and swap status updates. Dependency updates across security and build packages. V1.13.0 Key highlights in this release: Track onboarding_complete event for analytics. Fix padding on action buttons. V1.12.1 Key highlights in this release: Fix for Amplitude and Mixpanel analytics release. V1.12.0 Key highlights in this release: UI improvements on the home screen. Remove IP tracking from Amplitude and Mixpanel. Internal code organization for swap feature. V1.11.0 Key highlights in this release: Add support for more Aleo chain tokens in swaps. Swap transactions now appear before related send transactions in activity. Update Shield manifest. Multiple fixes across fee master and base fee handling. V1.10.0 Key highlights in this release: Add Refund Address and From Address to swap quotes. Enable mainnet auto-join for USAD and USDCx. TEE encrypted delegated proving. Download USAD proving keys for local proving. Display token amount instead of USD value in recents tab. Fix shield/unshield flows when price information is unavailable. Swap UI improvements. Dependency updates across security and SDK packages. V1.9.0 Key highlights in this release: Cross-chain Swaps (Beta Release) available via feature flag in User Settings. Add animations to home navigation icons. Download and store proving keys for improved performance. Update action button icons and fix related UI issues. Multiple fixes across account name display, token icons, and fee master fallback. V1.8.0 Key highlights in this release: Add tooltip to value change component. Disable adding accounts for private key accounts. Consolidate and standardize Shield Wallet messaging. Fix fee formatting that prevented wBTC from being sent. Multiple display fixes across transaction details and token symbols. Remove deprecated code. V1.7.0 Key highlights in this release: Auto-join reliability improvements with fallback to native join logic. Remove feature flag and make the new send flow enabled by default. Full typography system upgrade across the application (ABCDiatypeMono & InnovatorGrotesk). Visual UX enhancements including transaction loading animations and balance sync animations with a new refresh button. Performance improvements to local proving through multi-core processing. UX refinement by hiding value change during the first 24 hours. Improved usability across configuration screens in user settings menu. Multiple stability, reliability, localization, and QA fixes across balance, send flow, auto-join, tests, and translations. V1.6.1 Key highlights in this release: Add padding for header Import mixpanel core only (Addressing Chrome Store rejection for release 1.5.0) Updated settings test to check for shield url instead of provable url Updates shared setup for static tests V1.6.0 Key highlights in this release: New Send Flow with simplified UI and improved in-place interactions. (Feature Flag - User Settings) Unified Balance View with clear Public / Private breakdown. Banner notification system for real-time service outage visibility. Improved onboarding animation to reinforce brand voice and first-time experience. Multiple reliability, performance, and QA improvements across balance fetching, proving, and SDK updates. V1.5.0 Key highlights in this release: New Amount Screen as part of Send Flow V2 development. New onboarding animations to reinforce brand and first-time experience. Persistent auth lockout with exponential backoff and countdown UI. FIFO queue for dApp confirmations to prevent accidental clicks. Optimized record-fetching to reduce RSS calls. Added Mixpanel analytics service. Added support links to settings and derivation path documentation. Multiple security hardening improvements across connection validation, storage access, and password handling. Multiple stability and QA fixes across auto-join, scrollable screens, dApp interactions, and UI display. V1.4.0 Key highlights in this release: Add "Legacy" tag on receive screen and account switcher drawer. Show loader when fetching private transactions for the first time. Add Sentry tracking. Production extension build also available on localhost. Multiple fixes across stablecoin labeling, token display positioning, and onboarding registration. Renames Galileo to Shield V1.3.0 Key highlights in this release: Add Account UI update (Derivation Path) and derivation path testing. Fetch transactions using cursor-based pagination. Make auto-join turned on by default. Add empty state in token select. Multiple stability fixes across wallet creation, RSS registration, token sync, and manifest config. Multiple display fixes including USDCx transactions appearing as USAD in Activity tab and transaction history improvements. V1.2.0 Key highlights in this release: Added auto-join support for USAD on testnet. (Adaptor) Added requestTransactionHistory and transitionViewKeys functions to the dApp interface. Enabled private fees when deploying programs. Added support for both /0 and /683 derivation path types. Added a dev-only recipient picker for Send Flow V2. Improved handling of compliance tokens returned by the API. Updated Chrome manifest description and configuration. Optimized performance when handling large transaction history lists. Removed usage of CoinGecko APIs. Allowed users to pick records on the View Records screen. Multiple fixes across transaction details display, zero-value transfers, RSS registration, seed input rendering, and balance preview values. V1.1.0 Key highlights in this release: New UI style for mode selection, including proving mode and record management. Analytics events for auto-join, fee-master usage, and proving mode changes. Terms & Conditions and Privacy Policy links in Settings. More readable market data presentation. Scroll position is preserved when returning to a screen. Reliable detection of auto and manual join transactions. Support for compliant stablecoins. Fee master usage for the shield/unshield flow. Multiple fixes across ESLint configuration, i18n, duplicate pending transactions, amount validation in split flow, and send flow navigation state. V1.0.0 Key highlights in this release: Converted all authentication registration and API paths to use the new Auth V3 system. Transaction status updates now run on a background service for better reliability. Introduced a dedicated component for enhanced token management capabilities. Added new endpoint integration for token price history and market information. Improved balance visibility icon for clearer show/hide of available funds. Implemented guardrails on private send flow to ensure safe automatic record consolidation. Cleaned up send screen interface elements for a more streamlined experience. Combined Advanced & Experimental settings categories for easier navigation. Removed redundant info cards in private send and unshield flows when auto-join is enabled. Multiple fixes across auto-join behavior, transaction history display, avatar consistency, and error recovery.
Provable is pleased to announce the launch of Shield, a privacy-focused crypto wallet built for the next phase of digital asset adoption. As the industry confronts the limits of transparent-by-design blockchains, Shield delivers the first complete infrastructure for fully private transactions on Aleo: a private vault for storing and moving wealth without exposure. Shield arrives at a critical moment. Stablecoins processed nearly $9 trillion in adjusted transaction volume over the past year, yet most of that activity still runs on public blockchains where balances, counterparties, and transaction histories remain permanently exposed. For individuals seeking to protect their wealth and enterprises managing payroll, treasury operations, and cross-border settlement, full onchain visibility is not just impractical. It is untenable. This tension between transparency and privacy has reached the highest levels of the industry. The U.S. Securities and Exchange Commission recently convened a public roundtable on financial surveillance and privacy, signaling growing recognition that crypto cannot scale into mainstream finance without stronger confidentiality guarantees. Shield is Provable's direct response to this moment. The Definitive Wallet for Private Finance Shield is a fully self-custodial wallet engineered by the architects of the Aleo blockchain. It is purpose-built for private stablecoins and confidential digital asset management at any scale, offering users a secure vault where wealth remains invisible to outside observers. By leveraging zero-knowledge technology, Shield encrypts balances, transaction amounts, sender and receiver details, and fees by default. Users do not opt into privacy. Privacy is the starting point. This architecture delivers the strongest privacy experience available from any wallet, ensuring that financial activity remains confidential without sacrificing the verifiability that blockchain technology provides. Shield is designed for users who refuse to compromise. Individuals gain a private vault for their wealth, with the financial privacy that traditional banking has always provided but that public blockchains have failed to deliver. Institutions gain the confidentiality required for payroll, vendor payments, and treasury operations without exposing sensitive business data onchain. Both can transact knowing their assets are protected by the same zero-knowledge cryptography that powers the Aleo network. The wallet's self-custodial design means users maintain full control of their funds and private keys at all times. Provable cannot access user assets, freeze accounts, or view transaction history. This is private finance with no intermediaries and no compromises. Built on 18 Months of Infrastructure Shield is the final piece of an intensive strategic initiative. While much of the industry has continued to discuss the theory of privacy, Provable has been building the reality: a fully operational, privacy-first wallet backed by the Aleo ecosystem's maturing infrastructure. Shield launches with integrations already in place. Users can access private stablecoins from Circle and Paxos Labs, with built-in risk mitigation and analytics from TRM Labs providing compliance infrastructure from day one. Fiat on-ramps and off-ramps through Coinbase, Binance Alpha, Kraken, and Revolut connect Shield to traditional finance. Cross-chain bridges from Near Intents, Hyperlane and HoudiniSwap enable interoperability. The network itself is secured by validators including Google Cloud, Blockdaemon, and NTT Digital. This is not a beta or a testnet preview. Shield launches with the full stack operational. Private stablecoin payments are a present capability, not a future goal. Key Takeaways Shield is now live. The first privacy-focused wallet purpose-built for private stablecoins on Aleo. Privacy by default. Zero-knowledge technology encrypts balances, transaction amounts, sender and receiver details, and transaction fees. Self-custodial. Users maintain full control of their funds and private keys. Provable cannot access, or view user assets. Ecosystem ready. Integrations with leading stablecoin issuers, exchanges, bridges, and compliance providers are already in place. Download now. Private and simple stablecoin payments are available today. Download Shield: shield.app About Provable Provable is the Labs company within the Aleo ecosystem, focused on developing products for compliant, confidential payments and creating tools for developers to deploy and manage applications on the Aleo blockchain. As the core research and development lab, Provable drives the technical evolution of the Aleo network through cutting-edge cryptographic research, protocol engineering, and the creation of advanced development tools. Shield™ is a trademark of Provable Inc. Nothing herein is intended as investment or any other advice.
Our team is happy to announce a new version of the Aleo Stack! This update includes changes to the node implementation snarkOS and the high-level programming language Leo - as well as their supporting libraries. This release unlocks fast and reliable end-to-end (E2E) testing of Leo programs, streamlines operations for validators, and introduces a limit on the total supply of Aleo credits. If you want to try it out, you can build from source today or download the mainnet release from Github February 13th. Find the current release schedule at: https://aleo.org/roadmap . Please report any issues you might come across! Consensus Upgrade: V13 The release schedule is as follows: Canary (validator test network) Release: January 12th Hard fork: ~January 15th (exact block heights) Testnet (developer test network) Release: March 2nd Hard fork: March 7th (block height 14,905,675) Mainnet Release: March 9th Hard fork: March 14th (block height 16,847,884) ATTENTION: Validators that do not upgrade in time will be at risk of forking and require manual intervention. Clients that do not upgrade will be at risk of halting until an upgrade occurs. Cap on Total Supply of Aleo Credits With the approval of ARC-0047, the Aleo network has now established a hard cap on the total supply of Aleo Credits at 5,000,000,000 ALEO. The cap will be enforced by halting block rewards and proving rewards at a predetermined block height (based on theoretical maximum issuance). Note that the emission rates of these rewards are not being modified. Instead, both reward streams will terminate at a predetermined block height in the far future. With the current average block rate, we expect this to occur at the conclusion of Q4 2049. Improvements for Developers leo devnode One of the most important points of software engineering is testing. While Leo recently added support for unit tests, a good E2E test suite was missing. Existing solutions require running a small development network with multiple validators and clients - slow, expensive, and clunky. leo devnode is a new tool that creates a local lightweight development client to enable developers to rapidly test and iterate through Aleo program design. leo devnode has two commands: leo devnode start will initiate the development client at localhost:3030 leo devnode advance creates a single block and adds it to the ledger. Optionally, this command takes a value n, which advances the ledger by n blocks. By default, broadcasting a transaction to the devnode will automatically produce a block and advance the ledger. However, passing the --manual-block-create flag at startup will allow users to broadcast multiple transactions to a queue without creating a block. In order to advance the ledger in this scenario, users will need to use the leo devnode advance command. Additionally, a --skip-execution-proof flag has been added for the for leo execute command. This flag will create transactions without generating the corresponding ZK proof, further accelerating the testing process. We have provided some examples of how to use the devnode feature alongside the Javascript/Typescript SDK. Program Edition Handling in Leo Leo now handles editions for local and remote programs in a more robust way. As local programs haven't been deployed yet, they do not possess a real onchain edition. We default to edition 1 for certain commands that don’t interact onchain to avoid the check in snarkVM that rejects edition 0 programs without constructors. This keeps local development frictionless. Command Local Programs Network Dependencies leo run Default to edition 1 Fetch edition from network leo execute Default to edition 1 Fetch edition from network leo synthesize Default to edition 1 Fetch edition from network leo deploy N/A Fetch edition from network + V8 constructor check leo upgrade N/A Fetch edition from network + V8 constructor check Additionally if a network dependency is at edition 0 without a constructor, a more verbose error will now be produced with a clear message explaining the program needs to be upgraded onchain. External Structs in Leo This release also introduces an important change to how external structs are handled in Leo. In previous versions of Leo, external structs did not need to be qualified with the program they came from. All imported structs effectively lived in a global namespace. Now, external structs must now be explicitly qualified with the program that defines them. Struct names are no longer globally scoped across imports. For example, given the following program foo.aleo: program foo.aleo; struct Foo { x: u32 } transition main(f: Foo) { .. } Another program (bar.aleo) must qualify struct Foo with foo.aleo in order to use it: import foo.aleo; program bar.aleo; transition main() -> foo.aleo/Foo { return foo.aleo/Foo { x: 42 }; } New --json-output flag in the Leo CLI The Leo CLI now supports a new --json-output flag that writes structured, machine-readable JSON output to disk. This makes it easier to integrate Leo commands into scripts, tooling, and automated workflows. The --json-output flag is available for the following commands: deploy upgrade run execute test query synthesize Save JSON output to the default location: leo deploy --json-output Save JSON output to a custom file path: leo execute main --json-output=my-results.json By default, JSON output files are written to the build/json-outputs/ directory, with one file per command. For example: build/json-outputs/deploy.json build/json-outputs/execute.json build/json-outputs/run.json Changes to snarkos developer execute By default, snarkos developer execute commands will now use the V2 endpoints for api.explorer.provable.com. However, backwards compatibility is still supported for the V1 endpoints. Attempting to use an account with an insufficient balance of credits now produces clearer error messaging. A bug was fixed which prohibited fetching and utilizing the right editions of imported programs. Miscellaneous Updates The size of the compiled program (in kB) will be output by the CLI when calling leo build, leo deploy, and leo upgrade. A --disable-update-check flag has been added to the Leo CLI. This allows for disabling the Leo’s automatic update check, allowing for more consistently reproducible output from the CLI. Various performance improvements have made their way into AleoVM, such as better block caching and better database deserialization. SDK Upgrades to Proving Speed & Proving Key Management 10-20% speedup local wasm-based proving via wasm optimizations made through applying wasm-opt Adds a new KeyStore interface for storing proving and verifying keys on disk for node JS and storing them in IndexedDB for web and wallet applications. This helps developers cache proving keys for later re-use improving wasm proving times a further 30% Miscellaneous Upgrades: Adds support for getting the address of a program from the Program object Improvements for Node Operators Improved Database Organization A new node-data directory has been introduced that contains all node-specific data (essentially everything but the ledger). This is located at ~/.aleo/storage/node-data-{network_id} for production or ./node-data-{network_id}-{dev} for development nodes. Alternatively, users can also pass a value to --node-data and store the data at a custom path. Previously, these files lived in the similarly-named ledger-* folder. At startup, a node will check for any files that indicate that the old storage format is used. In that case, a message is printed on how to migrate, and the node will not start. Alternatively, nodes can also be started with --auto-migrate-node-data to move the appropriate files automatically from the ledger-* folder to the node-data-* folder. Miscellaneous Updates To enhance security, validators will no longer be able to connect to unknown/untrusted peers. This may cause issues for validators who have some managed nodes which frequently rotate. For now, make sure that you pass in peers explicitly via the --peers flag. A discussion is present here for those interested to pass in hostnames. A general UnknownReason type has been added for handling connections between peers. This will now be the default DisconnectReason when encountering an unknown value. This is useful for future compatibility, as adding a new disconnect reason should not require a message version bump or a synchronous update. Nodes will no longer print debug logs when set to the lowest verbosity setting. The amount of stake of unconnected validators is logged and available via the new snarkos_bft_connected_stake_as_percentage metric The latest observed height of other validators is logged to aid debugging. Node restarts are now ~10x faster by cleverly caching the block tree. Good old flamegraphs came to the rescue. Various stability improvements have made their way to make snarkOS nodes ever more robust and to be able to handle a variety of adversarial and benign edge cases in the network, reducing the impact of race conditions in syncing and consensus logic. Closing Notes The work for this release encompassed changes across 500 source code files and touched 20.000+ lines over 350+ commits by the amazing contributors listed below. The full changelogs for the referenced releases can be found here: https://github.com/ProvableHQ/snarkVM/compare/v4.4.0...testnet-v4.5.1 https://github.com/ProvableHQ/snarkOS/compare/v4.4.0…testnet-v4.5.1 https://github.com/ProvableHQ/leo/compare/v3.4.0…testnet-v3.5.0 If you want to try it out, you can build from source today or download the mainnet release from Github February 13th. Find the current release schedule at:https://aleo.org/roadmap. Please report any issues you might come across! Contributors A big thank you to all the contributors on Github to this snarkOS, Leo, SDK and snarkVM release! @AleoAlexander @antonio95 @copilot @d0cd @kaimast @iamalwaysuncomfortable @IGI-111 @ljedrz @meddle0x53 @mohammadfawaz @niklaslong @tenequm @raychu86 @Roee-87 @vicsn
Why we've implemented comprehensive fuzzing for the Aleo VM using two complementary approaches.
Our team is happy to announce a new version of the Aleo Stack, which includes the node implementation snarkOS and the programming language Leo. These applications are built on top of the developer-friendly snarkVM and Aleo SDK libraries. Aleo is an open source cryptocurrency through which developers can deploy cryptographically secure dApps. Most notably, this release unlocks using block timestamps in Aleo smart contracts. A number of stability improvements have made their way into the nodes. Costs can now be estimated using Authorizations instead of Executions, making it easier for wallets to determine fees. If you want to try it out, you can build from source today or download the mainnet release from Github November 24th. Find the current release schedule at: https://provablehq.github.io/. Please report any issues you might come across! What's new in snarkOS v4.4.0 Consensus change: ConsensusVersion V12 A consensus change will occur at the following times: Canary - ~9AM PT November 14th, 2025 Testnet - ~9AM PT November 21st, 2025 Mainnet - ~9AM PT December 2nd, 2025 The exact block heights will be encoded in the snarkVM library at release. ATTENTION: Validators that do not upgrade in time will be at risk of forking and require manual intervention. Clients that do not upgrade will be at risk of halting until an upgrade occurs. New operand: block.timestamp This PR added a new block.timestamp operand that can be used in finalize. This adds to the existing block.height operand for accessing block state, and allows for richer smart contract logic on the Aleo chain. Improvements for node operators Further improvements worth mentioning include: Logging has been improved to allow for better debugging of potential consensus or operational issues. Bootstrap validator peering has been stabilized, lowering the risk of DoS attacks A new BLOCK_LAG histogram metric to track the validator's system time with the block timestamp of the latest processed block. This is tracked in milliseconds.. This PR introduces a `--trusted_peers_only` flag, while deprecating `--allow_external_peers` and `--rotate_external_peers`. The new flag can be used by a node to sync with just the peers passed explicitly via --validators and --peers. Reduced erroneous reporting of stale transmissions What’s new in Leo v3.4.0 Empty arrays and empty loop Arrays of size 0 and loops over empty ranges are now supported in Leo. While these constructs do not produce any instructions in the compiled Aleo bytecode, they enable more generic or pattern-based programming styles in Leo, especially when writing code that abstracts over sizes, iterates conditionally, or uses compile-time parameters. For example: inline build_default::[N: u32]() -> [u8; N] { let xs: [u8; N] = [0u8; N]; // When N = 0 this loop is simply skipped for i:u32 in 0..N { xs[i] = 1u8; } return xs; } let xs = build_default::[0](); // yields [] Stability improvements Improved identifier validation in Leo, resulting in clearer and more precise error messages, especially when Leo identifiers conflict with reserved Aleo identifiers. Fixed an issue where local const values failed to compile correctly when used in loop ranges. Resolved a crash in the common subexpression elimination optimization pass that occurred for certain patterns of function calls. Library and tooling updates snarkVM v4.4.0 snarkVM is a zkVM library. It powers the Aleo network and most of the software used to interact with it. The following contains some of the most relevant changes which were introduced: Support was added to compute a fee based on an Authorization instead of an Execution: execution_cost_for_authorization execution_cost_v* functions have been made private and are no longer accessible, use execution_cost instead The tracing feature has been removed from snarkvm-ledger-store Closing notes The full changelogs for the referenced releases can be found here: https://github.com/ProvableHQ/snarkVM/compare/v4.3.0...testnet-v4.4.0 https://github.com/ProvableHQ/snarkOS/compare/v4.3.0…testnet-v4.4.0 If you want to try it out, you can build from source today or download the mainnet release from Github November 25th. Find the current release schedule at: https://provablehq.github.io/. Contributors A big thank you to all the contributors on Github to this snarkOS, Leo, SDK and snarkVM release! @antonio95 @copilot @d0cd @kaimast @iamalwaysuncomfortable @IGI-111 @ljedrz @meddle0x53 @mohammadfawaz @mikebenfield @niklaslong @tenequm @raychu86 @Roee-87 @vicsn
We’re excited to announce that Provable and Demox Labs have entered into an agreement for Provable to acquire the Leo Wallet, a leading privacy-preserving crypto wallet for the Aleo Network and community.
We're excited to announce the launch of Provable Explorer V2, the default block explorer for the Aleo blockchain.
Introduction Our team is happy to announce a new version of the Aleo Stack, which includes the node implementation snarkOS and the programming language Leo. These applications are built on top of the developer-friendly snarkVM and Aleo SDK libraries. Aleo is an open source cryptocurrency through which developers can deploy cryptographically secure dApps. Most notably, this release unlocks native Keccak+ECDSA-based signature verification, allowing for messages from other popular cryptocurrency ecosystems like Ethereum to be verified in Aleo’s public smart contract scope - while still having access to native zero knowledge proofs verification too. Moreover, maximum array sizes have increased, node syncing is 5x faster, and both transaction and solution broadcasting has been greatly stabilized. If you want to try it out, you can build from source today or download the mainnet release from github October 28th. Find the current release schedule at: https://provablehq.github.io/. Please report any issues you might come across! What's new in snarkOS v4.3.0 Consensus change: ConsensusVersion V11 A consensus change will occur at the following times: Canary - ~9AM PT October 17th, 2025 Testnet - ~9AM PT October 24th, 2025 Mainnet - ~9AM PT November 4th, 2025 The exact block heights will be encoded in the snarkVM library at release. ATTENTION: Validators that do not upgrade in time will be at risk of forking and require manual intervention. Clients that do not upgrade will be at risk of halting until an upgrade occurs. Keccak+ECDSA signature verification opcodes Aleo added native ECDSA signature verification to on-chain (finalize) execution to improve interoperability and broaden supported signature formats. With on-chain verification, programs can trust externally signed messages and approvals without off-chain helpers, enabling cross-chain messaging, asset flows, multisig/governance, etc. The initial scope focuses on verification with a simple canonical representation and deterministic, consensus-safe behavior, while leaving room to add other schemes and encodings over time. The core design revolves around the new `ecdsa.verify.*` instructions that will be available to new programs. In order to support this, we require a lot of supporting features that enable the use of the new signature verification algorithm. ECDSA This PR introduces native ECDSA signature verification to on-chain (finalize) execution to improve interoperability and broaden supported signature formats. With on-chain verification, programs can trust externally signed messages and approvals without off-chain helpers, enabling cross-chain messaging, asset flows, multisig/governance, etc. The initial scope focuses on verification with a simple canonical representation and deterministic, consensus-safe behavior, while leaving room to add other schemes and encodings over time. The list of new ecdsa.verify.<variant> instructions are as follows: ecdsa.verify.keccak256 ecdsa.verify.keccak256.raw ecdsa.verify.keccak256.eth ecdsa.verify.keccak384 ecdsa.verify.keccak384.raw ecdsa.verify.keccak384.eth ecdsa.verify.keccak512 ecdsa.verify.keccak512.raw ecdsa.verify.keccak512.eth ecdsa.verify.sha3_256 ecdsa.verify.sha3_256.raw ecdsa.verify.sha3_256.eth ecdsa.verify.sha3_384 ecdsa.verify.sha3_384.raw ecdsa.verify.sha3_384.eth ecdsa.verify.sha3_512 ecdsa.verify.sha3_512.raw ecdsa.verify.sha3_512.eth The variant types allow the users to select the underlying hash function used, the serialization type (with .raw), and if the address being verified is a 20-byte Ethereum address. The .raw variants indicate if the message should be serialized in it's raw bit form or with Aleo specific variant bits; this is necessary to ensure compatibility with external signing libraries. By default the .eth variants will serialize the message in it's raw form, so there is no need for an additional .eth.raw suffixed variant. Both .raw and .eth variant messages must be "byte-aligned", meaning that the length of it's bit representation must be a multiple of 8. Hash Functions To further interoperability of AVM programs between EVM programs, this PR introduces .native variants of the hash.keccak* and hash.sha3* opcodes that allow the user to output the hash as a bit array. These opcodes do not implicitly perform the BHP hash on the result. The PR also introduces .raw variants use the raw serialization of the pre-image that does not contain any Aleo specific variant bits. The list of new instructions are as follows: hash.keccak256.native hash.keccak384.native hash.keccak512.native hash.sha3_256.native hash.sha3_384.native hash.sha3_512.native hash.keccak256.native.raw hash.keccak384.native.raw hash.keccak512.native.raw hash.sha3_256.native.raw hash.sha3_384.native.raw hash.sha3_512.native.raw hash.keccak256.raw hash.keccak384.raw hash.keccak512.raw hash.sha3_256.raw hash.sha3_384.raw hash.sha3_512.raw Note that all .raw variant inputs must be byte-aligned. Serialization Operations This PR also introduces serialize.* and deserialize.* opcodes which allow encoding and decoding AVM values to and from bits respectively. The list of new instructions are as follows: serialize.bits serialize.bits.raw deserialize.bits deserialize.bits.raw Increase Array Size Limit to 512 `N::MAX_ARRAY_ELEMENTS` is updated from 32 to 512. This provides more general flexibility for handling inputs to hash and signature verification functions without having to construct custom structs to get around the existing limitation. Faster syncing for Aleo nodes By combining faster deserialization and better pipelined fetching of blocks, syncing was sped up by up to 5 times! Syncing speed is continuously monitored in CI to prevent regressions. Benchmark suite Current: 50aa002 Previous: 83805f6 Ratio rest-get-block 2.68524245510956 ops/s 0.65 ops/s 0.24 rest-block-height 7863.4395405039495 ops/s 185.18 ops/s 0.023549491166830062 p2p-sync 1.3 blocks/s 0.25 blocks/s 0.19 p2p-sync-speed-variance 1.240252 blocks^2/s^2 0.202773 blocks^2/s^2 0.16 bft-sync 1.16 blocks/s 0.2 blocks/s 0.17 cdn-sync 1.23 blocks/s 0.43 blocks/s 0.35 More stable transaction and solution broadcast Both transaction and solution broadcast now offer the same broadcast strategy to ensure even when clients are out of sync they may still propagate transactions and solutions. Moreover, transactions which hit a "global state root not found" errors are still propagated. In all likelihood, these are caused by nodes temporarily being behind. This PR improves the network's UX by letting those transactions propagate anyway. Improvements for node operators Further improvements worth mentioning include: A local peer cache was introduced for client, prover and validator nodes. The cache is stored in the ledger folder, and allows a node to be able to find its previous (high quality) peers again. Ultimately this paves the way for clients not having to manually specify other clients anymore, as after an initial connection via bootstrap peers, they will always be able to find each other again directly. Connections to new nodes are partially guided by whether they are ahead or not. Nodes will now shut down when a panic occurs and log a clean error. This PR implements snarkos account import to allow derivation of view key and address from a given private key, allowing easier testing without the use of the leo binary. Logs were improved (PR) This PR introduces a special bootstrap client, which can be enabled by running snarkos start with --bootstrap-client. This client is specialized in facilitating peer list gossip, and doesn’t participate in block syncing. This PR documents a native backup utility. Node operators should be able to create fast local backups either: using a JWT, which they can read from a file instead of stdout explicitly passing in --nojwt, not having to authenticate if they already have a solid firewall and don't want to deal with the complexity of JWT creation and backup Colored logging is currently disabled to protect against vulnerabilities. What’s new in Leo v3.3.0 Optional Types (T?) Leo now supports first-class optional types using the T? syntax (e.g., u8?, Foo?, [u64?; 2]). Optional values can be compared with none, assigned, passed into inline functions, and stored in arrays and structs. program optionals.aleo { struct Point { x: u32, y: u32 } transition main() { // Optional integers let x: u8? = 42u8; let y = x.unwrap(); // Returns 42u8 let z: u8? = none; let a = z.unwrap_or(99u8); // Returns 99u8 // Array of optionals let arr: [u16?; 2] = [1u16, none]; let first_val = arr[0].unwrap(); // Returns 1u16 let second_val = arr[1].unwrap_or(0u16); // Returns 0u16 // Optional struct let p: Point? = none; let p_val = p.unwrap_or(Point { x: 0u32, y: 0u32 }); // Returns default Point } } Type coercion from T to T? is supported in variable definitions, inline function calls, and intermediate expressions. Explicit unwrapping is required to go from T? → T. New Storage System Leo now supports persistent storage variables and storage vectors using the storage keyword. Storage variables and vectors are declared at program scope, similar to mappings. program storage_ops.aleo { struct Point { x: field, y: field } storage counter: u32; // singleton storage variable storage points: [Point]; // storage vector of `Point`s transition main() -> Future { return async { counter = 5u32; let old = counter.unwrap_or(0u32); // returns optional points.push(Point { x: 1field, y: 2field }); let first = points.get(0u32).unwrap(); points.set(0u32, Point { x: 3field, y: 4field }); counter = none; // unset } } } Storage vectors supported core operations: vec.push(10u32); // Push 10u32 at the end of vector `vec` let x = vec.pop(); // Pop and return the last element of `vec` let y = vec.get(5); // Get element at index 5 vec.set(3, 5u32); // Set element at index 3 to `5u32` let y = vec.len(); // Return the number of elements in `vec` vec.swap_remove(3); // Remove element at index `3` from `vec` and returns // it. The removed element is replaced by the last // element of the vector. Internally, the compiler rewrites these high-level constructs into mappings and mapping operations. ECDSA Signature Verification ECDSA signature verification is now supported with 20 variants covering different hash algorithms and address formats: // Verify with digest (pre-hashed message) let valid: bool = ECDSA::verify_digest(sig, addr, digest); let valid: bool = ECDSA::verify_digest_eth(sig, eth_addr, digest); // Verify with Keccak256 hashing let valid: bool = ECDSA::verify_keccak256(sig, addr, msg); let valid: bool = ECDSA::verify_keccak256_raw(sig, addr, msg); let valid: bool = ECDSA::verify_keccak256_eth(sig, eth_addr, msg); // Also available: keccak384, keccak512, sha3_256, sha3_384, sha3_512 Parameters: sig: [u8; 65] - ECDSA signature (r, s, v) addr: [u8; 33] - Public key for standard variants, [u8; 20] for *_eth variants digest: [u8; 32] - Pre-hashed message for digest variants msg: Any byte-aligned type - Message to hash and verify Raw Hash Operations Leo now supports “raw” hash variants: raw hash variants omit metadata of a variable and directly hash the input bits. They are useful for interoperability with external, particularly EVM, systems. Note: inputs for raw variants of Keccak* and Sha3* must by byte-aligned (meaning the number of bits must be a multiple of 8). // Raw hash functions return the same types as standard variants let h: field = Keccak256::hash_to_field_raw(input); let h: group = BHP256::hash_to_group_raw(input); let h: address = Pedersen64::hash_to_address_raw(input); // Native variants return bit arrays instead of field elements let bits: [bool; 256] = Keccak256::hash_native(input); let bits: [bool; 256] = Keccak256::hash_native_raw(input); // Available for: BHP256, BHP512, BHP768, BHP1024, Pedersen64, Pedersen128, Poseidon2, Poseidon4, Poseidon8, Keccak256, Keccak384, Keccak512, SHA3_256, SHA3_384, SHA3_512 Serialization/Deserialization Operation Leo now supports “serialize” and “deserialize” data operations to and from bits. This supports both metadata-inclusive and raw variants. Note: the compiler will check that the bit sizes actually match. // Standard serialization (includes type metadata) let bits: [bool; 58] = Serialize::to_bits(value); let value: u32 = Deserialize::from_bits::[u32](bits); // Raw serialization (no metadata, just raw bits) let bits: [bool; 32] = Serialize::to_bits_raw(value); let value: u32 = Deserialize::from_bits_raw::[u32](bits); // Works with arrays too let bits: [bool; 128] = Serialize::to_bits_raw([1u32, 2u32, 3u32, 4u32]); let arr: [u32; 4] = Deserialize::from_bits_raw::[[u32; 4]](bits); Bit Lengths Raw: Exact type width u32 = 32 field = 253 scalar = 251 address = 253 Non-raw: Type width + metadata overhead leo synthesize Command Generate proving and verifying keys for all transitions in a local or remote Leo program, along with circuit metadata: leo synthesize credits.aleo --save keys --endpoint https://api.explorer.provable.com/v1 --network mainnet Output includes: Public inputs Variables Constraints Non-zero entries in matrices Circuit ID Proving and verifying keys saved to disk This enables better understanding of program size and key management. Lossless Syntax Tree Parser A new lossless syntax tree parser has been added. While this does not directly impact users yet, it lays the foundation for a future code formatter. Common Subexpression Elimination (CSE) New optimization pass reduces bytecode size by eliminating redundant expressions. Enhanced Error Messages Error messages now support displaying multiple related source locations, starting with duplicate struct and record member detection: struct Person { name: field, age: u8, name: field, } Before, only the duplicate location was shown. Now both the original and duplicate locations are displayed: Error [ETYC0372017]: the name `name` is defined multiple times in struct `Person` --> src/main.leo:3:9 | 3 | name: field, | ^^^^^^^^^^^ previous definition here ... 5 | name: field, | ^^^^^^^^^^^ redefined here Remaining stability improvements Various fixes to the interpreter related to hashing correctness Fixed broken leo query committee endpoint Validates program names in leo new against reserved SnarkVM keywords Library and tooling updates snarkVM v4.3.0 snarkVM is a zkVM library. It powers the Aleo network and most of the software used to interact with it. The following contains some of the most relevant changes which were introduced: The snarkVM CLI was removed - instead we encourage users to make use of the snarkos developer or leo cli tools. Several fixes for WASM-based builds were introduced, e.g. to allow loading the inclusion proving key from memory and supporting custom consensus heights for testing. Closing notes The full changelogs for the referenced releases can be found here: https://github.com/ProvableHQ/snarkVM/compare/mainnet...testnet https://github.com/ProvableHQ/snarkOS/compare/mainnet...testnet https://github.com/ProvableHQ/snarkVM/compare/v4.2.2...testnet-v4.3.0 https://github.com/ProvableHQ/snarkOS/compare/v4.2.2…testnet-v4.3.0 If you want to try it out, you can build from source today or download the mainnet release from github October 28th. Find the current release schedule at: https://provablehq.github.io/. Contributors A big thank you to all the contributors on Github to this snarkOS, Leo, SDK and snarkVM release! @antonio95 @copilot @d0cd @eranrund @Forostovec @henrikkv @iamalwaysuncomfortable @kaimast @ljedrz @meddle0x53 @mohammadfawaz @mikebenfield @niklaslong @tenequm @tetektoza @raychu86 @Roee-87 @usagi32 @vicsn
Our team is happy to announce a new version of the Aleo Stack, which includes the node implementation snarkOS and the programming language Leo. These applications are built on top of the developer-friendly snarkVM and Aleo SDK libraries. Aleo is an open source cryptocurrency through which developers can deploy cryptographically secure dApps. Most notably, this release unlocks a reduction of base fees by 90%, as well as the introduction of priority fees. This effectively creates a fee market, allowing users to bid in order to get a higher priority in the mempool. The release also introduces various quality of life improvements such as new /v2/ snarkOS endpoints with more informative responses, performance improvements, as well as a `Leo update` command. If you want to try it out, you can build from source today or download the mainnet release from github September 9th. Find the current release schedule at: https://provablehq.github.io/. Please report any issues you might come across! What's new in snarkOS v4.2.0 Consensus change: ConsensusVersion V10 A consensus change will occur at the following times: Canary - ~9AM PT August 29th, 2025 Testnet - ~9AM PT September 5th, 2025 Mainnet - ~9AM PT September 16th, 2025 The exact block heights will be encoded in the snarkVM library at release. ATTENTION: Validators that do not upgrade in time will be at risk of forking and require manual intervention. Clients that do not upgrade will be at risk of halting until an upgrade occurs. Reduced Fees + Priority Fees The use of zero knowledge cryptography in Aleo enables a highly scalable blockchain network. However, those scalability benefits have not translated into low fees on the Aleo network - yet. Because of a large focus on security, high fees have served as an additional layer of defense against Denial of Service attacks. The time has come to deliver on the promise of zero-knowledge proofs, and to make transactions cheap. Technically, this will soon be possible because of the spend limits which are introduced, acting as another layer of defense against high compute. As such, this ARC proposes to reduce compute-related costs by a factor of 25x, which will significantly bring down average transaction costs by up to 92%. Note that private transfers are not impacted, because they did not incur any compute costs, which was the aspect which has been discounted. Example deployment cost reduction Program Price before [microcredits] Price after [microcredits] Reduction [%] credits.aleo 134,619,400 115,123,243 14.4 grant_disbursement_arcane.aleo 13,805,525 8,953,181 35.1 Example execution cost reduction Function Price before [microcredits] Price after [microcredits] Reduction [%] credits.aleo transfer_public execution 34,060 2,725 91.9 credits.aleo transfer_private execution 2,242 2,242 0 Priority fees This release also introduces priority fees which effectively create a fee market, allowing users to bid in order to get a higher priority in the mempool. In more technical detail, this PR introduces a priority queue for transactions containing a nonzero priority fee. This is drained before the pre-existing transactions queue when sending transactions to the BFT. A few notes on the current design: Priority fees for transactions already in the mempool cannot be updated. There is no protection against starvation: if the priority pool stays full enough, transmissions from the standard queue will not be sent to the BFT. Batch building is not atomic w.r.t. the memory pool. New endpoints Check transaction on broadcast Submitting transactions to blockchains and developing on them can be difficult. In order to verify transactions, you need the latest state, and it is ultimately up to consensus to include a transaction into a block, which is a multi-stage opaque process. To improve the quality of life for users and developers, this PR introduces a new feature for nodes allowing them to perform an early optional check on the transaction, and to return the result synchronously to the user: // POST /<network>/transaction/broadcast?check_transaction={true} The reason this is optional, is that for many applications, performance is critical, so the default behaviour is the same as before: the user gets a response just confirming receival, not approval. Fetching a batch of statePaths This PR adds a new REST endpoint that allows users to fetch multiple state paths at once. This will help mitigate the global state root to be the same across iterations issues seen when users/provers are querying for state. GET /<network>/statePaths?commitments=cm1,cm2,... The commitments in the query string are comma separated. At most 16 commitments can be fetched at a time. Informative snarkOS JSON-RPC responses snarkOS now supports versioned API endpoints. This change is backwards compatible, meaning by not indicating any version, or by using the /v1/ prefix, the original responses will be used. New /v2/ snarkOS endpoints have been introduced which return more informative error messages. Instead of only returning a 500 or 429, the REST API now returns the error chain as JSON It will (try to) set the HTTP status code correctly: /// 400 Bad Request - Invalid input, malformed parameters, validation errors /// 404 Not Found - Resource not found /// 422 Unprocessable Entity - Business logic validation errors /// 429 Too Many Requests - Rate limiting /// 503 Service Unavailable - Temporary service issues (node syncing, feature unavailable) /// 500 Internal Server Error - Actual server errors, unexpected failures These new return codes may become available via updated explorer APIs as well. Improvements for node operators Some further improvements worth mentioning include: Networking code has been significantly cleaned up, leading to fewer spurious connection issues. (#3754) Syncing has been further sped up and stabilized (#2745) Running a network with the `test_network` feature now prints more low level debugging information. Peers can now be specified both by IPs and hostnames. (#3768) ./snarkos start --peers "validator0:4130,client0:4130" The "Overview" page in the terminal UI (display) is usable again. It now shows the currently connected peers and information about the latest block. (#3767) What’s new in Leo 3.2.0 Leo Modules Leo 3.2.0 comes with a module system. Given a file other_module.leo containing struct, const, and inline definitions like this: const X: u32 = 2u32; struct S { a: field } inline increment(x: field) -> field { return 1field; { You may refer to contents of the module as other_module::X, other_module::S, and other_module::increment. 📁 Example Directory Structure src ├── common.leo ├── main.leo ├── outer.leo ├── outer │ ├── inner.leo 📦 Module Access Paths Given the structure above, the following modules are defined: common.leo defines module common, accessible from main.leo via: common::<item> outer.leo defines module outer, accessible from main.leo via: outer::<item> outer/inner.leo defines submodule outer::inner, accessible from: main.leo: outer::inner::<item> outer.leo: inner::<item> 📏 Module Layout Rules This PR also enforces new rules to prevent ambiguity and ensure consistency: Leaf modules (i.e. modules without submodules) must be defined in a single file: foo.leo Modules with submodules must be defined by an optional top-level foo.leo file and a foo/ directory containing the submodules: foo.leo # defines module `foo` - this is optional foo/ ├── bar.leo # defines submodule `foo::bar` Only relative paths are implemented so far. That means that items in outer.leo cannot be accessed from items in inner.leo, for example. This is limiting for now but will no longer be an issue when we add absolute paths. Leo Update leo update now allows you to select a particular version to install: leo update --name v3.0.0 Remaining stability improvements leo now allows you to decrypt records via the CLI. You may also pass in record ciphertexts as inputs to leo execute directly. Bug fix in outputting code regarding parenthesizing operands of the ternary conditional. Bug fix: eliminate redundant type errors in async function calls. Bug fix: correctly handle shorthand struct initializers which are consts. Bug fix: leo clean doesn’t produce errors when outputs or build directory isn’t present. Bug fix: correctly type check return statement in a constructor. Bug fix: check snarkos installation location. Bug fix: const evaluate const args before monomorphizing. Improved error messages for unresolved generics. Library and tooling updates What’s new in SDK v0.10.0 Updates to the KeyProvider interface with methods that enable local storage + implementations of the KeyProvider interface that store Proving and Verifying keys in local storage in Node.js and browser storage in browser contexts. This allows function executions to use locally stored keys to speed up execution. Update to the RecordProvider interface to enable metadata to be included with found records + implementations of the RecordProvider interface that allow users of the SDK to efficiently search for their own records. ProgramManager methods now accept object parameters instead of individual parameters. This enables developers to supply only required parameters to ProgramManager functions. Developers upgrading to v1.0.0 will need to make slight changes to their invocations of ProgramManager methods. Fixes that allow private transactions involving records to succeed consistently via a custom implementation of the QueryTrait. snarkVM v4.2.0 snarkVM is a zkVM library. It powers the Aleo network and most of the software used to interact with it. The following contains some of the most relevant changes which were introduced: fn deployment_cost was renamed to fn deployment_cost_v1 fn deployment_cost and fn execution_cost were introduced to allow for switching on the cost function based on ConsensusVersion fn find_records now filters records by ownership before decryption in #2691 This PR implements get_state_paths_for_commitments to retrieve a batch of state paths rather than one at a time in the query. This will help mitigate the global state root to be the same across iterations issues seen when users/provers are querying for state. A floating‑point sqrt and type conversion was replaced by isqrt to support WASM-based platforms which don’t support floating point operations, in #2835 Support building snarkVM on SGX in #2791, enabled by the introduction of a filesystem feature, without which, the parameters crate won’t require a filesystem anymore to store parameters. fn authorize_request was introduced, which allows offline hardware wallets to sign a Request without importing the entire VM object. This is possible only for individual functions with public inputs and outputs, such as credits.aleo::transfer_public. The total amount of TestRNG call counts are now printed at the end of test runs to help facilitate debugging. This PR changes the Query type to use http::Uri internally for enhanced debugging. Closing notes The full changelogs for the referenced releases can be found here: https://github.com/ProvableHQ/snarkVM/compare/v4.1.0...testnet-v4.2.0 https://github.com/ProvableHQ/snarkOS/compare/v4.1.0...testnet-v4.2.0 If you want to try it out, you can build from source today or download the mainnet release from github September 9th. Find the current release schedule at: https://provablehq.github.io/. Contributors A big thank you to all the contributors on Github to this snarkOS, Leo, SDK and snarkVM release! @acoglio @anstylian @antonio95 @christianwwwwwwww @damons @d0cd @kaimast @iamalwaysuncomfortable @ljedrz @meddle0x53 @mohammadfawaz @mikebenfield @niklaslong @raychu86 @rejected-l @Roee-87 @trevor-crypto @vicsn