Zebra 7.1.0-alpha.0 is a pre-release from the next branch. It removes the timer waits between new transactions or blocks arriving and miners getting work that includes them, and it speeds up submitblock, block relay, and block verification. It also adds what mining pools need to run on Zebra: legacy JSON-RPC batches for pool software such as s-nomp, optional ZMQ hashblock notifications, the preciousblock RPC, and mining metrics. It keeps Zebra 7.0.0's state format, so you can switch back without resyncing.
This is an alpha for testing. Run it on a node you can switch back to 7.0.0. Its crates aren't published to crates.io, and its Docker image is tagged 7.1.0-alpha.0 and edge, not latest. Check the three stricter configuration checks under Breaking Changes before you start it.
Documentation for this alpha is in the Zebra book for the next branch, newly published at zebra.zfnd.org/next. The book at zebra.zfnd.org doesn't cover these changes yet. The /next book follows the branch, so it may also describe changes made after this alpha.
Update Priority
| User Type | Priority | Reason |
|---|---|---|
| Mining pools and solo miners | Medium, on a test node | Faster templates, submissions, and block relay; pool software compatibility; ZMQ; preciousblock
|
| Wallet and indexer operators | Low | Faster hex encoding in RPC responses and faster block commits |
| Other node operators | Low | Stay on 7.0.0 unless you want to test these changes |
Highlights
For miners and pools
- New transactions reach templates without timer waits. In 7.0.0, verified transactions waited for a five-second mempool check, and templates rebuilt on a five-second timer, so under a burst of transactions the waits added up. Verified transactions now enter the mempool right away, and each change to them rebuilds the template, at most once per second or once per build, whichever is longer (#11376, #11374).
- Work on a new tip starts at once. A new chain tip rebuilds the template immediately and wakes long polls. Once a new block passes its proof-of-work and header checks, Zebra can serve coinbase-only work on top of it while its transactions are still being verified. That work is withdrawn if the block is rejected, and expires after 30 seconds. The internal miner starts on new work instead of sleeping for up to 20 seconds (#11374, #11669, #11692).
- Faster
submitblockfor proposals you validated. If you check a block body withgetblocktemplatein proposal mode before mining it,submitblockreuses that verdict and the parsed transactions when a solution for the same body arrives. Zebra still checks proof of work, time, and the live chain state (#11658, #11739). - Solved blocks reach peers sooner. A solved block that matches a validated proposal is announced once its proof of work passes, before it's written to the database. Committed blocks are advertised immediately instead of after up to 7 seconds, and peer connections no longer hold back small messages (
TCP_NODELAY) (#11670, #11693, #11701). - Pool software starts against Zebra. Versionless and JSON-RPC 1.0 batches are accepted, and
submitblockaccepts any value in its ignored second argument, so pools such as s-nomp pass their startup checks.getmininginforeports network difficulty, andgetpeerinforeports each peer's starting height (#11668, #12062). - ZMQ block notifications. Pools that subscribe to
zcashd's ZMQhashblocktopic, such as Miningcore, can subscribe to Zebra with[notify] zmqpubhashblock. The release binaries and Docker images don't include ZMQ: build with--features zmq(#12075). - Tip races.
preciousblock <hash>makes a node prefer that block among tips with equal work, so all of a pool's nodes can build on the pool's own block. A tip with more work still wins, and restarts forget the preference (#12114). - Mining metrics. Template build time, new tip to first template latency, block submission outcomes, and mined-block announcement outcomes and latency (#12095, #12096).
The mining pool guide covers long polling, ZMQ, tip races, and payouts, and the metrics page lists the new metrics.
For all node operators
- Block verification waits less. Proof and signature batches flush after 5 ms without new input instead of waiting up to 100 ms, shielded checks start before transparent ones, Sapling bundles are prepared in parallel, and blocks reuse the verification of transactions already in the mempool (#11673, #11805, #11901, #11939).
- Sync and block commits do less work. Checkpoint sync computes authorizing data roots before the database writer and handles large blocks in parallel, note commitment trees update faster, and chain forks share unchanged data instead of copying it (#11694, #11687, #11695).
- Faster RPC responses. Large hex payloads in block, transaction, and mining RPCs convert several times faster, and
getblockchaininfono longer measures the database on every call (#11983, #11694). - No key-building delay on first use. Halo 2 verifying keys are built in the background at startup, without delaying RPC or networking (#12008).
- Misbehaving peers are banned sooner. Scores apply every 5 seconds instead of every 30, and score increments are no longer lost under load (#11690, #11796).
Breaking Changes
- Validate Elasticsearch TLS certificates by default when built with the
elasticsearchfeature. Configure a server certificate trusted by the client, or set[state] elasticsearch_skip_cert_validation = trueonly for trusted local self-signed setups; opting out exposes credentials and indexed data to interception (#12051). - A Regtest node no longer starts when
[network.testnet_parameters]setsnetwork_magic,slow_start_interval,target_difficulty_limit,disable_pow,genesis_hash,pre_blossom_halving_interval, ortemporary_orchard_disabling_soft_fork_heightto a value other than the one Regtest uses; Zebra previously ignored these values. Remove the field, or use a configured Testnet to change it.network_nameis still ignored (#12049). - Invalid
[network.testnet_parameters]funding streams and lockbox disbursements now fail configuration loading with an error, instead of panicking at startup or in subsidy RPCs. A Regtest node whose funding streams have too few addresses, which previously started and panicked only when a subsidy was computed, no longer starts; add the missing addresses or setextend_funding_stream_addresses_as_required = true(#12048).
Added
- Optional ZMQ
hashblocknotifications for mining pools, configured withnotify.zmqpubhashblockin builds using thezmqCargo feature (#12075). - Added
preciousblockto prefer a known non-finalized tip among equal-work chains, with the last call winning and preferences lost on restart (#12114). - Added current network difficulty to
getmininginfoand advertised peer starting heights togetpeerinfofor pool compatibility (#12062). - Export mining metrics for template construction, block submission outcomes, and mined-block announcement outcomes and latency (#12095).
- Export new-tip to first-template latency once per served best-tip transition (#12096).
- Block-acceptance timing histograms
zebra.consensus.block.phase.duration_secondsandstate.block_writer.phase.duration_seconds, labeled by phase and excluding block proposals (#11706).
Changed
Mining and block templates
- Store and announce verified transactions without waiting for the five-second mempool queue check on idle nodes (#11376).
- Mining templates rebuild immediately after isolated verified mempool changes, waking long polls on publication. Rebuilds pause for at least one second or the previous build's duration, whichever is longer; the five-second backstop respects that pause, while chain-tip changes rebuild immediately. Cached build failures no longer interrupt mining after the chain tip changes (#11374).
- Mining work can extend newly received blocks before transaction and contextual validation finish. Early work is coinbase-only, expires after 30 seconds, and is disabled once NSM reissuance activates. A live candidate is not replaced by concurrent submissions, and expiry does not reopen its slot before verification finishes. A candidate is withdrawn when its parent is no longer the committed best tip. Long polls recheck cached child work immediately when its parent commits, and new candidates interrupt template retry backoff (#11669).
- Avoid repeated transaction and contextual validation when submitted blocks exactly match validated mining proposals apart from nonce and solution. Retain at most eight proposals within a conservative 576 MiB content charge, including spent-output scripts, rather than measured heap usage. Eight representative full-size proposals of 104-byte one-input/one-P2PKH-output payments fit; smaller valid transactions or large spent-output scripts can cause earlier eviction and normal revalidation. (#11658)
- Reuse parsed transactions when submitted block bytes exactly match a validated mining proposal except for nonce and solution, and pass that match into verification without repeating body identity hashing. Misses retain full decoding and validation; proof-of-work, time and live-state checks still run on matches (#11738).
- Relay submitted blocks before commit only when they match an exact successful local proposal verdict, except for nonce and Equihash solution. Early advertisements use ordinary gossip; all-peer advertisements remain commit-only. State-owned committed notifications survive RPC cancellation, and unavailable notification capacity rejects mined commits before mutation without blocking ordinary commits (#11670).
- Ordinary block requests that replace queued mined requests no longer require capacity in superseded notification channels; healthy observers still receive commits (#11670).
- The internal miner starts on new work immediately instead of sleeping for up to 20 seconds, and keeps its current candidate when a mempool-only template refresh allows old work (#11692).
- The internal miner discards solutions whose parent is no longer committed, pauses public-network mining while behind or without recently live peers, and waits for a different parent after accepting its own public-network block. Regtest and configured Testnet retain peerless mining and may extend their own accepted blocks (#11659).
- Mining templates remain available after backwards clock adjustments when their timestamp range can be narrowed safely (#11654).
- Block template transaction selection calculates coinbase resource usage without constructing a separate zero-fee coinbase, avoiding an additional shielded proof when a sizing coinbase would otherwise be needed (#11696).
- Reduced block-template transaction selection time for large mempools while preserving ZIP 317 fee-weighted selection (#11881).
- Precompute fee-bearing shielded coinbases while a mining candidate is being verified, reusing the proof only when the committed template has matching fees and subsidy context. Limit speculation to one fee proof per committed parent and skip mempool-reset boundaries (#11931).
- Cancel background block proposal validation when its parent is no longer the best chain tip (#11929).
- Reduced mining memory use by sharing mempool transactions with the validated proposal cache (#11930).
Mempool
- Mempool transaction verification and downloads read state directly instead of waiting in the state write queue, and mempool metrics are updated incrementally (#11691).
- Reduced allocation and copying during mempool cleanup after a block is committed (#11928).
- Count same-effects transaction variants once per advertising IP in the inbound mempool queue without suppressing other peers' or local candidates (#12052).
- Return mempool transactions only when the requested witnessed transaction ID matches, including its authorization digest (#12043).
Block verification and sync
- Lowered block and transaction verification latency by flushing proof and signature batches after 5 ms of idle input, while retaining the 100 ms maximum batch latency (#11673).
- Start shielded transaction verification before transparent transaction verification to reduce mixed-block verification latency (#11805).
- Start partial shielded verification batches at the end of block transaction queueing rather than waiting for the idle timer (#11804).
- Verify Sapling bundles in parallel on blocking workers, keeping proof preparation off asynchronous workers and flushing every used batch when block checks are queued (#11901).
- Reuse verified mempool transactions when validating blocks on the same chain tip, while rechecking block-context consensus rules (#11939).
- Reduce block-verification overhead for transactions with a single external transparent input (#11805).
- Waiting for a missing transparent input during block verification no longer delays lookups of the transaction's other inputs (#11186).
- Reduce proof-of-work verification cost with AVX2 and NEON leaf hashing on supported CPUs (#11842).
- Checkpoint sync commits blocks faster: authorizing data roots are computed before the database writer, and large blocks are serialized and read in parallel. RocksDB starts flushing column families backed by the oldest live WAL files when total WAL usage exceeds 4 GiB (#11694).
- Note commitment trees are updated faster for blocks with many shielded outputs, which speeds up block commits and checkpoint sync (#11687).
- Blocks with many transactions compute their authorizing data root in parallel, which shortens block commits (#11699).
- Committing blocks to the non-finalized state copies less: chain forks share unchanged UTXO, address and block data, which reduces block commit latency and memory use (#11695).
- Commit transparent blocks faster by hashing each output and address key once in the non-finalized state's indexes (#12120).
- Build Halo2 verifying keys in the background at startup, avoiding first-use Orchard and Ironwood key construction after preload finishes without waiting for it before RPC or network readiness (#12007).
- Bounded state retention of out-of-order blocks while preserving progress for ready parents and accepted commits after callers disconnect (#11658).
- Checkpoint submissions retain bounded work while preserving ordinary prefetch and accepted commits after caller cancellation. Unchecked children are requeued after failed commits without releasing their reservations. Ordinary duplicates preserve healthy mined observers without depending on notification capacity. Synchronization retries local admission pressure with the downloaded body within the original verification deadline (#11658).
Peer network
- Newly committed blocks are advertised to peers immediately instead of after up to 7 seconds, and mempool transactions are advertised every 2 seconds instead of every 7 (#11693).
- Disabled Nagle's algorithm (
TCP_NODELAY) on peer connections, like zcashd does. This removes delays of 40ms or more when Zebra sends several small messages in a row, for example when it relays mempool transactions to zcashd peers (#11701). - Download newly advertised blocks promptly when a block-discovery request is pending, tolerating blocks committed by gossip during discovery without restarting sync (#11709).
- Peer misbehavior scores are applied every 5 seconds instead of every 30, so misbehaving peers are banned sooner (#11690).
Experimental block relay (off by default)
- Added default-off
network.experimental_early_block_relayfor coordinated private-network experiments: compatible peers can relay authenticated next-tip blocks before transaction verification finishes; legacy peers retain committed-only relay. Missing parent context does not make a later validation failure punitive, and withdrawn early responses fall back to committed serving before their local wire write begins (#11932). - Experimental early-relay connections can negotiate compact blocks using mempool transactions, with bounded missing-transaction recovery and full-block fallback; ordinary peers receive no new messages (#11938).
- Experimental compact relay selects at most three receive sources, crediting first announcements only after local commitment and releasing demoted or failed delivery slots before waiting for peer writes (#11981).
- Delivered experimental compact blocks allow repeated transaction recovery within a shared block-size byte budget for fifteen seconds, even after publication permission is withdrawn; expired snapshots are released before connection cleanup (#11981).
RPC
- RPC batches using a single version now accept versionless and JSON-RPC 1.0 calls and return responses in the same format, allowing mining pools such as s-nomp to run their startup checks. Converted requests and responses respect the existing body size limits; response conversion overflow returns a legacy-formatted oversized-response error rather than disconnecting, retaining the upstream error-envelope exception (#11668).
- The submitblock RPC now accepts any JSON value for its ignored second argument, matching zcashd and allowing mining pools to submit blocks with a string argument (#11668).
- Changed empty-state
getinfo,getblockchaininfoandgetmininginfodifficulty to1.0, matching zcashd (#12062). getblockchaininforeportssize_on_diskfrom an estimate refreshed about every 30 seconds instead of measuring the database on every call (#11694).- Avoid panics in
getblocksubsidyand coinbase validation on custom Testnets whose block subsidy is not divisible by five (#12050).
Operations, configuration and monitoring
- On GNU/Linux,
zebraddefaults to at most 16 glibc malloc arenas unlessMALLOC_ARENA_MAXorglibc.malloc.arena_maxis configured (#11697). - Bound metric labels:
mempool.failed.verify.tasks.totaluses error kinds forreason(retainingtimeout),zebra.net.in.errorsuses error kinds forerror, and handshake protocol-version labels use known versions orother. Update custom selectors that match full error messages or unknown protocol versions (#11874). - Routine state-service spans now use DEBUG, and per-input, per-transaction and chain-tip getter spans use TRACE. INFO events and their fields are unchanged (#11812).
- Block queue and commit spans no longer include whole verified-block payloads; compact height and hash context remains (#11811).
- The example Prometheus latency alerts and the Grafana RPC latency and checkpoint panels now query metrics Zebra exports, and the slow-handshake alert fires above two seconds, below the three-second handshake timeout. Removed the error-rate alert and the errors dashboard, which queried metrics Zebra does not export (#12041).
- The example mining Compose stack starts again: it sets
ZEBRA_MINING__EXTRA_COINBASE_DATAinstead of the unknownZEBRA_MINING__MINER_DATA, and enables the loopback health listener its health check probes (#12040). - Accept
ZEBRA_TARGET_environment overrides forcopy-statewithout failing to load the source configuration (#12037). - Apply top-level
--filterswhenstartis given explicitly, unless positionalstartfilters are provided (#12038). - With
ephemeral = true,zebradno longer leaves empty directories in the temporary directory each time it starts (#12061). - Updated the
pulldown-cmarkbuild dependency to 0.13.5, clearing RUSTSEC-2026-0414. Zebra isn't affected; it only runs the crate at build time, on the doc comments of its own protobuf files (#12106). - Updated the
libz-sysbuild dependency to 1.1.31, clearing RUSTSEC-2026-0418. Zebra isn't affected: the leak needscc1.6.0 or later, and Zebra's lockfile usescc1.2.61 (#12118).
Fixed
- Large hex payloads in
submitblock,getblocktemplateand raw block and transaction RPCs convert several times faster (#11935). - Misbehaving peers reach the ban threshold reliably under load, because score increments are no longer lost while earlier scores are being applied (#10601).
- Avoid repeated map growth when looking up verified mempool transactions for a block (#11992).
- Failed client connections to the tracing filter endpoint (built with the
filter-reloadfeature) are now logged as warnings instead of errors, so they no longer create Sentry issues when Sentry is enabled (#11864).
Security
- The example Compose files no longer publish the Zebra RPC or metrics ports to the host. The observability stack keeps RPC cookie authentication, disables the Prometheus admin and lifecycle APIs, and requires
GF_SECURITY_ADMIN_PASSWORDto start (#12039). - Update
ctutilsto 0.4.5 to fix RUSTSEC-2026-0385, non-constant-time mask generation andu128comparisons. Zebra holds no keys and uses the affected hashing and signature code on public data (#11927). - Update tokio to 1.54.1 to fix RUSTSEC-2026-0386, safe
AsyncFdconstructors that violate I/O safety. Zebra doesn't useAsyncFd(#11962).
How to Upgrade
This alpha keeps 7.0.0's v29 state format, so it starts on an existing 7.0.0 state without resyncing, and 7.0.0 can open that state again if you switch back.
Docker
docker pull zfnd/zebra:7.1.0-alpha.0Binaries
- Download the
zebradarchive for x86-64 or ARM64 Linux from the assets below, and check it againstSHA256SUMS. - Stop
zebradand wait for it to exit. - Replace the binary and start
zebradagain.
From source
git fetch --tags && git checkout v7.1.0-alpha.0
cargo build --release --locked -p zebradAdd --features zmq to the build to enable ZMQ notifications.
Compatibility
| Component | Supported |
|---|---|
| Zcash network upgrades | All through NU7, which activates on Mainnet at height 3,543,405 |
| Network protocol version | 170190, the same as 7.0.0 |
| State format | v29, the same as 7.0.0 |
| Release binaries | Linux x86-64 and ARM64 |
| Minimum Rust (source builds) | 1.91 |
| End of support | The same height as 7.0.0 |
Contributors
Thank you to everyone who contributed to this release:
@Anirudh-712, @arcayne, @conradoplg, @gustavovalverde, @kriss39, @oxarbitrage and @upbqdn