Releases: ZcashFoundation/zebra
Release list
Zebra 6.3.0
Added
- Added
seeder.zec.rocksandseeder.testnet.zec.rocksas default DNS seeders
(#11096). - Prometheus metrics now separate peer connection attempts and terminal outcomes by network,
direction, address family, lifecycle stage, and bounded outcome. Version-message metrics also
report the bounded self-reported implementation class without using peer IPs or raw user agents
as labels (#11135). - New
getdeprecationinfoRPC returning the block height and estimated time at which this
release will halt for end of support, in zcashd'send_of_serviceformat. Theend_of_service
object is only present on Mainnet, where end of support is enforced
(#11097).
Changed
- Chain synchronization now downloads a peer's only unknown block hash from a short
FindBlocksresponse, allowing nodes near the chain tip to continue advancing
(#11165). - Peer-set, crawler-handshake, and address-book gauges now include a
networklabel, so Mainnet
and Testnet values no longer overwrite each other in processes that run both networks
(#11135).
Fixed
getblocksubsidynow returns NU6-era funding stream metadata (recipient names and
specification URLs) for NU6.1 and later upgrades. Amounts and addresses were never
affected (#11172).- Reject blocks whose total chain value pool balance would exceed
MAX_MONEY,
enforcing the cap on the total monetary base
(#10817). - Banning a misbehaving peer now removes every address book entry for that IP, and a banned IP is
never selected as a reconnection candidate. Previously an entry on a different port could survive
the ban and occupy the first candidate slot until the node restarted
(#11173).
Security
- Inbound connections are canonicalized when they are accepted, so an IPv4 peer that connects to a
dual-stack listener as an IPv4-mapped IPv6 address (::ffff:A.B.C.D) is keyed on its canonical
IPv4 address. Previously the mapped address became the peer set key, so a ban issued for that
peer's IPv4 address did not disconnect it while it stayed connected, and the same peer counted
twice towards the per-IP inbound connection limit
(#11129). - Prevent a peer from delaying tip discovery by answering a block download with a canonical header
and a rewritten coinbase height. Zebra now re-requests the hash immediately instead of waiting for
a later sync round to rediscover it, and scores the peer when a parent block Zebra already holds
proves the claimed height wrong
(GHSA-g95h-hw6g-pvgv).
Thanks to @zakura-security for reporting the issue. - Blocks above the sync lookahead height limit no longer score the peer that served
them, since that request is routed to an unrelated honest peer — scoring it let a
maliciousFindBlocksresponder get honest peers banned during initial block
download
(GHSA-qhr3-cvch-5fh2). - Peers that gossip consensus-invalid blocks are scored for misbehavior again. The inbound
download cleanup only recognizedVerifyBlockError, but the gossiped block verifier is a
BlockVerifierRouter, which returnsRouterError, so no score was ever applied and such
peers were never banned
(GHSA-8hh2-hrf2-cqf4).
Zebra 6.2.3
This is an optional release with network hardenings for operators that experience issues with their nodes peer set connectivity or otherwise want to be proactive about avoiding such issues.
This release helps keep Zebra's peer set healthy. While syncing, outbound connection slots are
no longer occupied by peers that can't serve blocks, dropped outbound connections are proactively
replaced, and getaddr responses share more of the address book so peers can find more of the
network. Zebra also no longer disconnects peers during expected long gaps between blocks, or
penalizes them for briefly disagreeing about the NU6.3 activation.
Changed
- Mempool transaction relay no longer penalizes peers for adjacent NU6.2 and
NU6.3 branch ID mismatches during the 40 heights on either side of NU6.3
activation, avoiding bans caused by temporary chain-tip divergence
(#11113). - Chain synchronization now retains the final block hash returned by peers in
FindBlocks
responses, rather than discarding it to work around obsoletezcashdbehavior
(#11093). - The peer crawler now queues a connection attempt on each crawl interval for every spare
outbound connection slot that has a ready address book candidate, so dropped outbound
connections are proactively replaced until the outbound connection limit is reached.
Previously, new connections were only attempted when the peer set ran out of ready peers,
when a crawl found new addresses, or when the node had no outbound connections at all
(#11102). - Zebra now sends up to half of its address book in response to a
getaddrrequest, up from
a quarter, so peers can find more of the network from each response
(#11103). - The peer stall detector no longer disconnects peers for empty
FindBlocksorFindHeaders
responses while the node is within 1,000 estimated blocks of the network tip, avoiding false
stall detection during long gaps between blocks
(#11122). - Upgraded the librustzcash crate cohort (
orchard0.15.3,zcash_keys0.16.0,
zcash_primitives0.30.0,zcash_proofs0.30.0,zcash_transparent0.10.0) to the
released NU6.3 versions. No behavior change
(#11111).
Fixed
- Outbound peer slots no longer fill up with peers that advertise no services, which could stall
a fresh sync at genesis when most reachable listeners are non-serving. While syncing, Zebra
now requires theNODE_NETWORKservice from outbound peers; at or near the network tip it
accepts non-serving peers (like pruned nodes) again
(#11071). - The embedded zcashd-compat release manifest and the installer script now pin sidecar
zebra-compat-v1.1.0, which follows Mainnet past the NU6.3 (Ironwood) activation at block
3,428,143. The previouszebra-compat-v1.0.0sidecar predates the activation height and stops
following the chain at that block. Supervised deployments usingzcashd_source = "embedded"
must upgrade (or setzcashd_pathto a current sidecar binary) before activation
(#11112).
Zebra 6.2.2
Zebra 6.2.2 fixes credential exposure in startup logs for nodes built with the elasticsearch feature and prevents zebrad-log-filter from executing log text as shell input. It also keeps 3 RPC responses internally consistent during reorgs or tip advances and retries the first peer-cache write sooner. Existing state databases do not need migration or resync.
Update Priority
| User Type | Priority | Reason |
|---|---|---|
Operators using elasticsearch or zebrad-log-filter |
Medium | Prevents password exposure in the startup config dump and shell execution from log text |
| RPC service operators | Medium | Keeps getblock, getblockheader, and gettxout internally consistent when chain state changes during a request |
| Other operators | Low | No state migration or resync is required; peer caching improves on cold starts |
Changed
- The first peer disk-cache write is retried every 20 seconds until it succeeds, instead of waiting the full 5-minute update interval, so a cold-started node caches its peers soon after finding them (#11073).
Fixed
getblock,getblockheader, andgettxoutRPC methods now bind their follow-up state queries to the block hash resolved by the first read, avoiding internally inconsistent responses when a reorg or tip advance occurs mid-call (#10550).
Security
- The startup config dump no longer prints the Elasticsearch password in logs or journald when the
elasticsearchfeature is enabled (#11051). zebrad-log-filterno longer executes log text as a shell command, so a log line containing a single quote cannot run commands as the user running the filter (#11050).
How to Upgrade
Upgrading from Zebra 6.2.0 or 6.2.1 does not require a state migration or resync.
Docker
docker pull zfnd/zebra:6.2.2
# or update your compose file and:
docker compose pull && docker compose up -dBinary
- Stop
zebrad(systemctl stop zebradorCtrl+C) and wait for a clean shutdown. - Replace the binary with
zebrad-6.2.2-<arch>-unknown-linux-gnu.tar.gzfrom this release's assets, or runcargo binstall zebrad. - Start
zebradagain.
Source
git fetch && git checkout v6.2.2
cargo build --releaseSource builds require Rust 1.91 or newer, protoc, a C++ compiler, and libclang.
For installation guidance, see Install Zebra.
Compatibility
| Component | Supported |
|---|---|
| Operating systems | Linux (prebuilt binaries: x86_64 and aarch64, glibc 2.34+); macOS and Windows via source build |
| Zcash protocol | All network upgrades through NU6.3 (Ironwood) |
| State database | Format 28.0.0; unchanged from Zebra 6.2.0 and 6.2.1, no resync required |
| Minimum Rust for source builds | 1.91 |
| zcashd compatibility | Experimental constrained-sidecar mode; review the safety guidance before production use |
| End of support | Block 3,545,960, approximately 105 days after release |
Zebra 6.2.1
Changed
- On Testnet, the
getblocktemplateRPC no longer switches to a
minimum-difficulty block template early. Zebra previously treated a template
as minimum-difficulty as soon as itscur_timecame within a fixed 150
seconds (2 * PoWTargetSpacingafter Blossom) of the consensus
minimum-difficulty threshold, clampingcur_timeup to just past the
threshold. On Testnet this future-dated the block's timestamp and produced
spurious minimum-difficulty blocks that depress difficulty far below its
equilibrium. Templates now switch to minimum difficulty only oncecur_time
reaches the consensus threshold itself. This is a Testnet-only,
template-construction (non-consensus) change: it does not alter block
validity, and it does not change the difficulty-averaging rule that amplifies
each minimum-difficulty block into a large difficulty drop (tracked in
zcash/zips#1321)
(#10873)
Security
- Allow chain synchronization to immediately retry an honest block body after rejecting a body
with the same header hash, without waiting for a child block to trigger cleanup. - Mitigate a peer-driven CPU-exhaustion vector on nodes with NU6.3 (Ironwood) active: reject
underpaying and structurally invalid shielded mempool transactions before their expensive proof
verification, and disconnect peers that send transactions with invalid shielded proofs.
Zebra v6.2.0
Zebra 6.2.0 adds an experimental migration path for exchanges and custodial services that still depend on the zcashd wallet and RPC interfaces. Zebra handles Zcash networking and consensus while a constrained zcashd sidecar retains the existing wallet, RPC, and ZMQ surface. Existing Zebra deployments are unchanged unless zcashd-compat mode is enabled.
Update Priority
| User Type | Priority | Reason |
|---|---|---|
Exchanges and custodial services evaluating migration from zcashd |
Medium | Adds the experimental zcashd-compat mode and migration tooling |
| General operators | Low | No required migration; existing node operation is unchanged |
Added
- New experimental zcashd-compat mode (
zebrad start --zcashd-compator the[zcashd_compat]configuration section). Zebra faces the Zcash network while a hard-lockedzcashdwallet runs as a sidecar connected only to the local Zebra node. Zebra can optionally download, supervise, and restart the SHA256-pinned sidecar. The release also includes an interactive installer with binary, Docker, and source-build modes, plus operational documentation and sync-check tooling (#10952). Credits to the Zakura authors for the major part of this implementation. - New Regtest-only
generatetoaddressRPC that mines blocks paying the coinbase to a caller-specified address. This allows test harnesses to fund multiple wallets from one Zebra node (#10952).
Fixed
- The installer's
docker-supervisedmode now configures the embedded sidecar source, so its generated command works with the published Zebra image (#11008).
How to Upgrade
Upgrading from Zebra 6.1.0 does not require a state migration or resync.
Docker
docker pull zfnd/zebra:6.2.0
# or update your compose file and:
docker compose pull && docker compose up -dBinary
- Stop
zebrad(systemctl stop zebradorCtrl+C) and wait for a clean shutdown. - Replace the binary with
zebrad-6.2.0-<arch>-unknown-linux-gnu.tar.gzfrom this release's assets, or runcargo binstall zebrad. - Start
zebradagain.
Source
git fetch && git checkout v6.2.0
cargo build --releaseSource builds require Rust 1.91 or newer, protoc, a C++ compiler, and libclang.
For installation and safety guidance, see zcashd-compat mode.
Compatibility
| Component | Supported |
|---|---|
| Operating systems | Linux (prebuilt binaries: x86_64 and aarch64, glibc 2.34+); macOS and Windows via source build |
| Zcash protocol | All network upgrades through NU6.3 (Ironwood) |
| State database | Format 28.0.0; unchanged from Zebra 6.1.0, no resync required |
| Minimum Rust for source builds | 1.91 |
| zcashd compatibility | Experimental constrained-sidecar mode; review the safety guidance before production use |
| End of support | Block 3,537,960, approximately 105 days after release |
Contributors
Thank you to everyone who contributed to this release. We couldn't make Zebra without you:
@arya2 and @gustavovalverde.
Zebra 6.1.0
Zebra 6.1.0 - 2026-07-17
Added
- Added the
getstandardfeeRPC, a parameterless method returning the
recommended standard fee per logical action (the ZIP-317 marginal fee, 5000
zatoshis) with aversionfield for future dynamic fee estimation
(#10717).
Security
- Reserve space for the block header and transaction count when selecting block template
transactions, so blocks mined from Zebra's templates can no longer exceed the consensus size
limit (GHSA-95m2-vx53-v2jw). - Avoid quadratic validation work when checking the remaining transparent value of blocks with
many transactions (GHSA-4g24-549m-hp75). - Prevent a peer from stalling chain synchronization by delivering a rejected
block body that shares its header hash with a later valid block
(GHSA-8gxx-hc65-vv82). - Score misbehavior for peers that directly push consensus-invalid transactions, matching the
treatment of peers that advertise them
(GHSA-g7c4-2w6c-cr3r).
Zebra zcashd-compat preview 6.0.0-zcashd-compat.2 (Docker)
Second preview release of Zebra's zcashd-compat mode from the zcashd-compat branch (PR #10952). This is not a mainline Zebra release. See v6.0.0-zcashd-compat.1 for the mode overview and validation status.
What's new: a self-contained Docker image
This release publishes zfnd/zebra:6.0.0-zcashd-compat.2 — a single image bundling zebrad (with zcashd-compat support) and the hash-pinned zcashd wallet sidecar (zcashd + zcash-cli from ZcashFoundation/zcashd zebra-compat-v1.0.0), for the supervised sidecar configuration:
docker pull zfnd/zebra:6.0.0-zcashd-compat.2
# Supervised sidecar mode (Zebra spawns and supervises zcashd):
docker run -e ZEBRA_ZCASHD_COMPAT__MANAGE_ZCASHD=true \
zfnd/zebra:6.0.0-zcashd-compat.2 zebrad start --zcashd-compat
# Or run it as a plain Zebra node:
docker run zfnd/zebra:6.0.0-zcashd-compat.2See the Zebra Book chapter book/src/user/zcashd-compat.md on the branch for full configuration (data directories, RPC exposure, network selection), or use make compat-docker-start.
The image is linux/amd64 only (the sidecar release ships x86_64 binaries only).
Other artifacts
install-zebra.sh— the interactive installer; its Docker modes now use the image above (binary mode still uses the v6.0.0-zcashd-compat.1 zebrad archive)zebradbinary archives are attached by CI after publication
Changes since v6.0.0-zcashd-compat.1
- The
runtime-zcashd-compatDocker stage downloads and SHA256-verifies the sidecar inside the build — no externally prepared build context needed;docker build --target runtime-zcashd-compat .just works - Branch releases publish that image to Docker Hub
- Installer Docker modes point at the published image
Zebra zcashd-compat preview 6.0.0-zcashd-compat.1
Preview release of Zebra's zcashd-compat mode from the zcashd-compat branch (PR #10952).
This is not a mainline Zebra release but does include fixes for zakura-core/zakura#198, zakura-core/zakura#199, zakura-core/zakura#200, and zakura-core/zakura#201.
What is this?
Zebra faces the Zcash network while a hard-locked zcashd wallet build runs as a P2P sidecar with a single outbound connection to the local Zebra node — for operators migrating from zcashd who still need its wallet and RPC surface. Zebra can optionally download (SHA256-pinned), spawn, and supervise the sidecar. See the Zebra Book chapter book/src/user/zcashd-compat.md on the branch for setup and operations.
Install
Download install-zebra.sh from this release, then:
chmod +x install-zebra.sh
./install-zebra.shThe interactive installer offers binary, Docker, and build-from-source modes. Binary mode downloads the zebrad archive attached to this release and the sidecar zcashd from ZcashFoundation/zcashd zebra-compat-v1.0.0, both SHA256-pinned.
Artifacts
| Asset | Description |
|---|---|
install-zebra.sh |
Interactive installer |
zebrad-6.0.0-zcashd-compat.1-x86_64-unknown-linux-gnu.tar.gz |
zebrad with zcashd-compat support, built from 954c928c6 |
...tar.gz.sha256 |
Archive checksum |
The zebrad binary was built on Ubuntu 24.04 and requires glibc ≥ 2.39. No aarch64 build is provided for this preview.
Validation
- zcashd wallet RPC conformance harness passes end-to-end against the live pairing (single-node and 3-node shielded flows)
- Rust zcashd-compat integration suite: 26/26 pass against the shielded-first sidecar
- 500-iteration reorg churn soak: pass
Caveats
- Preview quality: PR #10952 is still under review.
- No Docker Hub images are published for this tag; the installer's Docker mode expects images that are not yet available — use binary or build-from-source modes.
- The sidecar
zcashdis a shielded-first build: legacy transparent wallet RPCs (e.g.getnewaddress) are disabled; use the account / unified-address /z_*flow.
Zebra v6.0.0
Zebra 6.0.0 - 2026-07-10
This release activates NU6.3 (Ironwood) on Zcash Mainnet at block height 3,428,143 (~2026-07-28).
It also fixes a mempool denial-of-service issue where non-standard transparent inputs
were rejected only after the more expensive script verification step
(GHSA-84j3-rw4c-gqmj).
Update Priority
| User Type | Priority |
|---|---|
| All operators | Critical |
Network Upgrade Details
| Activation Height | 3,428,143 |
| Expected Date | ~2026-07-28 |
| Consensus Branch ID | 0x37a5165b |
| Testnet Activation | Block 4,134,000 (active since v6.0.0-rc.0) |
Implemented ZIPs
- ZIP 258: Deployment of the NU6.3 Network Upgrade
- ZIP 229: Version 6 Transaction Format
- ZIP 2005: Ironwood Quantum Recoverability
- ZIP 2006: Restricting Transfers into the Orchard Pool
- ZIP 318: Orchard to Ironwood Migration
Added
- NU6.3 (Ironwood) now activates on Mainnet at block height 3,428,143, matching
zcash_protocol. Node operators must upgrade to this release before activation
(#10938).
Changed
- Updated the
zcash_*andorchardcrates to their released NU6.3 versions
(#10938). - Updated
rocksdbto 0.24. The bundledlibrocksdb-sysnow always runs
bindgento generate its FFI bindings, solibclangis required at build
time (in addition toprotocand a C++ compiler) even when linking a system
RocksDB viaROCKSDB_LIB_DIR. Installlibclang-dev(Debian/Ubuntu),
clang(Arch), or the equivalent for your platform
(#10922). - Bumped the workspace (libraries) MSRV from 1.85.1 to 1.88. The
zebradbinary
MSRV is unchanged at 1.91.homeis no longer pinned to 0.5.11, since 0.5.12
builds on the new MSRV
(#10927).
Fixed
- Keep the mempool active through transient sync-status noise. Once started, the
mempool is no longer cleared and its queued transaction verification is no longer
cancelled when a temporary signal (which lower-work forks or stale peers can
trigger) reports Zebra is far from the tip; initial activation still waits until
Zebra is near the chain tip
(#10929). - Don't disconnect from peers that return empty
FindBlocksorFindHeaders
responses when the local node is at or near the chain tip
(#10732) - Fix syncer restarts due to incorrect error downcasting
(#10916). - Fix a read-state syncer startup hang: a co-located consumer whose finalized state
had caught up past the node's non-finalized root would re-subscribe endlessly
instead of syncing, advancing only one block per newly mined block
(#10841) - Mempool transactions with non-standard transparent inputs are now rejected
before script verification, to avoid the more expensive script verification
and reduce DoS surface
(GHSA-84j3-rw4c-gqmj).
Thanks to @ouicate for reporting the issue. - Related to the previous item, script verification now runs on the shared Rayon
thread pool to avoid blocking the runtime.
How to Upgrade
Upgrading from 5.x or 6.0.0-rc.0 keeps your synced state: the first start migrates
the state database in place to format 28, with no resync.
Docker
docker pull zfnd/zebra:6.0.0
# or update your compose file and:
docker compose pull && docker compose up -dBinary
- Stop zebrad (
systemctl stop zebradorCtrl+C) and wait for a clean shutdown - Replace the binary with
zebrad-6.0.0-<arch>-unknown-linux-gnu.tar.gzfrom this
release's assets (signed; Linuxx86_64andaarch64, glibc 2.34+), or run
cargo binstall zebrad - Start zebrad again
Source
git fetch && git checkout v6.0.0
cargo build --releaseSource builds need Rust 1.91+, protoc, a C++ compiler, and libclang (new in
this release).
Compatibility
| Component | Supported |
|---|---|
| Operating Systems | Linux (prebuilt binaries: x86_64/aarch64, glibc 2.34+); macOS and Windows via source build |
| Zcash Protocol | All network upgrades through NU6.3 (Ironwood) |
| State database | Format 28.0.0; in-place upgrade from 5.x, no resync |
| Minimum Rust (source builds) | 1.91 |
| End of support | Block 3,528,960 (~105 days after release) |
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@arya2, @conradoplg, @Cosmos-Harry, @dannywillems, @gustavovalverde, @jvff, @oxarbitrage, @upbqdn and @ValarDragon.
Zebra 6.0.0-rc.0
Added
- Support for the NU6.3 "Ironwood" shielded pool and v6 transaction format,
activating on Testnet at height 4,134,000. The consensus parameters (v6 version
group ID, consensus branch ID, and Testnet activation height) match
zcash_protocol. No Mainnet activation height is set yet. - The
z_gettreestate,z_getsubtreesbyindex, and verbosegetblockRPCs expose the
Ironwood note commitment tree and its subtree roots from NU6.3 activation
(#10888). - Zebra now tags the coinbase input of every block it mines with a
🦓. The
mining.extra_coinbase_dataoption is now limited to 86 bytes (was 94); Zebra
refuses to start if it is exceeded. - Pre-built
zebradbinaries are attached to each GitHub release for Linux on
x86_64andaarch64, so operators can run a node without Docker or a source
build, also installable withcargo binstall zebrad. Each.tar.gzcarries a
SHA-256 checksum, a Sigstore build-provenance attestation, and a Cosign signature
over the checksum manifest (#10799) - Added a Regtest configuration option,
should_allow_unshielded_coinbase_spends,
to forbid spending coinbase outputs into transparent outputs (the inverse of
zcashd's-regtestshieldcoinbase). It defaults to allowing such spends, preserving
existing Regtest behavior (#10698) - When the indexer RPC is enabled, a co-located read-state consumer can follow the
node more efficiently: the non-finalized block subscription resumes from the
consumer's known chain tips instead of re-streaming the whole non-finalized state,
and a newGetBlockindexer method lets the consumer fetch blocks it is missing
while its finalized state catches up. - New
zebra-stateread requestReadRequest::FindForkPoint(with response
ReadResponse::ForkPoint) that returns the most recent block in a caller-supplied
locator that is on the best chain — the fork point — for clients tracking chain
reorganizations through a read-only state service. - Added a
[notify] block_notify_commandoption that runs a command on each best-chain-tip
change, with%sreplaced by the new block hash — Zebra's equivalent ofzcashd's
-blocknotify.
Changed
- The state database format is bumped to 28.0.0 for the NU6.3 "Ironwood" shielded
pool. This is a major-version bump that is restorable in place from the previous
major format version (no resync): an in-place migration backfills the genesis
Ironwood note commitment tree and anchor, four new (initially empty)ironwood_*
column families are created, and the chain value pool record is widened to include
the Ironwood pool. ThegetblockchaininfoandgetblockvaluePoolsnow include
the (zero, until NU6.3 activates)ironwoodpool. - Opening a Zebra state read-only (for example, as a secondary instance over a
running node's database) now fails with a clear error instead of panicking when
the cache directory is missing or unreadable, when no database exists at the
configured path, or when an ephemeral database is also configured (a read-only
secondary must not delete the primary's files). The read-write open path is
unchanged. - Upgraded the librustzcash crate cohort to the NU6.3 pre-release wave (
orchard
0.15.0-pre.1,zcash_address0.13.0-pre.0,zcash_history0.5.0-pre.0,zcash_keys
0.15.0-pre.0,zcash_primitives0.29.0-pre.0,zcash_proofs0.29.0-pre.0,
zcash_protocol0.10.0-pre.0,zcash_transparent0.9.0-pre.0) for v6 transaction
and Ironwood support (#10762). - Bumped
anyhowto 1.0.103, clearing RUSTSEC-2026-0190
(#10849).
Fixed
getblocktemplatenow caches the built coinbase transaction per block, so repeated short-poll
requests within the same block no longer rebuild it. This prevents CPU saturation and multi-second
template latency when mining to a shielded (Sapling or Orchard) address
(#10847)- Released
zebradbinaries report their source commit inzebrad version
(#10798) - Handle
invalidateblockandreconsiderblockedge cases (chain-root and
same-height sibling-tip invalidation, repeated reconsideration) without panicking
(#10586) - A timeout waiting for a transparent input UTXO during transaction verification is
now treated as a missing input instead of an internal error, preventing a sync
stall near the chain tip (#10810) - The co-located read-state syncer (used by indexers like Zaino) no longer drops and
re-creates its non-finalized block subscription every second while its view of the
finalized state lags the node's
(#10818)
Security
- Use constant-time comparison for RPC cookie authentication (#10567)
- Zebra's release Docker images are now reproducible: an independent rebuild of a
publishedzebradfrom the same commit produces the same binary. The Rust
toolchain and the Rust and Debian base images are pinned by exact version and
digest, and build paths and file timestamps are normalized, so two independent
builds of the same commit produce the same binary. Release images are also built
without the shared build cache, so a published image cannot inherit a layer from
a lower-trust build
(#10798) - Release Docker images are signed and carry build provenance and a signed SBOM.
Each production release gets a Cosign keyless signature, a signed SLSA provenance
attestation, and a signed SBOM, so anyone can confirm an image came from Zebra's CI
withcosign verifyorgh attestation verify
(#10798) - Route directly pushed transactions (
txmessages) through the same per-peer
mempool admission accounting as advertised transaction IDs, so a single inbound
peer cannot bypass the per-peer download cap by pushing full transactions
instead of advertising them
(GHSA-m9xx-8rcj-vmgp).
This is the direct-push counterpart of the advertisement-path fix in
GHSA-4fc2-h7jh-287c. Thanks to @SuplabsYi for reporting the issue. - Fixed a panic in the
getblockRPC at verbosity 2 for blocks not in the best
chain: their transactions' confirmations are negative and were cast to an
unsigned type
(GHSA-x6v8-c2xp-928m).
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@andres-pcg, @conradoplg, @dannywillems, @emersonian, @gustavovalverde, @nuttycom, @syszery, @upbqdn and @zmanian.