New Release - Batch sync, Nix and more.

Posted on June 25, 2025

Our last release allowed the Zenith users to import an existing seed phrase to help people move and recover wallets.

The process of re-syncing an old wallet from seed is not trivial and we have been working to ensure users can move and recover their wallets with Zenith even if they have years of activity.

We have released Zenith 0.10.0.0-beta, including a re-design of our wallet scanning mechanism to leverage the data streaming capabilities of Haskell to ensure that a large blockchain scan can be performed without requiring large amounts of RAM or storage, even through the spam transactions after NU5.

This re-design provides Zenith with:

  • A roughly 2X faster sync time for everyday use.
  • Batch sync:
    • When the wallet is out-of-sync for more than 100 blocks, the wallet will sync in batches of 100 blocks rather than attempt to sync completely to the chain tip. So if a user just wants to copy their address, they only need to wait for a few minutes for the next batch to complete.
    • The batch sync is especially useful for users that don’t run their computers continuously. After a batch completes, the user can turn their computer off and pick up the sync the next time they start the wallet without losing progress.
    • If there is a failure during a batch, Zenith can recover from the last batch that was completed rather than requiring a full re-scan.
    • On a computer with 8GB of RAM and a four-core processor, the sync process averages ~0.5 blocks/sec through the spam. After the fee changes in NU6, the sync process averages ~4 blocks/sec.
  • Spam filtering.

Migration to nix

Our team has put in a lot of work in creating, expanding and maintaining the zcash-haskell library, that brings the functionality of the Zcash Rust crates to the Haskell ecosystem. This type of foreign function interface can be complicated to setup in a user’s computer and is not necessarily reproducible.

For this release, we migrated Zenith and our libraries (zcash-haskell and its dependencies) to nix flakes, a feature of the Nix Package Manager that allowed us to simplify each code repository and eliminate submodules.

Nix allows us to distribute Zenith in a user-friendly way, removing the need for the user to manage the Haskell or Rust tool chains and avoids any potential conflicts with any existing configurations the user may have. It provides a “batteries-included, no assembly required” mechanism to run the Zenith wallet, as well as installing it on the user’s profile:

# Run the wallet with the GUI
nix run .#wallet --impure

# Run the RPC server
nix run .#server

# Run the Zenith console commands
nix run .#console tui
nix run .#console scan

# Install the wallet with the GUI
nix profile install .#gui --impure

# Install the Zenith console and server
nix profile install .

For the more technically inclined, the migration to nix also enables the use of the zcash-haskell library interactively through the Haskell interpreter, as a Zcash multi-tool. All the library functions are available for users:

# Get the library
$ git clone https://code.vergara.tech/Vergara_Tech/zcash-haskell
# Enter the nix devShell
$ nix develop 
# Start the Haskell interpreter
nix-dev> $ cabal repl

Updated Unified Addresses

Per discussions on the forums, Zenith has been updated to only include shielded receivers in the Unified Addresses in a user’s wallet.

Users can still use the corresponding transparent address for their account to receive transparent funds. This change prevents the transparent receiver to be inadvertently published.