This release supports the NU7 network upgrade on Mainnet, which activates at
height 3,543,405. The notes below list the changes since Zebra
7.0.0-rc.0.
If you are upgrading from Zebra 6.x, also read the 7.0.0-rc.0 notes, which
include breaking configuration and RPC changes.
Zebra 7 bumps the major database format version from v28 to v29 (if you upgraded
to 7.0.0-rc.0, that has already happened). Zebra moves the existing v28 state to
v29 on first start without resyncing, but Zebra 6.x cannot use the v29 database,
so downgrading after the upgrade requires a full resync. We advise backing up
the state/v28 directory in state.cache_dir before upgrading from Zebra 6.x.
Breaking Changes
- Peer connection, request, response, message, byte and handshake metrics no longer carry their per-peer
addr,remote_iporuser_agentlabels, and neither dozcash.net.peers.initialorzcash.net.peers.cache.zebra.net.connection.statenow counts connections in each state, andzcash.net.peers.version.connectedandzcash.net.peers.version.obsoletereport only the most recent handshake. RPC metrics label unregistered method names asunknown, as does therpc.methodfield of RPC tracing spans. Update dashboards and alerts that select or group by these labels; the bundled dashboards are updated.
Added
- New zcashd API Migration Guide book page, recording which component owns each of the 135 RPC methods
zcashd6.20.0 registers, plus its ZMQ topics, REST interface, and notification hooks: whether Zebra or Zallet provides it, what replaces it, or why it was retired, with notes on how Zebra's responses differ fromzcashd's (#11021). New Running Zallet with Zebra page describing thezebradbuild and configuration Zallet needs. - Added Sentry release health, with daily sessions per
zebradrun that end as exited or crashed, and tagged Sentry events and logs with the network, the best chain tip height, and its network upgrade. Sync progress logs and a new log when the best chain tip changes network upgrade are now sent to Sentry Logs. - Activate NU7 on Mainnet at height 3,543,405, and advertise network protocol version 170190. Mainnet nodes must upgrade before the activation height to stay on the consensus chain. This release is supported for 8 weeks instead of 12, so it halts about 56 days after its estimated release height.
Changed
- Empty discovery replies no longer trigger stalled-peer disconnections. Chain discovery rotates across peers that serve blocks instead of favoring fast empty responders. When those peers are busy, discovery waits up to 1.5 seconds and takes priority over queued downloads before falling back to other peers, avoiding sync pauses caused by idle peers that do not serve blocks (#10910).
- Shorten near-tip sync stalls by waiting for a busy peer that can serve a block instead of failing fast when every ready peer is missing it. Stuck peer connections that remain unready past the request timeout are dropped when the peer set is next polled, freeing their slots for other connections (#11515, #11748, #11521).
- Cap queued block-discovery requests at 16 and fall back to any ready peer when the queue is full. Report queued discovery requests in
zcash.net.peer_set.find_queuedand non-serving fallbacks inzcash.net.peer_set.find_fallbackwithreasonlabelsqueue_full,no_serving_peer, andexpired(#11532). - The
banned ip and removed banned peer addresses from address bookwarning now logs the misbehaviorscoreand thereasonthe peer was banned, such as the block or transaction verification error. - The
Opened metrics endpointlog line is now written after thezebrad.build.infometric is registered, so a scrape that waits for that line always sees the version metric. - Updated
pasta_curvesto 0.6.1, which speeds up Orchard field arithmetic; CPU instruction requirements are unchanged. - Mined-block broadcasts no longer stall when peers disconnect or become ready in successive groups (#11703).
- Block adverts reach eligible busy peers without waiting for ordinary requests to become ready. Readiness waits for an eligible peer, retaining only the latest mined block while disconnected. Broadcasts acknowledge completed local writes; full queues, revoked connections, and write failures are not treated as successful delivery (#11839).
- A late reply to a cancelled request no longer makes Zebra treat a block or transaction as missing from that peer, which could stall syncing from a single peer.
- Retry block requests using another source when one is available after a peer fails to return the block (#11525).
- Block downloads keep a useful hedged request alive after its sibling fails, preserve missing-block recovery when both copies fail or no peer delivers the block before the download deadline, and bound pending hedged downloads by the configured download concurrency limit.
- Peers now receive an empty inventory reply when the mempool is empty instead of waiting for their request to time out, avoiding block relay delays of up to 6 seconds on single-peer Zebra links.
- Stopped installing the Sentry tracing layer when Sentry is not configured, which removes per-span overhead from block verification and commit on nodes without a valid
SENTRY_DSN. zebrad --versionnow prints the full build version, including the git commit, for example7.0.0-rc.0+git.6d1e414. Builds withoutgit describemetadata, such as the Docker images, now include the commit in their build version, which also appears in thegetinfoRPCbuildfield, the startup message, and the Sentry release name.- Changed zebrad log output for all nodes: a fatal error that stops zebrad is now logged at error level instead of warning, the message while waiting for the genesis block appears once a minute instead of every five seconds, and a new info log reports each time the best chain tip enters a different network upgrade. Update log-based alerts that match on these lines.
- Updated the pinned zcashd-compat sidecar to
zebra-compat-v1.3.0, which follows the NU7 network upgrade. Earlier sidecar builds cannot follow Testnet past NU7 at height 4,465,026, or Mainnet past NU7 at height 3,543,405.zcashd_source = "embedded"and the installer'ssplit-binarymode now download this build.
Removed
- Removed the Docker options for zcashd-compat mode, since Zebra no longer publishes zcashd-compat Docker images: the
docker-split-containersanddocker-supervisedmodes and the--zcashd-docker-imageflag ofscripts/install-zebra.sh, theruntime-zcashd-compatDockerfile stage, thecompat-docker-buildandcompat-docker-startmake targets, and theZCASHD_COMPAT_ENABLEDvariable of the Docker entrypoint. Use the installer'ssplit-binary,supervised, orbuild-from-sourcemodes instead.
Fixed
- The block gossip task no longer stalls when there are no ready peers, which could fill the mined block channel and make
submitblockreturn errors for blocks that were committed (#11475). - Zebra no longer gets stuck on a losing branch when many competing blocks arrive at once, as in Testnet minimum-difficulty bursts. Thanks to @tuan-phan and @SphereDonout (#11133).
- The mempool no longer bans peers that relay a transaction rejected for its lock time. Lock times are checked against the local tip, so a better-synced peer could relay a transaction that becomes valid one block later and be banned for 24 hours. Thanks to @sangsoo-osec for the report (#11623).
getinfo,getnetworkinfoandgetpeerinfono longer stop responding, or block other RPC requests, while the node processes a large batch of gossiped peer addresses (#11702).- Return an error instead of exiting when invalidateblock targets the root of the only non-finalized chain (#11536).
- Fixed Sentry dropping queued events and logs when
zebradshuts down, and titled Sentry panic issues with the panic message and a stack trace instead of a generic message, so that different panics are reported as different issues.
Security
- The mempool per-peer inbound-download cap is now keyed on the peer's IP address instead of its full socket address, so a single host can no longer exceed the cap by opening connections from multiple source ports. This matches the inbound-block download cap (#10685).
- Fix an initial sync stall where a peer serving a forged checkpoint block body stopped the honest block from being downloaded again until restart (GHSA-9hq5-pfgc-cx5h). Originally reported by @saxenism; independently re-discovered by @x15-eth, @manus-pi, @ouicate and Nathan Byarugaba.
- Capped the number of transaction IDs the inbound service looks up per transaction request at
GETDATA_MAX_TRANSACTION_COUNT, before the mempool lookup — matching the block request path, which was already capped atGETDATA_MAX_BLOCK_COUNT(#10566). getaddresstxidsandgetaddressutxosreturn an error instead of doing unbounded work when a query matches more than 100,000 results, and the address RPCs accept at most 10,000 addresses. Narrow the height range, or page withstartHeightandmaxEntries(#10686).- Update
rustlsto 0.23.46 to fix RUSTSEC-2026-0346, RUSTSEC-2026-0347, RUSTSEC-2026-0348 and RUSTSEC-2026-0349. Zebra peer and RPC connections do not use TLS, so only outbound HTTPS clients such assentry, OpenTelemetry and Elasticsearch are affected. - Fixed a quadratic CPU cost in transaction verification: the coinbase maturity check rebuilt a transaction's transparent output list once per input, so one unsigned ~2 MB transaction with many inputs and outputs could pin a node's worker threads for tens of seconds before being rejected without a misbehaviour score. The check now computes the coinbase spend restriction once per transaction, in both the mempool and block commit paths. Regression from the
zcash_primitivestransaction newtype in Zebra 6.4.0; Zebra 6.3.x is not affected. - Fix an initial sync stall where a peer serving a forged checkpoint block body followed by an invalid block left the checkpoint verifier ahead of the state, so the honest block was rejected until restart (GHSA-2w9f-9wx8-f5c8). Reported by @SphereDonout.
- Update
rustls-webpkito 0.103.16 andwebpki-rootsto 1.0.10 to distrust the compromised eMudhra intermediate CA keys. Zebra peer and RPC connections do not use TLS, so only outbound HTTPS clients such as the managedzcashddownload (which is also SHA256-pinned),sentry, OpenTelemetry and Elasticsearch are affected. - Fix a panic that could abort
zebradwhen Zebra disconnected a peer while it was still waiting for that peer to accept a request (GHSA-6v36-c42v-v98p). Thanks to @SphereDonout for reporting the issue. - Ban peers that send transactions or blocks whose transparent scripts fail. Previously, a peer could keep transaction and block verification busy with invalid transparent transactions without being banned (GHSA-jq45-ghw5-v37x). Thanks to @x15-eth for reporting the issue.
Contributors
Thank you to everyone who contributed to this release:
@DrVelvetFog, @alchemydc, @andres-pcg, @arcayne, @arya2, @conradoplg, @gustavovalverde, @idky137, @jiehuo100net, @mpguerra, @natalieesk, @nuttycom, @oxarbitrage, @robustfengbin, @upbqdn, @vbar and @zmanian