Over the past couple of weeks, the team has been focused on ensuring Zebra correctness, improving mining usability, and testing the Z3 stack. We also released new versions of zcash_script.
On the Zebra front, we fixed an ordering bug in how Zebra processes transactions that spend outputs from both the chain and the mempool. Previously, the outputs were returned in the wrong order: chain outputs first, then mempool outputs, regardless of the actual input order. This meant the transaction validator could silently look at the wrong output for a given input. The fix ensures outputs are placed in their correct positions before validation. We also removed the QA test framework from the Zebra repository, since it now lives in zcash/integration-tests.
We merged a fix to a bug in Zebra’s connection counter that was causing Zebra to report inaccurate peer connection metrics. The fix correctly separates reserved slots for pending connection attempts from live connections, so the reported count reflects only established connections. This also lays the groundwork for more flexible connection settings in the future. We also merged a refactor that simplifies the method in Zebra’s state service that handles all read requests. By factoring out repeated logic into shared helpers, the method was roughly cut in half.
In CI, we created a new reusable GitHub Action to set up Zebra’s build environment, consolidating previously scattered setup steps, and added a set of automated documentation checks that check links, spelling, and formatting. The checks cleaned up over 80 documentation files across the codebase, fixing broken and stale URLs, Markdown formatting, and typos.
Work on the Z3 stack continues, with the focus switching to testing and CI Integration, enabling Z3 integration tests to be triggered by changes merged to the Zebra codebase. We have also added an OpenRPC router to provide a unified RPC entry point that will route requests to the correct Z3 service.
Thank you to everyone who contributed to Zebra from outside the Foundation this sprint!
@zmanian submitted a pull request implementing the remaining non-standard mempool transaction filters, bringing Zebra’s mempool checks into parity with zcashd. This includes a per-transaction sigops limit and full input standardness checks, so Zebra now rejects the same set of non-standard transactions as the reference implementation.
Thanks for reading!