We’ve been busy these past couple of weeks with expansion of Zebra’s RPC layer, foundational work on consensus rules, and implementing a full monitoring stack for the z3 project. We also established new AI contribution guidelines for the Zebra repository.
On the DevOps front, we resolved a recurring race condition in the integration tests where two tests would try to open the same Zebra state database at the same time, causing failures with the message “Database likely already open.” The fix ensures that processes are fully terminated before a new one starts, and that the state is opened in read-only mode where possible.
In Zebra, we continued expanding the RPC layer. We implemented the gettxout method, which lets callers look up whether a specific transaction output has been spent and retrieve its details — a method several users had been waiting for. We also added support for the rpc.discover endpoint, which returns an OpenRPC document listing all of Zebra’s available RPC methods and their parameters, making it easier for wallet and tool developers to see exactly what Zebra supports. As part of this move to OpenRPC, we removed the older OpenAPI spec and all its dependencies, which had been the source of several long-standing build issues that are now resolved. We’ve needed to make some changes in the zcash_script library, such as updating to_asm() to match zcashd’s output format and adding as_str() and req_sigs() methods to ScriptKind.
We added a new AnyChainBlock request to Zebra’s state layer. Previously, block lookups would only return blocks on the current best chain. The new request can find blocks on any chain, including side chains that haven’t been finalized yet. This is a foundation for features that need to inspect the full non-finalized state.
We continued filling in Zebra’s consensus rule coverage. We added the Founders Reward addresses used in early Zcash blocks and then built on that to add support for checking and calculating pre-Canopy block subsidies — the block reward rules that applied before the Canopy network upgrade. These are part of ongoing work to make Zebra’s block validation complete across the full history of the Zcash chain.
Outside of Zebra, we migrated the FROST documentation book to GitHub Pages, making it easier to keep the docs up to date and publicly accessible without a separate hosting setup. We also added a full monitoring and observability stack to the z3 repository — the project exploring how Zebra, Zaino, and Zallet will work together. The stack includes Prometheus for metrics collection, Grafana with 14 pre-configured dashboards covering sync status, network activity, RPC calls, mempool, and peers, Jaeger for distributed tracing, and AlertManager for alert routing. It is enabled as an optional Docker Compose profile, so it can be brought up alongside a Zebra node with a single command.
Thank you to all the lovely people who contributed recently. @zmanian for correcting how getrawtransaction handles the expiry height field and sighash flags in script output. @VolodymyrBg for fixing a bug in the peer set where banned peers left stale entries behind. And @syszery for replacing a manually maintained network upgrade ordering constant with a macro-generated iterator.
Thanks for reading!