Happy November everyone. In October we did a lot of work on performance, made a new Zebra release candidate, and continued to work towards zcashd deprecation.
During this period, several improvements were made to the deployment and testing infrastructure. The deployment workflow was fixed to allow manual re-deployment of instances from release tags, which previously failed because the build job only ran for pull requests. This change also prevents duplicate Docker Hub publishes while enabling deployments from releases, workflow dispatches, and pushes to main. Two configuration issues were also resolved: a dependency checking test that was incorrectly failing on release PRs because it wasn’t running the ignored tests, and a dependabot configuration error where an invalid schedule field was causing validation failures.
For node operators and monitoring, new HTTP health check endpoints were added at /healthy and /ready, which return simple status codes that Kubernetes and load balancers can use to determine if a node is running and ready to serve traffic. The /healthy endpoint checks if the node has connected peers, while /ready verifies the node is synced near the chain tip. This functionality is opt-in through configuration and complements the addition of curl to Docker images, which enables health-check validation in containers. Additionally, a test infrastructure fix ensures that lightwalletd full sync tests properly populate the cache disk, resolving failures in CI jobs that depend on cached state.
We discovered a performance regression in our initial sync caused by RocksDB’s merge operator, so we avoided it. We documented the process we used to identify the regression in a new section in the Zebra book on profiling and benchmarking Zebra. We also documented that developers can shave about 20 seconds off Zebra’s build time by dynamically linking RocksDB. We now also avoid certain heap allocations, use the Sapling batch validator from sapling-crypto instead of the one from the bellman crate, and have removed some outdated seeders, all of which improve performance.
We implemented support for constructing shielded coinbase transactions, which we use to implement ZIP-213.
To prepare for tagging a release of Zebra which deploys NU6.1 on Mainnet, we’ve set an NU6.1 activation height on Mainnet, extended the NU6 funding streams Adds the NU6.1 one-time lockbox disbursements on Mainnet and bumped Zebra’s current network protocol version.
We’ve been busy fixing some bugs. We fixed one in Zebra’s block validation and block template generation on Regtest and test networks where NU5 is active. Also, zebra-rpc authorization was being decoded with the wrong Base64 encoding.
As part of Improving connection between nodes we now broadcast accepted block submissions to all ready peers. Other changes we have made include, supporting sidechains in getrawtransaction, displaying Zebra RPC scripts in assembly, making the changes requested by the NU6.1 audit, ensuring lightwalletd full sync populates the cache disk and some testing improvements.
Thanks to @syszery for some refactoring, more refactoring, clean up and error work. Thank you to @elijahhampton for his work to allow for cycling through configured funding stream addresses. And, thank you to @dorianvp for fixing a bug in z_validateaddress where a regtest t-address was being incorrectly parsed as a testnet address.
Thanks for reading!