Releases: ZcashFoundation/zebra
Zebra 2.5.0
Zebra 2.5.0 - 2025-08-07
This release includes the implementation of Zcash Network Upgrade 6.1 (NU6.1) on Testnet and sets its activation height on the public Testnet at block 3,536,500. Please update your Testnet nodes as soon as possible to ensure compatibility.
Breaking Changes
- Value pool "deferred" changes its identifier to "lockbox".
getblock
andgetblockchaininfo
RPC methods will now returnlockbox
as theFS_DEFERRED
value pool to match zcashd. (#9684)
Added
- Implement one-time lockbox disbursement mechanism for NU6.1 (#9603, #9757, #9747, #9754)
- NU6.1 Testnet implementation and deployment (#9762, #9759)
Fixed
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@Galoretka, @arya2, @conradoplg, @dorianvp, @gustavovalverde, @oxarbitrage, @pacu and @upbqdn
Zebra 2.4.2
This release fixes a database upgrade bug that was introduced in the 2.4.0
release (which has been removed). If you have upgraded to 2.4.0, your Zebra
address index has become corrupted. This does not affect consensus, but will
make the RPC interface return invalid data for calls like getaddressutxos
and
other address-related calls.
(Also refer to the 2.4.0 release notes below for important breaking changes.)
Zebra 2.4.2 prints a warning upon starting if you have been impacted by the bug.
The log line will look like:
2025-07-17T17:12:41.636549Z WARN zebra_state::service::finalized_state::zebra_db: You have been impacted by the Zebra 2.4.0 address indexer corruption bug. If you rely on the data from the RPC interface, you will need to recover your database. Follow the instructions in the 2.4.2 release notes: https://github.com/ZcashFoundation/zebra/releases/tag/v2.4.2 If you just run the node for consensus and don't use data from the RPC interface, you can ignore this warning.
If you rely on the RPC data, you will need to restore your database. If you have
backed up the state up before upgrading to 2.4.0, you can simply restore the backup
and run 2.4.2 from it. If you have not, you have two options:
- Stop Zebra, delete the state (e.g.
~/.cache/zebra/state/v27/mainnet
and
testnet
too if applicable), upgrade to 2.4.2 (if you haven't already), and
start Zebra. It will sync from scratch, which will take around 48 hours to
complete, depending on the machine specifications. - Use the
copy-state
subcommand to regenerate a valid state.
This will require an additional ~300 GB of free disk size. It is likely that
it will take around the same time as syncing from scratch, but it has the
advantage of not depending on the network.- Stop Zebra.
- Rename the old corrupted state folder, e.g.
mv ~/.cache/zebra ~/.cache/zebra.old
- Copy your current
zebrad.toml
file to azebrad-source.toml
file and edit
thecache_dir
config to the renamed folder, e.g.cache_dir = '/home/zebrad/.cache/zebra.old'
- The
copy-state
command that will be run requires a bigger amount of opened
files. Increase the limit by runningulimit -n 2048
; refer to your OS
documentation if that does not work. - Run the
copy-state
command:zebrad -c zebrad-source.toml copy-state --target-config-path zebrad.toml
. The command will take several hours to
complete.
Fixed
Contributors
Thanks to @ebfull for reporting the bug and helping investigating its cause.
Zebra 2.4.1 - [REMOVED]
This version of Zebra wasn't fully published; it was tagged but the tag was
removed, and it was published on crates.io
but it was yanked. It was not
published on Docker Hub.
We removed it due to a panic that happened during the pre-release validation.
However, we determined that the panic was caused by an external tool (ldb checkpoint
) being used internally to make database backups and it was not a bug
in Zebra.
Zebra 2.4.0 - 2025-07-11 [REMOVED]
Breaking Changes
This release has the following breaking changes:
- This release contains a major database upgrade. It will upgrade an existing
database, automatically moving it from thev26/
folder to a newv27/
folder. However, downgrading is not possible. If you want to keep the
possibility of reverting Zebra in case of an unexpected issue, backup the
v26/
folder before running the upgraded Zebra. Note that the upgrade is slow
and could take several hours or more to complete on smaller machines. Zebra will
operate normally during that time; the only difference is that some RPC
responses might return empty or not accurate data (pool values for arbitrary
block heights and received balances for addresses). - While this was never documented as an option for backups, if you relied on the
ldb checkpoint
tool to generate database backups, be advised that the tool
is no longer supported and will corrupt databases generated or touched by
Zebra 2.4.0 or later releases. - The
debug_like_zcashd
config option for mining is no longer available. It
was not enabled by default; if it is now present in the config file, Zebra
will panic. Simply delete the config option to fix. - The
cm_u
field byte order was fixed ingetrawtransaction
/getblock
response, so if you relied on the wrong order, you will need to fix your
application. - The
zebra-scan
andzebra-grpc
crates are no longer supported and were
removed from the codebase.
Security
- Fix a consensus rule violation in V5 coinbase transactions at low heights. This issue could only occur on Regtest or custom testnets and is now resolved (#9620)
Added
- Implemented deserialization for Zebra's block and transaction types (#9522)
- Update
getaddressbalance
RPC to returnreceived
field (#9295, #9539) - Added a
mempool_change()
gRPC method for listening to changes in the mempool (#9494) - Added
raw_value
feature to serde_json (#9538) - Modified
zebra_network::Config
type to use IPv6 listen_addr by default (#9609) - Added
invalidateblock
andreconsiderblock
RPC methods (#9551) - Updated
(z_)validateaddress
to validate TEX addresses (#9483) - Added a
addnode
RPC method (#9604) - Added missing fields to getrawtransaction (#9636)
- Added value pool balances to
getblock
RPC output (#9432, #9539) - Added support for configuring shielded addresses for mining (#9574)
- Added binding_sig, joinsplit_pub_key and joinsplit_sig fields to
getrawtransaction
/getblock
response (#9652) - Added a method in
zebra-rpc
to allow validating addresses (#9658)
Changed
- Allow Zebra crates to be compiled with alternative versions of their dependencies (#9484)
- Updated README with Arch build patch (#9513)
- Renamed and moved exports in
zebra-rpc
(#9568) - Upgraded DB format to support new fields in RPC outputs (#9539)
- Moved GBT RPCs into the main RPC server (#9459)
- Added a
Nu6_1
variant toNetworkUpgrade
(#9526) - Use zcash_script’s new
Script
trait (#8751) - Removed
debug_like_zcashd
config option (#9627) - Sync all chains in
TrustedChainSync::sync
, addNonFinalizedStateChange
gRPC method (#9654) - Added
prometheus
as a default feature in zebrad (#9677)
Fixed
- Preserve order of RPC output fields (#9474)
- Fixed
cm_u
field byte order ingetrawtransaction
/getblock
response (#9667) - Avoid repeatedly converting transactions to librustzcash types when computing sighashes (#9594)
- Correctly set optional
scriptPubKey
fields of transactions ingetblock
andgetrawtransaction
RPC outputs (#9536) - Allow local outbound connections on Regtest (#9580)
- Allow for parsing
z_gettreestate
output type where optional fields are omitted (#9451)
Removed
- Removed
zebra-scan
andzebra-grpc
(#9683)
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@ala-mode, @arya2, @conradoplg, @elijahhampton, @gustavovalverde, @idky137, @mpguerra, @oxarbitrage, @sellout, @str4d and @upbqdn
Zebra 2.3.0
Zebra 2.3.0 - 2025-05-06
Breaking Changes
- The RPC endpoint is no longer enabled by default in Docker. To enable it,
follow the docs here. - We will no longer be publishing Docker images tagged with the
sha-
orv
prefixes. If you use tags starting with thev
prefix, please update to
images taggedN.N.N
. For example, use2.3.0
instead ofv2.3.0
. If you
need a specific hash, each tag has a digest that you can use instead. - All functionality that used to be guarded by the
getblocktemplate-rpcs
Cargo
feature was moved out, and the feature is no longer present in the codebase.
Note that all release builds following Zebra 1.3.0 had this feature enabled by
default.
Added
- Track misbehaving peer connections and ban them past a threshold (#9201)
- Restore internal miner (#9311)
- Add
reconsider_block
method (#9260) - Add NU7 constants (#9256)
- Add
invalidate_block_method
andinvalidated_blocks
field to non-finalized state (#9167) - Add
Transaction::V6
variants only (#9339)
Changed
- Downgrade verbose info message (#9448)
- Use read-only db instance when running
tip-height
orcopy-state
commands (#9359) - Refactor format upgrades into trait (#9263)
- Remove the
getblocktemplate-rpcs
Cargo feature (#9401) - Improve cache dir and database startup panics (#9441)
Fixed
- Remove a redundant startup warning (#9397)
- Advertise mined blocks (#9176)
- Ensure secondary rocksdb instance has caught up to the primary instance (#9346)
- Use network kind of
TestnetKind
in transparent addresses on Regtest (#9175) - Fix redundant attributes on enum variants (#9309)
RPCs
- Add
time
andsize
fields toTransactionObject
(#9458) - Add inbound peers to
getpeerinfo
response (#9214) - Extend
getinfo
(#9261) - Add fields to
getblockchaininfo
RPC output (#9215) - Add some missing fields to transaction object (#9329)
- Support negative heights in
HashOrHeight
(#9316) - Add verbose support to getrawmempool (#9249)
- Fill size field in getblock with verbosity=2 (#9327)
- Add
blockcommitments
field togetblock
output (#9217) - Accept an unused second param in
sendrawtransaction
RPC (#9242) - Make start and end fields optional and apply range rules to match zcashd (#9408)
- Return only the history tree root in
GetBlockTemplateChainInfo
response (#9444) - Correctly map JSON-RPC to/from 2.0 (#9216)
- Permit JSON-RPC IDs to be non-strings (#9341)
- Match coinbase outputs order in
Getblocktemplate
(#9272)
Docker
- Refactor Dockerfile and entrypoint (#8923)
- Enhance Zebra configuration options and entrypoint logic (#9344)
- Better permission and cache dirs handling in Docker (#9323)
- Allow r/w access in mounted volumes (#9281)
Documentation
- Update examples for running Zebra in Docker (#9269)
- Add architectural decision records structure (#9310)
- Add Mempool Specification to Zebra Book (#9336)
- Complete the Treestate RFC documentation (#9340)
Contributors
@AloeareV, @Metalcape, @PaulLaux, @VolodymyrBg, @aphelionz, @arya2, @conradoplg,
@crStiv, @elijahhampton, @gustavovalverde, @mdqst, @natalieesk, @nuttycom,
@oxarbitrage, @podZzzzz, @sellout, @str4d, @upbqdn and @zeroprooff.
Zebra 2.2.0
Zebra 2.2.0 - 2025-02-05
In this release, Zebra introduced an additional consensus check on the branch ID of Nu6 transactions
(which is currently also checked elsewhere; but we believe it's important to check on its own to protect
against future code changes), along with important refactors and improvements.
Added
- An index to track spending transaction ids by spent outpoints and revealed nullifiers (#8895)
- Accessor methods to zebra-rpc request/response types (#9113)
- getblock RPC method now can return transaction details with verbosity=2 (#9083)
- Serialized NU5 blocks to test vectors (#9098)
Changed
- Migrated from deprecated jsonrpc_* crates to jsonrpsee (#9059, #9151)
- Optimized checks for coinbase transactions (#9126)
- Avoid re-verifying transactions in blocks if those transactions are in the mempool (#8951, #9118)
- Allow transactions spending coinbase outputs to have transparent outputs on Regtest (#9085)
Fixed
- Respond to getblockchaininfo with genesis block when empty state (#9138)
- Verify consensus branch ID in SIGHASH precomputation (#9139)
- More closely match zcashd RPC errors and getrawtransaction RPC behaviour (#9049)
- Fixes bugs in the lightwalletd integration tests (#9052)
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@Fallengirl, @arya2, @conradoplg, @elijahhampton, @futreall, @gustavovalverde, @idky137, @mpguerra, @oxarbitrage, @rex4539, @rootdiae, @sandakersmann and @upbqdn
Zebra 2.1.0
This release adds a check to verify that V5 transactions in the mempool have the correct consensus branch ID;
Zebra would previously accept those and return a transaction ID (indicating success) even though they would
be eventually rejected by the block consensus checks. Similarly, Zebra also now returns an error when trying
to submit transactions that would eventually fail some consensus checks (e.g. double spends) but would also
return a transaction ID indicating success. The release also bumps
Zebra's initial minimum protocol version such that this release of Zebra will always reject connections with peers advertising
a network protocol version below 170,120 on Mainnet and 170,110 on Testnet instead of accepting those connections until Zebra's
chain state reaches the NU6 activation height.
The getblock
RPC method has been updated and now returns some additional information
such as the block height (even if you provide a block hash) and other fields as supported
by the getblockheader
RPC call.
Breaking Changes
- Upgrade minimum protocol versions for all Zcash networks (#9058)
Added
Changed
- Updated
getblock
RPC to more closely match zcashd (#9006) - Updated error messages to include inner error types (notably for the transaction verifier) (#9066)
Fixed
- Validate consensus branch ids of mempool transactions (#9063)
- Verify mempool transactions with unmined inputs if those inputs are in the mempool to support TEX transactions (#8857)
- Wait until transactions have been added to the mempool before returning success response from
sendrawtransaction
RPC (#9067)
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@arya2, @conradoplg, @cypherpepe, @gustavovalverde, @idky137, @oxarbitrage, @pinglanlu and @upbqdn
Zebra 2.0.1
Zebra 2.0.1 - 2024-10-30
- Zebra now supports NU6 on Mainnet. This patch release updates dependencies required for NU6. The 2.0.0 release was pointing to the incorrect dependencies and would panic on NU6 activation.
Breaking Changes
- The JSON RPC endpoint has cookie-based authentication enabled by default. If you rely on Zebra RPC, wou will need to adjust your config. The simplest change is to disable authentication by adding
enable_cookie_auth = false
to the[rpc]
section of the Zebra config file; refer to the docs. (This was added in 2.0.0 but we include here again for clarity)
Changed
- Use ECC deps with activation height for NU6 (#8960)
Zebra 2.0.0 - 2024-10-25 - [YANKED]
This release was intended to support NU6 but was pointing to the wrong version of dependencies which would make Zebra panic at NU6 activation. Use 2.0.1 instead.
Breaking Changes
- The JSON RPC endpoint has cookie-based authentication enabled by default. If you rely on Zebra RPC, wou will need to adjust your config. The simplest change is to disable authentication by adding
enable_cookie_auth = false
to the[rpc]
section of the Zebra config file; refer to the docs. (This was added in 2.0.0 but we included here again for clarity)
Added
- NU6-related documentation (#8949)
- A cookie-based authentication system for the JSON RPC endpoint (#8900, #8965)
Changed
- Set the activation height of NU6 for Mainnet and bump Zebra's current network protocol version (#8960)
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@arya2, @gustavovalverde, @oxarbitrage and @upbqdn.
Zebra 2.0.0-rc.0
Zebra 2.0.0-rc.0 - 2024-10-11
This version is a release candidate for the Zcash NU6 network upgrade on the Mainnet. While this version does not yet include the NU6 Mainnet activation height or current protocol version, all required functionality and tests are in place.
Please note that support for this release candidate is expected to conclude prior to the NU6 activation heights.
Security
- Added Docker Scout vulnerabilities scanning (#8871)
Added
- Added Regtest-only
generate
andstop
RPC methods (#8849, #8839, #8863) - Added fields to
getmininginfo
RPC method response (#8860) - Copied the Python RPC test framework from zcashd into Zebra (#8866)
Changed
- Regtest halving interval to match zcashd and added a configurable halving interval for custom testnets (#8888, #8928)
- Updates post-NU6 Major Grants funding stream address on Mainnet (#8914)
Fixed
- Remove debugging output by default in Docker image (#8870)
- Fixes a typo in configuration file path of the docker-compose file (#8893)
- Return verification errors from
sendrawtransaction
RPC method (#8788) - Respond to getheaders requests with a maximum of 160 block headers (#8913)
- Avoids panicking during contextual validation when a parent block is missing (#8883)
- Write database format version to disk atomically to avoid a rare panic (#8795)
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@arya2, @dismad, @gustavovalverde, @oxarbitrage, @skyl and @upbqdn
Zebra 1.9.0
This release includes deployment of NU6 on Testnet, configurable funding streams on custom Testnets, and updates Zebra's end-of-support (EoS) from 16 weeks to 10 weeks so that it will panic before the expected activation height of NU6 on Mainnet.
It also replaces the shielded-scan
compilation feature with a new zebra-scanner
binary, adds a TrustedChainSync
module for replicating Zebra's best chain state, and a gRPC server in zebra-rpc
as steps towards zcashd deprecation.
Recovering after finalizing a block from a chain fork
Zebra doesn't enforce an end-of-support height on Testnet, and previous versions of Zebra could mine or follow a chain fork that does not
activate NU6 on Testnet at height 2976000. Once a block from a fork is finalized in Zebra's state cache, updating to a version of Zebra that
does expect NU6 activation at that height will result in Zebra getting stuck, as it cannot rollback its finalized state. This can be resolved
by syncing Zebra from scratch, or by using the copy-state
command to create a new state cache up to height 2975999. To use the copy-state
command, first make a copy Zebra's Testnet configuration with a different cache directory path, for example, if Zebra's configuration is at the
default path, by running cp ~/.config/zebrad.toml ./zebrad-copy-target.toml
, then opening the new configuration file and editing the
cache_dir
path in the state
section. Once there's a copy of Zebra's configuration with the new state cache directory path, run:
zebrad copy-state --target-config-path "./zebrad-copy-target.toml" --max-source-height "2975999"
, and then update the original
Zebra configuration to use the new state cache directory.
Added
- A
zebra-scanner
binary replacing theshielded-scan
compilation feature inzebrad
(#8608) - Adds a
TrustedChainSync
module for keeping up with Zebra's non-finalized best chain from a separate process (#8596) - Add a tonic server in zebra-rpc with a
chain_tip_change()
method that notifies clients when Zebra's best chain tip changes (#8674) - NU6 network upgrade variant, minimum protocol version, and Testnet activation height (#8693, 8733, #8804)
- Configurable NU6 activation height on Regtest (#8700)
- Configurable Testnet funding streams (#8718)
- Post-NU6 funding streams, including a lockbox funding stream (#8694)
- Add value pool balances to
getblockchaininfo
RPC method response (#8769) - Add NU6 lockbox funding stream information to
getblocksubsidy
RPC method response (#8742)
Changed
- Reduce the end-of-support halt time from 16 weeks to 10 weeks (#8734)
- Bump the current protocol version from 170100 to 170110 (#8804)
- Track the balance of the deferred chain value pool (#8732, #8729)
- Require that coinbase transactions balance exactly after NU6 activation (#8727)
- Support in-place disk format upgrades for major database version bumps (#8748)
Fixed
- Return full network upgrade activation list in
getblockchaininfo
method (#8699) - Update documentation for the new
zebra-scanner
binary (#8675) - Update documentation for using Zebra with lightwalletd (#8714)
- Reduce debug output for Network on Regtest and default Testnet (#8760)
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@arya2, @conradoplg, @oxarbitrage, @therealyingtong and @upbqdn
Zebra 1.8.0
Zebra 1.8.0 - 2024-07-02
- Zebra now uses a default unpaid actions limit of 0, dropping transactions with
any unpaid actions from the mempool and excluding them when selecting
transactions from the mempool during block template construction. - The
zebrad
binary no longer contains the scanner of shielded transactions.
This meanszebrad
no longer contains users' viewing keys. - Support for custom Testnets and Regtest is greatly enhanced.
- Windows is now back in the second tier of supported platforms.
- The end-of-support time interval is set to match
zcashd
's 16 weeks. - The RPC serialization of empty treestates matches
zcashd
.
Added
- Add an init function for a standalone
ReadStateService
(#8595) - Allow configuring more parameters on custom Testnets and an NU5 activation height on Regtest (#8477, #8518, #8524, #8528, #8636)
- Add default constructions for several RPC method responses (#8616, #8505)
- Support constructing Canopy proposal blocks from block templates (#8505)
Docs
- Document custom Testnets, Regtest and how they compare to Mainnet and the default Testnet in the Zebra book (#8526, #8636)
Changed
- Use a default unpaid action limit of 0 so that transactions with unpaid actions are excluded from the mempool and block templates by default (#8638)
- Lower the mandatory checkpoint height from immediately above the ZIP-212 grace period to immediately below Canopy activation (#8629)
- Use the new
zcash_script
callback API inzebra-script
, allowing Zebra's ECC dependencies to be upgraded independently ofzcash_script
andzcashd
(#8566) - Put Windows in Tier 2 of supported platforms (#8637)
- Remove experimental support for starting the
zebra-scan
in thezebrad
process as a step towards moving the scanner to its own process (#8594) - Reduce the end of support time from 20 weeks to 16 weeks (#8530)
- Restore parts of the experimental
internal-miner
feature for use on Regtest (#8506)
Fixed
- Allow square brackets in network config listen addr and external addr without explicitly configuring a port in the listen addr (#8504)
- Fix general conditional compilation attributes (#8602)
- Update
median_timespan()
method to align with zcashd implementation (#8491)
upbqdn marked this conversation as resolved. - Allow custom Testnets to make peer connections (#8528)
- Refactor and simplify the serialization of empty treestates to fix an incorrect serialization of empty note commitment trees for RPCs (#8533)
- Fix port conflict issue in some tests and re-enable those tests on Windows where those issues were especially problematic (#8624)
- Fix a bug with trailing characters in the OpenAPI spec method descriptions (#8597)
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@arya2, @conradoplg, @gustavovalverde, @oxarbitrage and @upbqdn
Zebra 1.7.0
Zebra 1.7.0 - 2024-05-07
In this release we introduce Regtest functionality to Zebra and restored Windows support. Also adjusted our Zebra release interval from 2 weeks to 6 weeks approximately.
Added
- Preparing for upstream
zcash_client_backend
API changes (#8425) - Regtest support (#8383, #8421, #8368, #8413, #8474, #8475)
- Allow Zebra users to contribute to the P2P network even if behind NAT or firewall (#8488)
Changed
- Adjust estimated release interval to once every 6 weeks and the end of support from 16 to 20 weeks (#8429)
Fixed
- Bump zcash script v0.1.15 and restore Windows support (#8393)
- Avoid possibly returning data from different blocks in
z_get_treestate
RPC method (#8460) - Zebra panics with all features and no elasticsearch server available (#8409)
Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
@arya2, @oxarbitrage and @upbqdn