Zainod release announcements

Look forward to rapid and regular releases announced here!

zainod 0.3.1 – 2026-05-25 Net Change: (+16,313 -13,744)

Hey folks, today zainod 0.3.1 is officially available on crates.io, dockerhub, and github. There’re a host of improvements over the previous 0.2.0 release that you can find summarized here.


Indexer-side blockchain queries (zaino-state)

  • gettxoutsetinfo served from Zaino’s own UTXO-set accumulator — the transparent UTXO set is now tracked incrementally in the indexer, so this RPC no longer forwards to the backing validator. (hash_serialized uses an order-independent, incrementally-maintainable XOR-of-BLAKE2b multiset commitment; it is not byte-equal to zcashd’s, by design.)
  • Transparent-address history RPCs:
    • get_address_balance
    • get_address_deltas
    • get_address_txids
    • get_address_utxos.
  • Block lookups by hash or height, subtree-root reporting, and non-finalised-state serviceability policy.

On-disk format (finalised-state DB → v1.2.0)

  • Promotes the spent outpoint index to core data and adds the txout-set accumulator.
  • Upgrading triggers a one-time in-place migration (resumable) — no full rebuild required.

zcashd compatibility (zaino-serve / zaino-fetch)

  • z_validateaddress passthrough, shipped pre-deprecated for bugwards compatibility.

Packaging

  • LightdInfo.version now reports the running zainod binary version rather than the library version.
  • Container images published under the new zainod Docker Hub repository (the 0.3.1 re-release tag).

Full per-crate detail (pinned to the release tag):

8 Likes

The fact that gettxoutsetinfo is now served directly from Zaino’s own indexed state is actually very powerful for ecosystem tooling and performance.

2 Likes

Bootstrap performance feedback + prefetch optimization (zainod 0.3.1)

Hi all, just wanted to share a real-world bootstrap experience running zebrad 5.0.0 + zainod 0.3.1 on a self-hosted node (i7, 32GB DDR5, NVMe SSD via WSL2 ext4 — ~5.9 GB/s write speed).

The main bottleneck identified via htop was single-threaded RPC fetching in sync_to_height — one core at ~56%, zebrad nearly idle, disk barely used.

Replacing the sequential loop with a buffered(64) tokio prefetch pipeline (parallel block fetches, sequential writes) gave roughly x8–x10 speedup in the Sprout zone (17k–120k blocks). The remaining bottleneck is IndexedBlock::try_from() which is inherently sequential due to chainwork dependency.

Current rate in the 120k–200k zone: ~70–80 blocs/min with one core fully saturated. Estimated total bootstrap: several days on high-end hardware.

The patch is posted on GitHub issue #860. Would love to see DbV2 or signed snapshots move forward — bootstrap time is a real barrier for self-hosted node operators wanting sovereignty over their ZEC wallet.

2 Likes

Regarding signed snapshots, Zec.rocks is independently working towards providing monthly signed snapshots of Zebra, Zaino, and Lightwalletd caches to speed up sync performance for anyone comfortable with using them.

I’ll try to get our Zaino snapshot published before July, but we have been publishing Zebra snapshots on our zcash-stack Github for over a year, anyone is welcomed to use those. The July update is that they will be signed.

3 Likes

Thanks for the update on snapshots! That’s great news for users who trust zec.rocks.

However, for users who want full sovereignty (which is kind of the point of running your own node), the real issue remains: bootstrap time on high-end hardware is several days due to single-threaded processing in sync_to_height.

On an i7-13620H (10 cores, 32GB DDR5, NVMe SSD at 5.9 GB/s), we’re seeing ~50-80 blocks/min in the 120k-400k zone with one core at 99% and 15 cores idle. A buffered(64) prefetch patch gave x8-x10 speedup in the Sprout zone — details on GitHub issue #860.

Any plans to address the multi-threading limitation in zaino’s indexing pipeline?

4 Likes

Things didn’t quite go as planned! We’ve learned a lot from NU6.2 and the rapid releases will released rapidly.. starting with this one!

zainod 0.4.0 – 2026-06-18 Net Change: (+11,853, -3243)

Hey folks, today zainod 0.4.0 is officially available on crates.io, dockerhub, and github.

Details are in the CHANGELOG.

Here are the highlights:

  • NU6.2 support
  • full parity with LWD
  • optimizations to improve index-sync performance
  • Block Explorer Support
  • gettxoutsetinfo

Already staged as a candidate for the next release

  • instant responsiveness, via optional DB backends
  • multiple vuln mitigations
  • metrics and reporting via grafana
6 Likes

Hotfix 0.4.1 is released.

Due to a naming collision with a previously yanked crate version, we had to bump several version numbers.

2 Likes

zainod 0.5.1 – 2026-07-02 Net Change: (+19,913, -16,965)

Hey folks, today zainod 0.5.1 is officially available on crates.io, dockerhub, and github.

Details are in the CHANGELOG.

Here are the highlights:

  • responsiveness without sync
  • vuln mitigations
  • metrics and reporting via grafana
  • elimination of redundant dependencies on zebra* and zcash* crates
  • updates to latest Zebra and Zcash crates

as a candidate for the next release, 0.6.0:

Due to the ironwood testnet activation, we’ll be releasing our ironwood release in the next few days.

1 Like

So zaino 0.5.x (and below) will stop to work on testnet on ironwood activation or simply it will keep to work normally ignoring the new pool?

This feature merged: feat/ironwood_nu_6_3 by idky137 · Pull Request #1362 · zingolabs/zaino · GitHub

Here’s a link to the 0.6.0-rc.1 container image, built from it:

Testing against ironwood enabled devtool shows zainod supporting send/receiving-and-scanning in the wallet.

Release testing is in progress, if gates are passed the crate will update within 48 hours.

We can test that.

I fixed an issue that you reported: fix: install rustls CryptoProvider explicitly and pin provider to ring by zancas · Pull Request #1366 · zingolabs/zaino · GitHub

The fix needs to be reviewed, if it passes review it could be in this release.

2 Likes

zainod 0.6.0 – 2026-07-13 Net Change: (+14,640, -10,152)

Hey folks, today zainod 0.6.0 is officially available on crates.io, dockerhub, and github.

Details are in the CHANGELOG.

Here are the highlights:

Targets for the next release:

  • fast-syncing outpoint —> spending txid index
  • complete zcashd elision
  • fast-syncing CompactBlockStreamer
7 Likes

Which should we use and are both working?

Both are working — they’re the same two connection modes as before, renamed and now selected at runtime inside one service instead of by separate service types.

rpc (formerly fetch) talks to the validator over JSON-RPC. It’s the default, and it works with zebrad on another machine, or even another Zaino instance. If you’re unsure, use this one.

direct (formerly state) reads Zebra’s state database directly through its ReadStateService. It’s more efficient, but it requires zainod to run on the same machine as zebrad, with zebra_db_path pointed at Zebra’s cache directory.

The old values state and fetch are still accepted as aliases, so existing zainod.toml files keep working unchanged — but new configs should use direct / rpc.

1 Like