Zcash Foundation Update (September 26, 2025)

Hi everyone,

In our latest update, we’ve made significant progress towards zcashd deprecation, rebuilt our CI (more details coming in a blog post soon…), and successfully completed an audit for NU6.1, which implements the one-time lockbox disbursement. While we haven’t focused much on FROST recently, a new release is planned for after the zcashd deprecation work, which is our current priority.

The CI pipeline received significant improvements focused on making it faster, more reliable, and accessible to contributors. The most impactful change was implementing nextest, which replaced the previous test execution system with a faster, parallel test runner that uses profiles to organize different test scenarios. This was paired with Docker build optimizations that improved caching and reduced unnecessary rebuilds. The project also moved from a complex configuration generation system to a simpler approach where environment variables directly configure the application, eliminating the need for the Docker entrypoint to generate configuration files. Along the way, several fixes addressed issues like configurable Docker builders when build minutes were exhausted, restored permission handling for cache directories, and corrected disk mounting behavior for cached state.

A major cleanup effort simplified the entire CI structure by removing 19 workflow files (about 2,900 lines of configuration), consolidating related workflows, and eliminating dependencies on external services that contributors couldn’t access. This change moved documentation deployment from Firebase to GitHub Pages and added a clear naming convention where internal workflows use a zfnd- prefix so they can be easily identified and disabled by fork users. The work also included security improvements like fixing workflow permissions, properly passing secrets between workflows, and ensuring the CI passes security scanner checks. Additional fixes addressed edge cases like missing build tool dependencies, status check handling when workflows are skipped by path filters, and correcting conditions for aggregation jobs that verify whether all required checks passed.

We are continuing to work towards zcashd deprecation by adding functionality to back up non-finalized blocks in the state cache directory, adding support for chainInfo in getaddressutxos, the z_gettreestate functionality has been completed, and we have continued to add fields to TransactionObject, which is used by the block explorer to assess transaction types. Support for single-string or object parameters in getaddresstxids has also been implemented.

Continuing with our work on Zebra, we have adopted upstream types for commitments where possible. We’ve also updated the contribution guidelines. We are adjusting the number of addresses for the FPF funding streams on Testnet, reflecting the funding stream’s conclusion, with minimal impact on Zebra’s behaviour. We matched Zebra’s advertised network protocol versions on Regtest with those in zcashd. Missing Orchard fields have been added to the getrawtransaction method. We are also implementing draft ZIP 2003 for NU7, including loading Sapling parameters in a compatible format with sapling-crypto. We switched to sapling-crypto’s BatchValidator and orchard’s BatchValidator in the transaction verifier, which is beneficial for performance and deduplicates the code. The z_validateaddress logic has been exposed for library consumers, and we have made it possible to compile zebra-rpc without requiring protoc.

We’ve been making some improvements to the developer experience. These include reducing connection times between nodes on the Regtest network in the python test framework, we now allow configuration of checkpoints on test networks, we are enhancing Regtest configuration to allow funding streams similar to custom Testnets, and modifying related functions accordingly. We are using symbolic links to the official lightwallet-protocol to establish a canonical definition of the protocol. We have sped up the development profile by optimizing some dependencies. We are enhancing the Python test framework’s argument handling for Zebra by centralizing configuration in a new module, updating all tests accordingly, enabling lockbox disbursements in regtest mode.

For NU7, we have introduced a ZFuture variant to Network Upgrade, controlled by a Rust config flag.

We extend our gratitude to all contributors, including the teams at ECC, QEDIT, ShieldedLabs, and ZingoLabs, with whom we regularly collaborate. Special thanks to @fibonacci878 for adding the sanitize_avoids_leaks test, @syszery for improving error propagation in CommitSemanticallyVerifiedBlock, implementing get mempoolinfo RPC method and Implementing getnetworkinfo RPC , @sashass1315 for a serialization fix, and to @radik878 for fixing the UTXO selection loop to iterate over entries. Finally, thank you to @jcabala for his contribution to our frost-tools repo with the fix for the incorrect logout path and handling of empty server responses.

Thanks for reading!

19 Likes

lots and lots of work, never a dull moment, the collective effort is gradually paying off

1 Like