Releases: ShieldedLabs/zero
Release list
Zero v29
Zero release 29, built from commit 7e1b37d.
Changes
Added
- zebra: per-check timers for transaction verification. The
checksphase of
zebra_consensus_transaction_duration_secondswas one timer around every
script, signature and proof check and their waits on the shared batch
verifiers, so the largest cost in block verification could not be attributed.
zebra_consensus_transaction_check_duration_seconds{check,request}now
records each check's wall time from first poll to completion, withcheckin
script,sprout_proof,sprout_sig,sapling,orchardandstate
(mempool only); subtractingzebra_consensus_batch_duration_secondsfor the
matching verifier isolates queue wait from batch work. The checks run
concurrently, so the kinds overlap rather than sum. Aphase="prepare"
sample covers the sighash and transaction id digests, bundle extraction and
check construction betweenutxo_fetchandchecks, which were previously
untimed. (#74)
CI
release.ymlrefuses to dispatch when either node's mainnet halt (zcashd
or zebra) is under 4 weeks past the current tip (estimated from a block
anchor and the wall clock, no network access); MAINTENANCE.md gains the
matching pre-release checklist. (#61)z3-smokebuilds only the stack images whose build context a PR touches
and pulls the others, pinned by digest, fromghcr.io/shieldedlabs/zero-*:main:
the newest main build that passed the smoke test, published by a new
push-to-main run after its own green smoke. Releases, schedules, and
dispatches still build every image. The zcashd cache-warm build is its own
non-gating job, so smoke no longer waits ~45 minutes for it on zcashd PRs. (#64)- The zcashd image builds
depends/in its own cached layer, so a change under
zcashd/srcrebuilds zcashd alone (about 2 minutes at 16 vCPUs) instead of
every dependency (about 15). The cache-warm job no longer exports its builder
layers to the Actions cache on PR runs: that upload took 10 to 29 minutes per
PR (a single 5.5 GB blob) and had pushed the repository past the 10 GB cache
quota, evicting the other workflows' entries. PR runs are now a separate
read-only job (no registry login, nopackages: write, no export); pushes
to main, schedules, dispatches, and releases still refresh the registry
cache. (#65, #66) release.ymlgrants its smoke gatepull-requests: read. The reusable
z3-smokeworkflow has required that scope since #64, and a called workflow
may not request more than its caller grants, so every release dispatch since
then failed at startup with no jobs. (b212452)z3-regtestmines its golden chain withgeneratetoaddresson the live
node instead of the internal miner behind stop-and-restart cycles, builds
its binaries in parallel behind a source-tree binary cache, and runs the
scenario groups as parallel jobs, with a push-to-main run so PR caches have
something to hit: 64 to 83 minutes per run before, about 15 after. (#67, #68)release.yml's version job uses the same checkout v7.0.1 pin as its other
jobs, and a mislabelled checkout pin in the Copilot review workflow is
labelled correctly; SHAs unchanged. (#62)- The Copilot push-review workflow gains
code,securityandfullmodes
(codeby default on pushes to main, selectable on manual runs), and
.github/copilot-instructions.mdis generated from
.github/review-modes/*.mdrather than edited by hand. (#71)
Docs
- zebra: the end-of-support vendor note is a plain
// [zero]comment above
ESTIMATED_RELEASE_HEIGHTinstead of part of its rustdoc; value and
behaviour unchanged. (#63)
Source archives
One ZIP per vendored component (tracked source at the released commit):
zcashd-v29.zipzebra-v29.zipzaino-v29.zipzallet-v29.ziporchard-v29.ziplibrustzcash-v29.ziplightwalletd-v29.zip
Binaries
Prebuilt for linux/x86_64 (built on ubuntu-22.04, glibc 2.35+; stripped).
Telemetry disabled (no sentry/opentelemetry); getblocktemplate and
prometheus metrics included.
zebrad-v29-linux-x86_64(with.sha256)
Note
The "Source code (zip)" and "Source code (tar.gz)" entries are
generated automatically by GitHub from the tag. They are not part of
the Zero release; use the assets above.
Zero v28
Zero release 28, built from commit 94db842.
Changes
Fixed
- zcashd: the mainnet end-of-service halt moves from block 3,471,448
(~2026-09-04) to 3,527,448 (~2026-10-23), with the shutdown warning from
block 3,511,320 (~2026-10-08). Every release from v20 through v27 embedded
the v20 release height, so all of them halt at 3,471,448; there is no
runtime override, only a new binary moves it. Testnet and regtest are not
affected. (#59) - zebra: the mainnet end-of-support halt moves from block 3,545,960
(~2026-11-08) to 3,564,960 (~2026-11-24), the horizon of upstream zebra
6.3.0, with the warning from block 3,548,832 (~2026-11-10). v26 and v27
both reported 3,545,960 because neither re-vendored zebra. Zero now carries
the release height and re-sets it at every release. (#59)
Source archives
One ZIP per vendored component (tracked source at the released commit):
zcashd-v28.zipzebra-v28.zipzaino-v28.zipzallet-v28.ziporchard-v28.ziplibrustzcash-v28.ziplightwalletd-v28.zip
Binaries
Prebuilt for linux/x86_64 (built on ubuntu-22.04, glibc 2.35+; stripped).
Telemetry disabled (no sentry/opentelemetry); getblocktemplate and
prometheus metrics included.
zebrad-v28-linux-x86_64(with.sha256)
Note
The "Source code (zip)" and "Source code (tar.gz)" entries are
generated automatically by GitHub from the tag. They are not part of
the Zero release; use the assets above.
Zero v27
Zero release 27, built from commit 35da117.
Changes
Performance
- Zebra block verification reuses transparent script verification from mempool
admission (#45): a transaction verified on entry to the mempool skips the
interpreter, ZIP-244 sighash, and signature checks when the block that mines
it is verified, keyed byWtxIdso an authorizing-data twin misses. - Zebra block-path UTXO lookups overlap up to 64-way instead of awaiting one
state round trip per input (#46). - Measured together on a full-block shape of 7 transactions with 1000
transparent inputs each, state serving lookups under 1ms of latency: 2.9 s
to 59 ms for a block whose transactions were mempool-verified, and the
lookup wall alone drops 2.8 s to 0.37 s cold (#49 has the full matrix).
Added
- A worst-case transaction verification benchmark for zebra-consensus (#49),
byte-comparable with Zakura's copy of the same benchmark so the two nodes
can be A/B measured on identical inputs, plus Zero-only cold/warm cases for
the 7x1000 transparent block shape with configurable state latency. - CI runs the zebra-consensus criterion benches on every zebra-touching
commit and posts timings to the job summary (#48).
Subtrees
- zallet re-vendored at v0.1.0-beta.3: upstream split the workspace into a
zalletlauncher plus per-backend crates, and our z_listunspent and sync
patches moved ontozallet-core(#54 carried the deploy fallout: the
z3-stack image builds the zaino backend viaBACKEND=zaino,zallet.toml
selects it and opts into the non-loopback RPC bind guard, and the smoke
probes accept the new sync-gate answer). - zaino updated to upstream 0.8.0 (#37).
- orchard tracks upstream main now that Ironwood ships in 0.15.x;
librustzcash and lightwalletd re-vendored and pinned to recorded tags;
zcashd build scripts fixed for arm64 macOS (native arch detection, portable
bdb, Apple-Silicon crc32).
zero-indexer
- The shim and hub embed a Nym mixnet driver end to end: the hub publishes
its mixnet address and the clearnet submit path is closed, submissions are
padded so size stops fingerprinting a migration, and both sides get
reproducible StageX builds with attested deploys and a one-command
deploy.sh. - Hardening wave from the external security review: bounded reads, queues,
timeouts and fan-out across shim and hub, fail-closed expiries, ordered
shutdown, publish-before-serve for queued migrations, and status endpoints
(/nym-status) so a dead mixnet client stops reading as healthy. - The book renames Zeronym to zero-indexer; operator and failover runbooks
rewritten from measured behavior.
CI
- cargo vet supply-chain gate: every Rust dependency change must land with a
matching audit or exemption diff under the component'ssupply-chain/
directory (new stores for zaino and orchard; zebra's and zcashd's brought
back in sync with their trees; enforced bycargo-vet.yml). - z3-smoke hardening (#56, #57): third-party actions pinned by commit SHA,
packages: writescoped to the one job that pushes build cache, and
cache-warm-only build legs can no longer redden the stack gate when a
registry throttles a cache pull. - Copilot reviews commits pushed straight to main, with custom instructions;
the zeronym test jobs actually run their suites (including mixnet-driver
tests) and the hub reproduce gate runs on push, not only on PRs.
Source archives
One ZIP per vendored component (tracked source at the released commit):
zcashd-v27.zipzebra-v27.zipzaino-v27.zipzallet-v27.ziporchard-v27.ziplibrustzcash-v27.ziplightwalletd-v27.zip
Binaries
Prebuilt for linux/x86_64 (built on ubuntu-22.04, glibc 2.35+; stripped).
Telemetry disabled (no sentry/opentelemetry); getblocktemplate and
prometheus metrics included.
zebrad-v27-linux-x86_64(with.sha256)
Note
The "Source code (zip)" and "Source code (tar.gz)" entries are
generated automatically by GitHub from the tag. They are not part of
the Zero release; use the assets above.
Zero v26
Zero release 26, built from commit 3e24f3e.
Changes
Added
coinbase_tx_version = 5under[mining]in zebra pinsgetblocktemplateto V5
coinbase transactions. At Ironwood activation zebrad templates switched to the V6
format, and mining-pool software that splices extranonce data into the coinbase
broke parsing them; F2Pool works around it by running a hand-patched zebrad
(upstream's answer, ZcashFoundation/zebra#10909, is documentation only). The pin
gives the same result as a supported config option and stays consensus-valid.
Unset keeps the network-upgrade default. A V5 pin with a miner address whose only
receiver is Orchard is rejected at startup, since paying an Orchard receiver after
NU6.3 needs the V6-only Ironwood output.
Fixed
- Zebra now prefers the first-received chain on equal-work ties, as the protocol
spec requires, instead of tie-breaking on the tip block hash
(ZcashFoundation/zebra#11240, reported by F2Pool with production logs of losing
blocks they had won by 0.4s of propagation). Siblings always tie on work in
Zcash, so the old rule turned won propagation races into coin flips and let an
equal-work sibling arriving arbitrarily late displace an already-adopted tip.
Blocks are stamped with a receipt order when committed (zcashdnSequenceId
analogue); strictly more work still always wins, and receipt order survives
invalidate/reconsider.
CI
z3-smokeandz3-regtestno longer use GitHub'spaths:trigger filter.
Both now register on every pull request and decide in a 20-secondPath gate
job whether the expensive jobs run, computed fromgit diffagainst the
merge commit's base. PR #20 (the v25 zebra security update) matched the old
filters on 107 of its 144 changed files and GitHub still created no Actions
check suite for it, so a 144-file consensus change merged with no stack CI
and nothing on the PR page showing anything was missing. Each workflow also
gained arequiredjob that reports on every PR, pass or skip, so "the
workflow never ran" can no longer look identical to "the workflow passed".
The releaseworkflow_callgate is unchanged and still runs the full stack
unconditionally.
Source archives
One ZIP per vendored component (tracked source at the released commit):
zcashd-v26.zipzebra-v26.zipzaino-v26.zipzallet-v26.ziporchard-v26.ziplibrustzcash-v26.ziplightwalletd-v26.zip
Binaries
Prebuilt for linux/x86_64 (built on ubuntu-22.04, glibc 2.35+; stripped).
Telemetry disabled (no sentry/opentelemetry); getblocktemplate and
prometheus metrics included.
zebrad-v26-linux-x86_64(with.sha256)
Note
The "Source code (zip)" and "Source code (tar.gz)" entries are
generated automatically by GitHub from the tag. They are not part of
the Zero release; use the assets above.
Zero v25
Zero release 25, built from commit fe056fc.
Changes
Security
- zebra: three fixes from the Zcash Foundation's upcoming security release,
applied ahead of it as[upstream-pending]carries on top of upstream
main(all drop on the next zebra subtree pull):- Blocks above the sync lookahead limit no longer score the peer that served
them. The far-ahead hash comes from a maliciousFindBlocksresponse that
carries no peer attribution, so the follow-up download is answered by an
independently chosen honest peer, and scoring it let an attacker get honest
peers banned throughout initial block download (GHSA-qhr3-cvch-5fh2). - A block download answered with a canonical header and a rewritten coinbase
height is re-requested immediately instead of being rediscovered a sync
round later, and the serving peer is scored when a parent block Zebra
already holds proves the claimed height wrong (GHSA-g95h-hw6g-pvgv,
reported upstream by @zakura-security). - Peers that gossip consensus-invalid blocks are scored for misbehavior
again. The inbound download cleanup downcast errors toVerifyBlockError,
but the gossip verifier is aBlockVerifierRouterreturningRouterError,
so the downcast never matched and such peers were never banned
(GHSA-8hh2-hrf2-cqf4).
- Blocks above the sync lookahead limit no longer score the peer that served
Changed
- zebra: subtree updated from v6.2.0 to upstream
main(8e9ff3b2cb, past
v6.2.3), the exact base of the Foundation's upcoming release. Brings the
6.2.1 to 6.2.3 hardening releases (NU6.3 activation-window and peer
connectivity fixes) plus unreleased work: MAX_MONEY value-pool enforcement
(#10817), the block/mempool transaction-verifier split (#11095), singleton
FindBlocks downloads (#11165), inbound address canonicalization (#11129),
bans that clear the whole address book for an IP (#11173), zec.rocks default
seeders (#11096),getdeprecationinfo(#11097),getblocksubsidyNU6-era
metadata (#11172), indexer gRPC stream limits (#10980), and a
getblocktemplatecoinbase-cache fix (#10954). State format is unchanged
(28); no resync needed. Binaries self-report zebrad 6.2.3 until upstream's
release bumps the version. - Dropped six zebra carries that merged or were superseded upstream: #11113,
#11050, #11053, #11061 (superseded by the narrower require-while-syncing
rule), GHSA-2p4c-3q4q-p463 (#11054), and GHSA-8gxx-hc65-vv82 (#11052).
Still carried: #10732 FindBlocks stall gating.
Added
- zebra: two Prometheus metrics for diagnosing slow block acceptance.
zebra_consensus_transaction_duration_secondssplits transaction verification
intophase="utxo_fetch"(one state round trip per transparent input) and
phase="checks"(scripts, signatures, proofs), each labelled
request="block"or"mempool"; the ratio shows whether a node is bound by
state lookups or cryptography.rpc_submitblock_inflightgauges how many
submitted blocks are being verified at once. Needs theprometheusfeature
and a[metrics] endpoint_addr, both already set in our images.
Fixed
- zebra:
submitblockno longer discards a solved block when the miner's client
disconnects. Verification ran on the RPC connection, so a client timeout
cancelled it mid-flight and the block vanished with no commit and no log line.
Verification now completes regardless of the client, the block is still gossiped
once the client has gone, and every outcome is logged. (50e7e57, 92f499b) - zebra:
submitblockanswersduplicate-inconclusivefor a block still being
verified, instead of verifying it a second time. A miner retrying after a
timeout would otherwise double the work on an already-slow node;duplicate
would wrongly imply the node holds a validated copy. (46b3926)
Testing
- Three regression tests cover the submitblock disconnect and resubmission
paths, each checked to fail without the fixes above.
zebra-rpc/examples/submitblock_abandon_repro.rsreproduces it on Regtest: a
2,000-input block taking ~350ms was lost 3/3 when abandoned at 43/88/177ms,
and commits after the fix. It also shows the block path reuses none of the
mempool's verification work. (c9908b5, a3c60db)
Source archives
One ZIP per vendored component (tracked source at the released commit):
zcashd-v25.zipzebra-v25.zipzaino-v25.zipzallet-v25.ziporchard-v25.ziplibrustzcash-v25.ziplightwalletd-v25.zip
Binaries
Prebuilt for linux/x86_64 (built on ubuntu-22.04, glibc 2.35+; stripped).
Telemetry disabled (no sentry/opentelemetry); getblocktemplate and
prometheus metrics included.
zebrad-v25-linux-x86_64(with.sha256)
Note
The "Source code (zip)" and "Source code (tar.gz)" entries are
generated automatically by GitHub from the tag. They are not part of
the Zero release; use the assets above.
Zero v24
Zero release 24, built from commit 4aec301.
Changes
Fixed
- zebra: peers are no longer penalized for relaying transactions with the
adjacent NU6.2 or NU6.3 consensus branch ID within 40 blocks either side of
NU6.3 activation. Around the boundary a peer's tip can legitimately sit on
the other side of it, and Zebra scored that as misbehavior and banned the
peer, shedding honest peers exactly when the peer set matters most. Ironwood
activates on Mainnet at block 3,428,143. Carried from upstream v6.2.3, which
is an optional hardening release with no security advisories attached; taken
for the activation-window behavior specifically. (upstream #11113, 157e96f)
Testing
- The z3 smoke probes assert that the deployed zebrad reports the NU6.3 branch
ID and pins activation at 3,428,143. A stale image passed every other probe
while silently lacking both the consensus rules and the grace window above;
the 2026-07-17 cached-layer incident shipped that exact class of mismatch. - New
qa/log-filter-injection-test.shcovers the zebrad-log-filter fix from
v23 with seven assertions (command substitution, backticks, metacharacters,
backslash preservation, passthrough). Verified to fail against the pre-fix
script. It runs as a seconds-longquick-checksjob ahead of the image
builds, since zebra-utils scripts are not in the runtime image and cannot be
stack-probed.
CI
- z3-smoke and z3-regtest now trigger on vendored crate sources
(zebra/zebra-*,zebra/zebrad, zaino and zallet packages, lockfiles), not
just Dockerfiles and deploy config. Previously a PR that changed consensus or
wallet code but no Dockerfile ran no CI at all, which is how v21's zebra
security carries reached the release dispatch untested and why the
release-timeworkflow_callgate was added. Gating the release is the
backstop; running on the PR is the fix. Scoped to crate sources so docs and
changelog edits do not trigger a three-image build.
Source archives
One ZIP per vendored component (tracked source at the released commit):
zcashd-v24.zipzebra-v24.zipzaino-v24.zipzallet-v24.ziporchard-v24.ziplibrustzcash-v24.ziplightwalletd-v24.zip
Binaries
Prebuilt for linux/x86_64 (built on ubuntu-22.04, glibc 2.35+; stripped).
Telemetry disabled (no sentry/opentelemetry); getblocktemplate and
prometheus metrics included.
zebrad-v24-linux-x86_64(with.sha256)
Note
The "Source code (zip)" and "Source code (tar.gz)" entries are
generated automatically by GitHub from the tag. They are not part of
the Zero release; use the assets above.
Zero v23
Zero release 23, built from commit 459b8bf.
Changes
Security
- zebra: ZIP-317 policy is now applied to mempool transactions before any
expensive cryptographic verification, instead of after. This completes the
GHSA-2p4c-3q4q-p463 mitigation: v21 banned peers that send invalid shielded
proofs, but the node had already paid for proof verification by the time the
ban landed. An unauthenticated peer could force full Halo2/Groth16
verification on transactions that could never be mined. Rated high upstream,
and specific to NU6.3/Ironwood-active nodes, which is every image we ship.
(upstream #11053, 3b7467e) - zebra:
zebrad-log-filterno longer executes log text as shell. It used GNU
sed'seflag with log-line content interpolated into the executed string,
so piping logs through the filter ran attacker-influenced text as commands.
Not shipped or invoked by any image, but operators run it by hand against
live logs. (upstream #11050, 196815d)
Scope note: upstream zebra v6.2.2 carries a third security fix, redacting the
Elasticsearch password from the startup config dump (#11051). It is deliberately
not carried. That code is behind the elasticsearch feature, which none of our
builds enable (FEATURES=release_max_level_info,progress-bar,prometheus), and
the fix changes a public field type, so carrying it would add a breaking
zebra-state API change with no effect on anything we ship. It arrives on the
next zebra subtree pull.
Both carries are marked [upstream-pending] and drop on the next zebra subtree
pull that reaches v6.2.1 / v6.2.2.
Source archives
One ZIP per vendored component (tracked source at the released commit):
zcashd-v23.zipzebra-v23.zipzaino-v23.zipzallet-v23.ziporchard-v23.ziplibrustzcash-v23.ziplightwalletd-v23.zip
Binaries
Prebuilt for linux/x86_64 (built on ubuntu-22.04, glibc 2.35+; stripped).
Telemetry disabled (no sentry/opentelemetry); getblocktemplate and
prometheus metrics included.
zebrad-v23-linux-x86_64(with.sha256)
Note
The "Source code (zip)" and "Source code (tar.gz)" entries are
generated automatically by GitHub from the tag. They are not part of
the Zero release; use the assets above.
Zero v22
Zero release 22, built from commit b4876a2.
Changes
Fixed
- zcashd:
z_gettreestatehelp documents theironwoodobject's pre-activation presence with a nullfinalRoot - zcashd: raw-tx JSON emits
ironwoodonly for exact-v6 transactions (ZFUTURE no longer shows an empty bundle) - zcashd:
GetHistoryAt's size-check error names the invalid record size - zcashd: Updated source documentation and clarified error messages
Source archives
One ZIP per vendored component (tracked source at the released commit):
zcashd-v22.zipzebra-v22.zipzaino-v22.zipzallet-v22.ziporchard-v22.ziplibrustzcash-v22.ziplightwalletd-v22.zip
Binaries
Prebuilt for linux/x86_64 (built on ubuntu-22.04, glibc 2.35+; stripped).
Telemetry disabled (no sentry/opentelemetry); getblocktemplate and
prometheus metrics included.
zebrad-v22-linux-x86_64(with.sha256)
Note
The "Source code (zip)" and "Source code (tar.gz)" entries are
generated automatically by GitHub from the tag. They are not part of
the Zero release; use the assets above.
Zero v21
Zero release 21, built from commit 21063fb.
Changes
Security
- zebra: peers submitting invalid shielded proofs are now banned. Failed
Orchard/Ironwood Halo2 proofs, Orchard binding signatures, and Sprout
JoinSplit signatures previously collapsed to a zero misbehaviour score,
letting a peer force expensive verification indefinitely.
(GHSA-2p4c-3q4q-p463, 036f233) - zebra: known-block queries drain rejected-block notifications before
checking sent hashes, so an honest block body sharing a header hash with a
rejected body is accepted immediately instead of stalling sync as a
duplicate. (GHSA-8gxx-hc65-vv82, 81b5121)
Fixed
- zebra: outbound peer connections require the peer to advertise NODE_NETWORK,
and rejected peers are recorded so they are not redialed. Without this, the
current mainnet peer population (dominated by non-serving services=0 nodes
since the zcashd EoS halt) fills all outbound slots and stalls fresh syncs
at genesis indefinitely. Verified A/B: patched node syncs from the same
seeders where stock zebra 6.2.x stalls. Upstreamed as
ZcashFoundation/zebra#11061. (2af34be)
Source archives
One ZIP per vendored component (tracked source at the released commit):
zcashd-v21.zipzebra-v21.zipzaino-v21.zipzallet-v21.ziporchard-v21.ziplibrustzcash-v21.ziplightwalletd-v21.zip
Binaries
Prebuilt for linux/x86_64 (built on ubuntu-22.04, glibc 2.35+; stripped).
Telemetry disabled (no sentry/opentelemetry); getblocktemplate and
prometheus metrics included.
zebrad-v21-linux-x86_64(with.sha256)
Note
The "Source code (zip)" and "Source code (tar.gz)" entries are
generated automatically by GitHub from the tag. They are not part of
the Zero release; use the assets above.
Zero v20
Zero release 20, built from commit 1739caf.
Changes
- zcashd: Ironwood is now fully supported (mainnet and testnet)
- zcashd: Bumped the EOL date to ~2026-09-03 (restores the original 7-week EOL window)
- zcashd: Various bug fixes, hardening, and regression tests
Source archives
One ZIP per vendored component (tracked source at the released commit):
zcashd-v20.zipzebra-v20.zipzaino-v20.zipzallet-v20.ziporchard-v20.ziplibrustzcash-v20.ziplightwalletd-v20.zip
Binaries
Prebuilt for linux/x86_64 (built on ubuntu-22.04, glibc 2.35+; stripped).
Telemetry disabled (no sentry/opentelemetry); getblocktemplate and
prometheus metrics included.
zebrad-v20-linux-x86_64(with.sha256)
Note
The "Source code (zip)" and "Source code (tar.gz)" entries are
generated automatically by GitHub from the tag. They are not part of
the Zero release; use the assets above.