ZF Engineering Update - 27th July to 9th August 2026

The big event of the last two weeks was NU6.3 “Ironwood” going live on Zcash Mainnet. A lot of our work focused on keeping nodes healthy through activation: making sure the zcashd-compat sidecar kept following the chain, avoiding accidental bans of honest peers around the activation boundary, and hardening how Zebra handles misbehaving peers. We shipped these fixes in Zebra v6.2.3 (“Peer Connectivity Hardening”) and kept improving networking, syncing, and the mining and indexer RPCs.

Security

We tightened how Zebra deals with peers that aren’t behaving well. Zebra now refuses outbound connections to peers that don’t serve blocks while it is still syncing, so those connection slots stay reserved for peers that can actually help a node catch up. This went out in Zebra v6.2.3.

CI / DevOps

Most of our release-engineering effort went into a rebuild of the release pipeline so that publishing a new version is faster and safer. We added a human release checklist and gated the steps that change a GitHub Release, separated building and signing binaries from attaching them to a release so artifacts can be prepared before the release exists, made release image identity immutable and verifiable by digest, and moved the heavy Cargo jobs onto a larger runner. Alongside this we stopped stray label events from cancelling in-progress PR checks and serialized the live-Mainnet integration tests so they no longer compete with each other for the small number of usable peers.

Other Zebra work

Around the NU6.3 activation we pinned the NU6.3-ready zcashd-compat sidecar (v1.1.0), since the previously bundled version was built before the activation height was set and would have stopped following the chain at activation. We also added a short grace window around the activation boundary so that an honest peer on the other side of the upgrade relaying a still-valid transaction is not mistakenly penalised and banned.

On networking and syncing we raised the tolerance of the stall detector near the chain tip so that ordinary gaps between blocks no longer disconnect healthy peers, made a node keep dialing peers until it reaches its connection target after losing some, and return up to half of a node’s address book in response to an address request to help peers discover each other. We fixed sync to download a single new block hash near the tip instead of waiting for two, and removed an old workaround for a long-deprecated zcashd behaviour. For node operators we added connection lifecycle metrics that make it easier to see where connections succeed or fail.

On the RPC and mining side we reworked the block-template coinbase cache so that miners no longer trigger redundant proof rebuilds on every poll, and added stream and keepalive limits to the indexer gRPC server used by tools like Zaino and Zallet. In the core chain types we added validation of the total value balance across pools, and extended our property-test generators to produce v6 transactions so that Ironwood-era test coverage is meaningful.

Work in progress

Two larger efforts are underway. We are building a lightwalletd-compatible gRPC server inside Zebra, which would let light wallets talk to a Zebra node directly, and rewriting the initial block download engine that gets a fresh node synced to the tip. Both saw active work during this period. In frost-tools, we also started adding Ironwood (v6) support to the external signing flow in zcash-sign. All three are still in progress.

Work on other repositories

On Zallet (the Zcash wallet) we made startup take clear ownership of its runtime tasks so a partial startup failure can’t leave the wallet database or background tasks in a bad state, and pinned its prerelease dependencies to exact versions so builds don’t drift onto unaudited releases.

On the zcashd-compat sidecar we set the NU6.3 Mainnet activation height, preventing it from stalling at activation, and fixed its release packaging. On our DNS seeder, which helps new nodes find peers, we updated it to the Zebra 6.2.3 peer-discovery improvements and made several deployment and reliability fixes, including serving a consistent set of nameservers and preserving unrelated agents during rolling restarts.

Thanks to external contributors

Thanks to @jiehuo100net for a run of networking fixes: removing every address book entry for a banned peer IP so a banned peer can’t linger under a different port, canonicalizing inbound peer addresses so a banned peer on a dual-stack listener is properly dropped, and correcting the funding-stream information returned by getblocksubsidy for NU6.1 and later upgrades.

Thanks to @emersonian for adding a getdeprecationinfo RPC that lets monitoring tools warn operators before a node reaches its end-of-support height, and for adding the zec.rocks DNS seeders to improve peer bootstrapping. Thanks to @zancas for the v6-transaction test generators we merged for Ironwood-era coverage.

And also thanks to @syszery, @dismad, @CodeMongerrr, and @nuttycom for their contributions.

7 Likes