Added
- Added the ZIP 218 per-block shielded action limits at NU7. From the configured
NU7 activation height onwards, blocks may contain at most 330 Orchard actions,
330 Ironwood actions, 300 Sapling spends plus outputs, no Sprout JoinSplits,
and a global shielded cost of 330 where each JoinSplit counts twice.
getblocktemplateonly selects transactions that fit these limits. Networks
without an NU7 activation height follow today's consensus
(#1027,
#1041). - Rejected mempool transactions whose own shielded actions exceed a ZIP 218
per-block limit, with misbehavior score 100, because no block can include
them. ZIP 218 does not specify this rejection
(#1027). - Set the ZIP 218 Sprout JoinSplit limit to zero instead of the 25 the ZIP
names. ZIP 2003 disallows version 4 transactions at NU7, and only version 2,
3, and 4 transactions can contain JoinSplits, so no block at or after NU7 can
contain one (#1027). - Recycle 60% of aggregate transaction fees into NSM from NU7 activation in
every build. Round the contribution down once per block and require the
coinbase to claim the remaining fees. Mining templates use the
same split, and their coinbasefeereports only the fees collected by the
miner (#1056). - Added ZIP 218 "25-second Block Target Spacing" rules at NU7. From the
configured NU7 activation height onwards, the rules apply a 25-second block
target spacing, a 102-block difficulty averaging window, and a block subsidy
divided by the spacing ratio. Networks without an NU7 activation height keep
their existing consensus rules (#1066,
superseding #851). - Seeded the NSM balance before NU7 and rejected negative balances from NU7,
with matching database migration and configurable initial balances
(#1070). - Verified reissuance rewards using the actual parent's NSM balance, with
matching checkpoint funding, rollback, replay, and migration checks
(#1073). - Used parent NSM balances in mining templates, coinbase rewards, and subsidy
RPCs after reissuance activation
(#1074). - Added
network.zakura.nat_traversalto opt in to QUIC NAT traversal with
native peers. It remains disabled by default; enabling it allows candidate
address exchange and UDP probes but does not enable relays or external
discovery (#968). - Added block download and commit byte counters and apply queue depth to the
existing continuous-sync samples for Dual and Zakura-only runs. The retained
data can be used to generate charts
(#984). getblockchaininfonow reports the ZIP 234 NSM value balance as
nsmValueBalanceZat, so the counter can be observed and monitored. It is
reported beside the monetary totals rather than inside them, so summing
valuePoolsstill yields the money supply
(#1106).
Changed
- Extended v1.5.0 Mainnet support through approximately October 25, with the
last supported height at 3,528,681
(#1121). - Updated the common libraries to
1.3.0-alpha.1, including the removal of
unused experimental ZIP 233 fields
(#1042). - Retain 112 predecessor headers below the finalized anchor and backfill older
validation contexts at startup, preparing storage for a wider difficulty window
while preserving current consensus rules
(#1045). - Track signed issuance deficits from NU7 and migrate existing databases to format 29. Backfill only NU7 activation onward, leaving historical records unchanged when NU7 is unscheduled or the tip precedes activation. The counter excludes pre-NU7 funds and monetary totals. Older binaries require a pre-upgrade cache or a separate sync. (#1052).
- Every build rejects version 4 transactions from the NU7 activation height
(ZIP 2003). Mainnet and default Testnet remain unscheduled;
#1059 tracks their
activation heights (#1060). - Set the NU7 peer protocol versions to the ZIP 204 values: 170180 on Testnet
and Regtest, and 170190 on Mainnet
(#998,
#1060). - Scaled target-spacing-dependent node timing at NU7, including Testnet mining,
RPC work estimation, sync and gossip lookahead, near-tip detection, stall
warnings, and checkpoint progress hints
(#1066). - Reduced block commit latency by checking retained non-finalized headers in
memory instead of reading each header from disk
(#1069). - Reduced block commit latency by skipping unused non-finalized UTXO snapshots
for blocks without transparent prevout spends
(#1076). - Derive the initial NSM balance from local chain state without RPC, and check
public-network seeds against the measured values. Configured networks derive
their seed unless an explicit override is supplied, including zero. Reject
configured schedules whose derived seed cannot fit the stored balance, and
repair the seed row when an interrupted migration resumes under new settings
(#1077). - Derive NSM reissuance activation from the configured NU7 height using the
spacing-aware third-halving crossover. Leave reissuance inactive when NU7 is
unset or no qualifying crossover exists
(#1082). - Header-chain startup treats network-policy digest changes as diagnostic.
Startup audits stored data under the configured policy, warns, and updates
the digest automatically after a successful audit
(#1085). - Upgraded native P2P to Iroh 1.1 through the published Zakura compatibility
crates and noq 1.2 while retaining the existing
published Zcash cryptographic dependencies and network defaults. Native peers
now require protocol 2; mixed old/new dual-stack peers retain legacy TCP, while
native-only peers require the same transport cohort
(#935). - A configured native UDP port that is already occupied now fails startup
instead of silently binding another port. Native endpoints bind only the
configured address family, and automatic router port mapping is disabled
(#935). - Keep the connection and unrelated services running when a persistent native
P2P stream write times out
(#943). - Trusted secondary nodes carry the primary's block receipt order and reset it
when the primary process changes, preparing them for first-received mining.
A primary restart temporarily lowers the secondary's reported height to its
finalized tip while it reloads recent blocks
(#1102). - Bump
zakura-stateto 9.0.0 for the dedicated checkpoint handoff request and
response variants. Consumers with exhaustive state request or response matches
must handle the new variants
(#972). - Reduced header transition work by limiting checkpoint checks to affected
heights
(#1018). - Reduced checkpoint finalization work when updating the retained header height
(#1019). - Reduced sync header processing work when the selected chain is unchanged
(#1030). - Reduced block commit latency by validating transparent spends against
borrowed non-finalized UTXO indexes instead of cloning the complete UTXO set
(#1109). Streamdeclares each stream's payload limits, message types, queue depths,
and write policy as fields, replacing fourServicehooks
(#1115).- Updated the Zakura Common (
zakura-core/common) crates from1.3.0-alpha.1
to2.0.0, replacing the upstreamzcash_protocol,zcash_address, and
zcash_transparentdependencies with thezakura-protocol,zakura-address,
andzakura-transparentforks
(#1144). - Set the NU7 consensus branch ID to
0x77190AD9from ZIP 259, replacing the
test-only placeholder; NU7 remains unscheduled on Mainnet and Testnet
(#1144).
Removed
- Removed the temporary
nu7/nu7-experimentalbuild feature from
zakura-consensusandzakurad. NU7 rules activate by height in every build
(#958,
#997,
#1060). - Remove the explicit
nsm_reissuance_heightconfiguration override; networks
with NU7 configured use the calculated crossover
(#1082). - Removed the
state.contextual.unspent_utxo_snapshot.duration_secondsand
state.contextual.mined.unspent_utxo_snapshot.duration_secondsmetrics
because transparent spend validation no longer creates UTXO snapshots
(#1109).
Fixed
- Fixed funding-stream address-period calculations on configured Testnets whose
funding-stream range begins before the first address-period anchor
(#1007). - Fixed fork recovery rejecting replacement blocks using size estimates from
another branch (#1020). - Avoided generating an extra shielded coinbase proof while assembling block
templates, reducinggetblocktemplatelatency for shielded mining addresses
(#1035). - Fixed the end-of-support halt and
getdeprecationinfoestimate to follow
target-spacing changes, preserving the configured support duration across
network upgrades
(#1043). - Correct halving-height estimates on custom networks where a halving occurs
before Blossom, counting the slow-start shift once
(#1046). - Reject non-positive custom halving intervals and intervals that overflow when
converted to target seconds, preventing panics or incorrect halving indices
(#1046). - Use the candidate height for the Testnet mining-template minimum-difficulty
heuristic and derive node timing estimates and limits from the target-spacing
schedule, preserving the current NU7 spacing and averaging window
(#1047). - Preserved the existing 28-header difficulty-context API while allowing
callers to supply the wider retained context needed for NU7
(#1048). - Preserve deferred funding during slow-start rollback and legacy database replay on configured
networks. (#1049). - Limit format-29 Deferred checks to balance changes from the NU7 baseline onward, rejecting inconsistent replay/commit histories without auditing the absolute historical balance. Skip all backfill work when NU7 is unscheduled or has not activated, avoiding unnecessary startup scans and resync requirements on configured networks. (#1052).
- Mark wider retained header validation contexts with a new database format and
report finalized-state divergence before attempting context repair at startup
(#1062). - Fixed Regtest to derive its first halving height from its target spacings, so
funding-stream recipient rotation remains aligned with subsidy halvings after
NU7 (#1066). - Fixed network-height estimates and near-tip detection windows across block
target spacing changes
(#1068). - Bounded the NSM subsidy parent lookup, preserved negative-balance errors, and
moved mining template proof construction off RPC workers with a shared
concurrency limit, including long-poll and recovery templates
(#1074). - Kept empty templates with precomputed coinbases out of the proof queue so tip
changes can return work while another proof build runs
(#1087). getblocktemplaterebuilds a template whose parent changed while it was being
built (a new block, an equal-height reorg, or a concurrent caller selecting the
new tip first) instead of returning atemplate parent changed; retryerror
that made miners drop their current job
(#1088).getblocktemplatenow rebuilds a superseded template in its fallback-recovery
path instead of returning a transient error, so miners keep receiving work when
the chain tip moves during proposal validation
(#1090).- Wake idle internal mining solvers when new work arrives instead of waiting out
a 20-second sleep
(#1094). - Mainnet mempool activation and crawling require both near-tip sync throughput
and a local-clock estimate that the chain tip is within 100 blocks of the
network tip. The estimate adds a freshness check when peer starvation produces
zero-length sync rounds. An active mempool disables when the estimate exceeds
the 1000-block rollback window. The mempool only scores transaction verification
failures against peers while the estimate is within 100 blocks and verification
used the current tip height. Branch-ID and lock-time mismatches no longer
penalize mempool peers. Test networks bypass the clock estimate so sparse mining
does not disable their mempools. The crawler yields while waiting for a fresh
tip. Subscribers receive invalidation events when the mempool disables
(#27). - Prevented continuous-sync canaries from treating a valid Mainnet block gap
as a stalled node by requiring an exact local header backlog before applying
the stall deadline
(#846). - Reported continuous metrics failures as unavailable status evidence instead
of misclassifying them as sync stalls
(#846). - Stopped a dual-stack run as soon as legacy fallback takes over block sync,
and named the handoff as the failure reason instead of reporting missing
header evidence
(#846). - Required exact committed heights from both nodes before the cluster monitor
treats peer advancement as sync-stall evidence
(#846). - Retained native per-IP admission limits across concurrent connections to the
same identity, and disabled the new QUIC NAT traversal address exchange and
peer-directed probes
(#935). - Dual-stack checkpoint sync can recompute from current commitment trees when
compatible native peers cannot supply VCT metadata. Nodes already using frozen
VCT trees still wait for authenticated metadata
(#935). - Reduced header-fetch waits during integrated chain sync by preparing a
checkpoint-sized prefix when admitted block work is running low
(#938). - Prevent checkpoint verification stalls when the verifier rejects a side-chain
block while the state commits a verified checkpoint range, or when a canceled
caller drops recovery from a failed state commit
(#939). - Prevent sync restart loops after transient UTXO lookup and post-checkpoint
verification timeouts by retrying affected blocks while parent commits finish.
Wait up to two minutes for pending commits before accepting duplicate blocks,
reject forged checkpoint-handoff heights, and avoid overflow with high custom
checkpoints. Report bodies that fail their transaction Merkle root as payload
mismatches before checking the coinbase height. Reject and score missing inputs
proven against any committed parent, before and after the UTXO wait. Drop
blocks whose parent is neither committed nor in flight without restarting sync
(#940). - Keep native P2P session setup and recovery responsive under congestion, and
release stream capacity safely when sessions end
(#943). - Reject disallowed messages and malformed buffered responses even after a
session fails, while preserving block download stall penalties without
penalizing local delays
(#943). - Settle outgoing GetBlocks request ownership exactly once across expiry,
cancellation, and reset, including requests still queued for transport.
Return every unsent height immediately when any part of a queued request
expires, preserving received bodies and replacement requests. Discard
already-committed heights during request cleanup after a forward reset.
Retire requests skipped or expired before writing without charging the peer
for an unanswered probe or timeout, including floor watchdog avoidance.
Retire queued requests immediately when a competing body makes them unwritable,
preserving the received body and returning the remaining unsent work.
Give initial probes and queued responses time to arrive from slow peers,
while preserving the shorter floor rescue deadline for measured peers in
both byte-count and block-count modes
(#944). - Preserve the first invalid-block verdict when another invalid verdict arrives
with different evidence or a different rule
(#948). - Refuse to resume an interrupted VCT sync on the legacy P2P stack, with a
diagnostic identifying the required configuration
(#948). - Allow read-only access to an interrupted VCT database when checkpoint sync,
VCT fast sync, or native P2P is disabled
(#948). - Return an error from
getblocktemplatewhen the state cannot supply a complete
difficulty window
(#948). - Fixed pruned nodes advertising block bodies they no longer retain to native
block-sync peers, including after restarts and further pruning
(#966). - Fixed native sync stalling after its only VCT auxiliary supplier temporarily
replies busy. Retry that supplier after its next valid status, even when its tip
is unchanged, while keeping other suppliers available. Clear temporary retry
history on disconnect or session replacement so a reconnected supplier can be
used immediately. Rotate suppliers after successful repairs and refusals so each
waiting peer gets a fair turn.
Keep serving unchanged header paths while the node syncs, with coherent page
snapshots and finalized metadata matched to the requested branch. Resolve
ancestry outside commit locks and stop at the requested locator so small header
requests do not stall state transitions while scanning the retained graph.
Peer serving leases no longer prevent old forks from being pruned to admit a
better-work branch. Release serving capacity before returning each page so idle
peers cannot keep all general serving slots between requests. Reuse bounded
continuation indexes so small pages do not repeat ancestry lookups
(#970). - Fixed incomplete committed-payload reporting after block-sync queue cleanup.
Continuous-sync runs enable accurate accounting through the opt-in
sync-metricsfeature, with stable sampling windows for detailed commit rates.
Native continuous-sync runs retain progress samples every 10 seconds.
Normal builds omit the commit-byte counter
(#986). - Fixed a panic when a build without an NU7 consensus branch ID adds an NU7
activation block to the history tree. The block now fails to commit with
HistoryTreeError::MissingBranchId. VCT verification preserves this local
error without rejecting peer deliveries. Startup rejects stored snapshots
that require a missing branch ID before exposing the database. The format
check also reports snapshot decoding errors. Fallible primitive history tree constructors
reject upgrades without a branch ID
(#998). - Fixed
getblockchaininfoand other ZEC-valued RPC responses failing to parse
with "loss of precision parsing ZEC value", which affected roughly one in
seven value pool balances and became constant after NU7
(#1105). - Keep sync moving after the final checkpoint when full-verification blocks are
already queued and no further state requests arrive, without reporting a
committed block as failed if the handoff notification is delayed
(#972). - Prevent semantic children from ending checkpoint sync before the configured
boundary and disabling further checkpoint writes
(#972). - Reject Regtest configurations with insufficient mandatory checkpoints during
configuration parsing instead of panicking during startup or block validation
(#972). - Fixed block-sync pauses when provider latency estimates expire, so ready blocks
are requested promptly (#1006). - Keep newly accepted forks available for extension at the retention limit and
allow evicted blocks to be downloaded again. Clear stale header verification
records after normal commits and reconsideration. Preserve shared transaction
outputs when removing a fork so pending block verification can continue
(#1104).
This release also ships Mainnet release state up to height 3,490,665.