github ZcashFoundation/zebra v7.0.0-rc.0
Zebra 7.0.0-rc.0

4 hours ago

This release candidate supports the NU7 network upgrade on Testnet, which
activates at height 4,465,026, expected around October 6th. Mainnet node
operators are not required to upgrade. We encourage Testnet operators to run
this release to test the network upgrade.

Breaking Changes

  • getblocktemplate removes transactions and prevblock from its advertised mutable list in ordinary builds, retaining only time. Its required coinbase depends on the selected transactions and parent; miners must request a new template instead of changing those independently. (#11496, #11530)
  • Ordinary builds use database format v29.0.0 with the NSM value-pool field. Its registered upgrade automatically moves compatible v28 state into state/v29 when no v29 database exists, without resyncing. Legacy records remain readable with a zero NSM balance; new writes use the wider layout. Retain a v28 backup before upgrading for rollback: disabling state.delete_old_database does not preserve the directory that the upgrade moves. Upgrade direct database readers, including Zallet's Zebra backend and Zaino's Zebra read-state backend, to v29-compatible builds together with the node; v28 readers cannot read the wider records. Manual directory renames or symlinks are not a substitute for the supported upgrade (#11530).
  • Invalid custom subsidy schedules, funding address periods, and insufficient funding-recipient addresses are now rejected during configuration loading. Previously accepted configurations with early spacing upgrades, such as NU6 at height 1 with the default slow-start interval, can exceed the monetary cap; set slow_start_interval = 0 for accelerated test networks. Valid streamless networks can still use short halving intervals. Supply enough addresses or explicitly enable funding-address extension when changing upgrade heights. (#11529)
  • Explicitly empty funding-stream lists disable defaults on configured Testnets and survive configuration round-trips, as they already did on Regtest. Testnet and Regtest reject combining an empty list with either legacy funding field; remove both legacy fields to disable streams, or omit the empty list to retain legacy payouts. Omitted settings retain network defaults, and legacy post-NU6 streams use post-NU6 defaults independently of the pre-NU6 field. (#11527)
  • Incompatible configured Testnets reject public Testnet magic even when public seeds are omitted. Public seed matching now ignores hostname case, trailing dots, and ports. Configure distinct network_magic and non-public peers for incompatible consensus rules. (#11527)
  • Custom Testnets isolate state, non-finalized backups, and peer caches by network name and wire magic. Existing unsuffixed custom-network caches are not reused: resynchronize after upgrading. Reserved names are case-insensitive; public-network and Regtest paths are unchanged. (#11527)
  • Public and custom Testnet mining now requires synchronization. Unlike Mainnet, a synchronized Testnet can resume mining from a tip older than 125 minutes. Networks with Proof-of-Work disabled bypass synchronization and freshness checks. (#11529)
  • Custom networks with nonzero genesis transparent outputs exclude those unspendable outputs from issued supply. Rebuild any existing state created with the old accounting, including experimental v29 state; public-network genesis balances are unchanged (#11530).
  • Activate NU7 on public Testnet at height 4,465,026. The adjusted third halving is at 4,497,948, and NSM reissuance begins at 7,305,222. Explicit public-Testnet activation schedules without NU7 and the old funding-stream end height 4,476,000 are rejected; remove those consensus overrides from [network.testnet_parameters] to inherit the updated public defaults. Custom networks must use distinct network_magic and non-public peers. No Mainnet activation height is set yet (#11554).
  • Reject Testnet and Regtest funding-stream configurations whose nonempty height ranges overlap after NU7 defaults are applied. Use disjoint ranges; adjacent and empty ranges remain accepted, including empty recipient lists with automatic address extension (#11554).
  • Reject TEX funding-stream recipients on Testnet and Regtest before startup rather than failing when mining a coinbase. Configure P2SH or P2PKH recipients instead; deferred recipients do not require addresses (#11554).

Added

  • Halving-preserving NU7 issuance is enabled in ordinary builds: from the configured NSM reissuance height, each block reissues a fraction of the parent NSM reserve, rounded up, in addition to its scheduled subsidy. Mainnet activation and reissuance heights remain unassigned (#11454, #11530).
  • initial_nsm_value_balance and nsm_reissuance_height are available under [network.testnet_parameters] for Regtest and configured Testnets without experimental flags. The configured initial balance, in zatoshis, is seeded at NU7 activation. Omitting the reissuance height uses ZIP 237's scheduled-issuance crossover; set an explicit height for accelerated testing. Existing private chains that started reissuance at NU7 must explicitly retain that height or restart from before activation (#11530).

Changed

  • Use the ZIP 259 NU7 consensus branch ID 0x77190AD9 for v5 and v6 transactions instead of placeholder branch IDs. (#11527)
  • ZIP 259 NU7 peer-version checks require 170180 on Testnet and Regtest and 170190 on Mainnet. Zebra advertises 170180 until a Mainnet activation height is scheduled. (#11527)
  • ZIP 218 NU7 difficulty calculations preserve integer rounding and the proof-of-work limit over 102 blocks without overflowing on Testnet targets, including the initial averaging-window boundary. Mining-template minimum-difficulty timestamps follow the candidate upgrade: six target spacings before NU7 and eighteen from NU7, requiring a Testnet gap strictly greater than 450 seconds under the approved amendment in zips#1382. (#11529)
  • Block-template transaction selection applies the same NU7 shielded-action limits as block validation and reserves the coinbase budget before selecting mempool transactions, including Sapling coinbases.
  • getnetworksolps selects the 17- or 102-block averaging window for nonpositive block counts using the effective height in the same state snapshot, including requests above the current tip.
  • getblocktemplate reports the negative collected miner fees in coinbasetxn.fee, excluding the NSM contribution from NU7 onward. Non-coinbase transaction fees remain gross. Cached responses distinguish gross fee totals that round to the same miner payout. (#11496)
  • Configured networks calculate first-halving heights with the slow-start shift applied once, including halvings before Blossom.
  • Configured networks must include fixed lockbox disbursements even when the block subsidy is zero.
  • getnetworksolps returns an RPC error instead of panicking when the estimated solution rate exceeds its supported integer range.
  • Chain-tip height estimates correctly cross block-spacing upgrades when estimating earlier or later timestamps, including fractional times before the known tip.
  • Block templates honor network-specific median-time rules and the local two-hour future limit, including cached and on-demand work after clock rollback. Long polls notify miners once when a live timestamp range expires; polling the same already-expired work waits for a change rather than causing a busy loop. Cached Testnet difficulty respects the candidate-height rules, and empty timestamp ranges return an error. (#11529)
  • Custom-network configurations reject out-of-order explicit upgrade heights even when equal heights previously hid the mismatch. Configure upgrades in nondecreasing height order.
  • Regtest configurations preserve coincident upgrade activation heights when serialized and loaded again, rather than moving early upgrades to default heights.
  • Mining and peer freshness checks retain their elapsed-time allowances across NU7, rather than becoming three times stricter with 25-second blocks.
  • getblocktemplate.transactions[].depends reports each selected parent transaction once, using its 1-based position in the returned template.
  • NU7 uses ZIP 218's 25-second target block spacing and triples the remaining halving intervals, dividing scheduled block rewards by three to preserve issuance per unit of time. ZIP 207 likewise triples the remaining partial funding-address period, then uses 105,000-block periods on the public schedule. Canonical ZIP 214 revision-2 streams active at NU7 end at the adjusted third halving; expired streams remain expired and explicit custom ranges are preserved.
  • NU7 enforces ZIP 218 limits of 330 actions per Orchard or Ironwood pool, 300 Sapling inputs plus outputs, and zero Sprout JoinSplits per block. Orchard actions + Ironwood actions + Sapling inputs and outputs + twice the JoinSplit count share a global budget of 330.
  • Experimental ZFuture networks reject v4 transactions under ZIP 2003. Before upgrading a ZFuture chain that contains them, reset both its finalized state and non-finalized backups. Public networks are unaffected. (#11528)
  • Regtest skips public DNS seeders before resolving initial peers, while retaining explicitly configured local peers. (#11527)
  • Late coinbase builds no longer replace cached entries for a newer height or subsidy context. The bounded cache retains zero-fee sizing work during fee changes. (#11530)
  • getblocksubsidy rejects heights above the consensus limit before reading state or computing subsidy. (#11530)
  • ZIP 2008 rotates the Mainnet FPF recipient from t3cFfPt1Bcvgez9ZbMBFWeZsskxTkPzGCow to the P2PKH address t1MkHnkxVjNpNbCrSs3AJ8J7ZSp6NTYiUcG at the first address period after the period containing the last pre-NU7 block. Funding-output validation accepts the assigned P2PKH recipient. Mainnet NU7 activation remains unassigned. (#11527)
  • From NU7, mempool admission rejects transactions that individually exceed a ZIP 218 shielded block budget before state lookup or proof verification, without penalizing the sending peer (#11529).
  • NU7 seeds the public Mainnet and Testnet reserves with their historical pre-NU6 shortfalls: 36,858,445,520 and 55,768,414,957 zatoshis. Renaming Testnet or changing its checkpoints preserves the omitted seed with public Testnet magic. Explicitly matching that seed leaves network identity and state paths unchanged. Regtest and private networks with distinct magic default to zero; an isolated chain copied from public Testnet must configure its historical seed explicitly (#11530).
  • Return an invalid-parameter error for malformed Orchard receivers in z_listunifiedreceivers rather than returning an unusable address (#11530).
  • getstandardfee on Mainnet reports 5000 zatoshis per logical action until the next block is at height 3,590,000, and 1000 from then on, following the deployment schedule in zcash/zips#1352, so wallets switch to the lower fee together after nodes that drop it reach end of support. Test networks report 1000 at every height. The mempool still accepts 1000 zatoshis per logical action (#11557).

Fixed

  • End of support heights and the sync progress stall warning now follow the target block spacing in force at each height, so a release whose support window straddles the NU7 activation height still halts after the intended number of days, and pre-NU7 stall warnings keep the 75-second interval (#11483).
  • Mempool peers are no longer scored for relaying transactions with the adjacent network upgrade's consensus branch ID around any activation height, including NU7; the grace window keeps its 50-minute length under 25-second blocks (#11100, #11563).
  • Testnet and Regtest peer routing and mempool readiness no longer recalculate the default Testnet NSM schedule on each network identity check (#11554).

Don't miss a new zebra release

NewReleases is sending notifications on new releases.