Skip to content

Update to librustzcash 0.30/0.10 cohort (zcash_primitives 0.30.0) - #1428

Open
schell wants to merge 19 commits into
zingolabs:devfrom
zodl-inc:update/librustzcash-0.24.0-rc.4
Open

Update to librustzcash 0.30/0.10 cohort (zcash_primitives 0.30.0)#1428
schell wants to merge 19 commits into
zingolabs:devfrom
zodl-inc:update/librustzcash-0.24.0-rc.4

Conversation

@schell

@schell schell commented Jul 27, 2026

Copy link
Copy Markdown

What

Bumps zaino's librustzcash dependencies to the 0.30/0.10 cohort used by zallet's
update/librustzcash-0.24.0-rc.4 branch:

crate from to
zcash_keys 0.15 0.16
zcash_primitives 0.29 0.30
zcash_transparent 0.9 0.10
orchard (resolved) 0.15.0 0.15.3

Zebra dependency

The zebra deps are consumed from crates.io at the first librustzcash
0.30/0.10 releases, which Zebra has now published:

crate version librustzcash cohort
zebra-chain 11.3 0.30
zebra-state 12.0.1 0.30
zebra-rpc 15.0 0.30

(11.2 / 12.0 / 14.0 on crates.io are still the older librustzcash 0.29/0.9
builds.) No [patch.crates-io] override is required.

Test-only changes (not version semantics)

Two small fixes surfaced by running the suite; both are independent of the
librustzcash version bump itself:

  • chain_index tests: init_tracing() made idempotent. Many tests in the same
    binary install the global tracing dispatcher (only allowed once per process);
    subsequent tests panicked with SetGlobalDefaultError. The already-set error
    is now ignored so every test can request tracing init.
  • proptest_blockgen: zebra-chain 11.3 now generates V6 transactions for NU6.3
    natively, so the #[should_panic] tripwire tracking the old upstream gap is
    removed — exactly as its in-source comment prescribes when a zebra upgrade
    closes that gap.

Verification

  • cargo check --workspace — clean.
  • cargo test -p zaino-state --lib -j1 — 214 passed, 0 failed.

zancas and others added 18 commits July 1, 2026 08:21
zainod        0.4.2 → 0.5.0
zaino-state   0.3.1 → 0.4.0
zaino-common  0.2.0 → 0.3.0
zaino-serve   0.3.1 → 0.4.0
zaino-fetch   0.2.1 → 0.3.0
zaino-proto   0.1.3 (unchanged)
…-0.5.0

Bump crate versions for 0.5.0 release
The [patch.crates-io] block pinned all three zebra crates to an
unreleased ZcashFoundation/zebra rev (9a27f88) for the struct-variant
NonFinalizedBlocksListener API. Zaino passed an empty known_chain_tips
set, making the call functionally identical to the released unit-variant
API. Revert to the published crates.io zebra-state 9.0.1 / zebra-chain
10.1.0 / zebra-rpc 10.0.1 so the workspace can be published.
Patch-level bump for the zebra git-patch removal hotfix.
…t-patch

Drop unreleased zebra git patch; use crates.io releases
The published zaino-proto 0.1.3 on crates.io has zebra-state = "8.0.0"
behind its `heavy` feature (default-on). When cargo publish verifies
zaino-state, it resolves zaino-proto from crates.io — pulling
zebra-state 8.0.0 alongside zaino-state's own zebra-state 9.0.1,
causing a type conflict. Bumping zaino-proto ensures the published
version carries the workspace-resolved zebra-state ^9.0 dep.
…oto-for-publish

Bump zaino-proto 0.1.3 → 0.1.4 for crates.io publish chain
Advance rc/0.6.0 to dev for 0.6.0-rc.3
zaino-common    0.2.0             → 0.4.0-rc.3
zaino-fetch     0.2.1             → 0.4.0-rc.3
zaino-proto     0.1.3             → 0.2.0-rc.3
zaino-serve     0.3.1             → 0.5.0-rc.3
zaino-state     0.3.1             → 0.5.0-rc.3
zainod          0.4.3-ironwood.1  → 0.6.0-rc.3

Workspace dependency version pins updated to match.
Merge rc/0.6.0 into stable and bump all crate versions to their
final stable form:

  zaino-common    0.4.0-rc.3  → 0.4.0
  zaino-fetch     0.4.0-rc.3  → 0.4.0
  zaino-proto     0.2.0-rc.3  → 0.2.0
  zaino-serve     0.5.0-rc.3  → 0.5.0
  zaino-state     0.5.0-rc.3  → 0.5.0
  zainod          0.6.0-rc.3  → 0.6.0

Resolves stable/rc divergence from the 0.5.1 hotfix commits that
were never backported to dev (zebra git patch removal, version bumps).
Bump the librustzcash dependencies and align the Zebra crates with the
same cohort, matching zallet's `update/librustzcash-0.24.0-rc.4` branch:

- zcash_keys       0.15 -> 0.16
- zcash_primitives 0.29 -> 0.30
- zcash_transparent 0.9 -> 0.10
- orchard resolves to 0.15.3 (required by zcash_primitives 0.30 for the
  new `new_with_anchor_deferred`/`add_spend_unwitnessed` builder API)

The released zebra-* crates on crates.io are built against the 0.29/0.9
librustzcash cohort. To expose the 0.30/0.10 types through zebra-chain /
zebra-state / zebra-rpc, patch them to ZcashFoundation/zebra#11111
(zcash_primitives 0.30.0) head until a Zebra release ships that update.

Test-only fixes, both pre-existing or upstream-prescribed and unrelated
to the version bump itself:

- chain_index tests: make init_tracing() idempotent. Many tests in the
  same binary set the global tracing dispatcher, which can only be
  installed once per process; the second caller panicked with
  SetGlobalDefaultError. Ignore the already-set error.
- proptest_blockgen: zebra-chain 11.2 now generates V6 transactions for
  NU6.3 natively, so remove the #[should_panic] tripwire that tracked the
  old upstream gap (the in-source comment directs this removal on such an
  upgrade).

cargo check --workspace is clean; cargo test -p zaino-state --lib is
green (214 passed, 0 failed).
schell added a commit to zcash/zallet that referenced this pull request Jul 27, 2026
Move the zaino backend onto the librustzcash 0.30/0.10 dependency cohort to
match the rest of the workspace, and onto zaino 0.5, replacing the previous
pin to zingolabs/zaino `dev`.

The zaino crates are patched to the zodl-inc/zaino branch
`update/librustzcash-0.24.0-rc.4` (zingolabs/zaino#1428), which bumps zaino to
the same librustzcash 0.30/0.10 versions and carries the Ironwood (NU6.3) note
commitment treestate needed for spendable Ironwood notes. The zebra crates are
in turn pinned (here and by that zaino branch) to ZcashFoundation/zebra#11111
head, since the librustzcash-0.30 zebra builds (chain 11.2 / state 12.0 /
rpc 14.0) are not yet released on crates.io; this resolves the two-zebra-state
librocksdb-sys conflict by unifying on a single copy of each zebra crate.

Code changes for the zaino 0.3 -> 0.5 API redesign (zaino ADR 0003):
- `ChainIndexConfig::new` is now a struct literal whose `network` is a
  `zebra_chain::parameters::Network`; the old payload-carrying
  `zaino_common::Network` is gone. Both the indexer config and the
  `State` validator connector now take the runtime network from the existing
  `network_to_zebra` helper, so the `network_to_zaino` converter is removed.
- `get_spendable_transparent_outputs` (zcash_client_backend 0.24.0-rc.4)
  gained a `lock_filter` argument; the sync spend-detection path passes
  `LockFilter::Unfiltered` so locked outputs are not mistaken for spent ones.

The wallet-critical librustzcash crates (orchard 0.15.3, shardtree 0.7.0,
zcash_note_encryption 0.4.1, zcash_primitives 0.30.0, zcash_transparent
0.10.0, ...) resolve identically to the root workspace lockfile, preserving
the three-workspace lockstep invariant.

Verified: `cargo check --all-targets` clean for root, backends/zebra and
backends/zaino; `cargo clippy --all-targets` and `cargo fmt --check` clean in
backends/zaino; `cargo test` in backends/zaino green.

Co-Authored-By: ai-ron <noreply@zodl.com>
@schell
schell marked this pull request as ready for review July 27, 2026 23:41
Zebra has now published the librustzcash 0.30/0.10 cohort to crates.io, so
drop the temporary [patch.crates-io] git pins to ZcashFoundation/zebra#11111
and consume the released versions instead:

- zebra-chain 11.2 -> 11.3 (first 0.30-cohort release)
- zebra-state 12.0 -> 12.0.1
- zebra-rpc    14.0 -> 15.0

(11.2 / 12.0 / 14.0 on crates.io are still the older librustzcash 0.29/0.9
builds; 11.3 / 12.0.1 / 15.0 are the first built against 0.30/0.10.)

cargo check --workspace is clean; cargo test -p zaino-state --lib is green
(214 passed, 0 failed).
schell added a commit to zcash/zallet that referenced this pull request Jul 28, 2026
Zebra has now published the librustzcash 0.30/0.10 cohort to crates.io, so
drop the temporary [patch.crates-io] git pins to ZcashFoundation/zebra#11111
and consume the released versions instead:

- zebra-chain 11.2 -> 11.3
- zebra-state 12.0 -> 12.0.1
- zebra-rpc    14.0 -> 15.0

(11.2 / 12.0 / 14.0 on crates.io are still the older librustzcash 0.29/0.9
builds; 11.3 / 12.0.1 / 15.0 are the first built against 0.30/0.10.) This also
removes the dependency on a draft Zebra PR.

The zaino pin moves to the matching zodl-inc/zaino branch commit d2d06bdd,
which itself now uses the released zebra crates (zingolabs/zaino#1428). The
zaino crates remain a git pin because zaino 0.5 is not yet released on
crates.io.

Verified: cargo check --all-targets clean; cargo clippy --all-targets
-D warnings and cargo fmt --check clean; cargo test green. Wallet-critical
librustzcash crates resolve identically to the root lockfile (lockstep
preserved); a single zebra-state 12.0.1 is used.

Co-Authored-By: ai-ron <noreply@zodl.com>
nuttycom added a commit to zcash/zallet that referenced this pull request Jul 28, 2026
Adapts to the API changes between the pinned librustzcash rev
(0531f9d8) and the released 0.24.0-rc.4 / 0.22.0-rc.4 crates, and
drops the [patch.crates-io] blocks now that those releases have
shipped.

zcash_client_backend gained advisory output locking, which reshapes
several traits that `DbConnection` forwards to `WalletDb`:

- `InputSource`'s selection methods take a `LockFilter`. Zallet takes
  no locks, so every call site is behaviour-preserving today; the
  filter each passes reflects what the call site means rather than
  what is currently observable. The reporting RPCs (`z_listunspent`,
  `z_getnotescount`) pass `Unfiltered`, since a locked output is still
  an unspent output the wallet holds. `z_shieldcoinbase`'s eligible-UTXO
  enumeration passes the selector's default `Exclude`, because its
  result is subtracted from the proposal's selected inputs and so must
  mirror the candidate set the selector drew from.
- `WalletWrite` gained `lock_outputs`, `unlock_output`,
  `clear_locked_outputs` and `prune_scan_queue_below`; `WalletRead`
  gained `get_wallet_recover_until`; `WalletCommitmentTrees` gained
  the three `get_*_subtree_root` accessors. All are forwarded to
  `WalletDb`, including the Ironwood accessor, whose trait default
  would otherwise hide the tree this connection does maintain.
- `propose_transfer` and `propose_shielding_coinbase` take
  `lock_inputs`. Both call sites pass `None`: each builds, signs and
  stores its transaction within a single operation, and Zallet exposes
  no RPC by which a caller could release a lock stranded by an
  operation that failed partway through.

The backend manifests carry the identical version bumps, as the
lockstep invariant requires, and their `orchard` pins are advanced to
0.15.3 (0.15.4 needs a newer MSRV than the pinned 1.88) for the
`Builder` APIs zcash_primitives 0.30 calls.

WIP: `utils/check-lockstep.sh` still fails. Removing the shared
[patch.crates-io] git rev un-collapsed Zebra's librustzcash stack from
the wallet's, and no published zebra-* or zaino-* tracks the 0.30
line, so both backend graphs now carry a second, older copy
(zcash_primitives 0.29, zcash_keys 0.15, zcash_proofs 0.29,
zcash_transparent 0.9) reachable only through zebra-*/zaino-*.
Everything reachable from `zallet-core` — the whole wallet-database
path — is byte-identical across all three graphs, so the invariant
the check exists to protect does hold; the check compares whole-
lockfile version sets and cannot currently express that. Resolving it
needs either forks of zebra and zaino on the 0.30 line, or a narrowing
of the check to the wallet-reachable subgraph. That decision is left
open here.

backends/zaino: update to zaino 0.5 / zcash_primitives 0.30 cohort

Move the zaino backend onto the zcash_primitives 0.30/0.10 dependency cohort to
match the rest of the workspace, and onto zaino 0.5, replacing the previous
pin to zingolabs/zaino `dev`.

The zaino crates are patched to the zodl-inc/zaino branch
`update/librustzcash-0.24.0-rc.4` (zingolabs/zaino#1428), which bumps zaino to
the same librustzcash 0.30/0.10 versions and carries the Ironwood (NU6.3) note
commitment treestate needed for spendable Ironwood notes. The zebra crates are
in turn pinned (here and by that zaino branch) to ZcashFoundation/zebra#11111
head, since the librustzcash-0.30 zebra builds (chain 11.2 / state 12.0 /
rpc 14.0) are not yet released on crates.io; this resolves the two-zebra-state
librocksdb-sys conflict by unifying on a single copy of each zebra crate.

Code changes for the zaino 0.3 -> 0.5 API redesign (zaino ADR 0003):
- `ChainIndexConfig::new` is now a struct literal whose `network` is a
  `zebra_chain::parameters::Network`; the old payload-carrying
  `zaino_common::Network` is gone. Both the indexer config and the
  `State` validator connector now take the runtime network from the existing
  `network_to_zebra` helper, so the `network_to_zaino` converter is removed.
- `get_spendable_transparent_outputs` (zcash_client_backend 0.24.0-rc.4)
  gained a `lock_filter` argument; the sync spend-detection path passes
  `LockFilter::Unfiltered` so locked outputs are not mistaken for spent ones.

backends/zebra: update to zebra-state 0.12 / zcash_primitives 0.30

Zebra has now published the librustzcash 0.30/0.10 cohort to crates.io, so
drop the temporary [patch.crates-io] git pins to ZcashFoundation/zebra#11111
and consume the released versions instead:

- zebra-chain 11.2 -> 11.3
- zebra-state 12.0 -> 12.0.1
- zebra-rpc    14.0 -> 15.0
nuttycom added a commit to zcash/zallet that referenced this pull request Jul 28, 2026
Adapts to the API changes between the pinned librustzcash rev
(0531f9d8) and the released 0.24.0-rc.4 / 0.22.0-rc.4 crates, and drops
the [patch.crates-io] blocks that carried that rev in all three
manifests, now that those releases have shipped.

zcash_client_backend gained advisory output locking, which reshapes
several traits that `DbConnection` forwards to `WalletDb`:

- `InputSource`'s selection methods take a `LockFilter`. Zallet takes
  no locks, so every call site is behaviour-preserving today; the
  filter each passes reflects what the call site means rather than
  what is currently observable. The reporting RPCs (`z_listunspent`,
  `z_getnotescount`) pass `Unfiltered`, since a locked output is still
  an unspent output the wallet holds. `z_shieldcoinbase`'s eligible-UTXO
  enumeration passes the selector's default `Exclude`, because its
  result is subtracted from the proposal's selected inputs and so must
  mirror the candidate set the selector drew from.
- `WalletWrite` gained `lock_outputs`, `unlock_output`,
  `clear_locked_outputs` and `prune_scan_queue_below`; `WalletRead`
  gained `get_wallet_recover_until`; `WalletCommitmentTrees` gained
  the three `get_*_subtree_root` accessors. All are forwarded to
  `WalletDb`, including the Ironwood accessor, whose trait default
  would otherwise hide the tree this connection does maintain.
- `propose_transfer` and `propose_shielding_coinbase` take
  `lock_inputs`. Both call sites pass `None`: each builds, signs and
  stores its transaction within a single operation, and Zallet exposes
  no RPC by which a caller could release a lock stranded by an
  operation that failed partway through.

The backend manifests carry the identical version bumps, as the
lockstep invariant requires. Their `orchard` requirement is unchanged
at 0.15.0, but the locked version advances 0.15.0 -> 0.15.3 for the
`Builder` APIs zcash_primitives 0.30 calls; 0.15.4 is held back because
it needs a newer MSRV than the pinned 1.88.

`utils/check-lockstep.sh` passes: every crate it tracks, and so the
whole wallet-database path, resolves identically across all three
lockfiles.

Vetting the new dependency versions adds `[[trusted]]` entries to the
shared supply-chain/audits.toml for the zebra-* and tower-* publishers,
whose crates only the backend graphs contain. cargo-vet annotates each
`user-id` with a `# Name (login)` comment that it resolves solely from
the current workspace's imports.lock, which in turn holds publishers
only for crates in that workspace's own graph; the root workspace
therefore strips the annotations the backends write, and no single
checked-in rendering satisfies all three `cargo vet --locked` runs. The
audits workflow now normalises the store with `cargo vet fmt` before
vetting, and keeps enforcing formatting on the per-workspace
config.toml and imports.lock, which that normalisation would otherwise
mask.

backends/zaino: update to zaino 0.5 / zcash_primitives 0.30 cohort

Move the zaino backend onto the zcash_primitives 0.30/0.10 dependency cohort to
match the rest of the workspace, and onto zaino 0.5 (zaino-state 0.3.1 ->
0.5.0), replacing the previous pin to zingolabs/zaino `dev`.

The zaino crates are patched to the zodl-inc/zaino branch
`update/librustzcash-0.24.0-rc.4` (rev d2d06bdd, zingolabs/zaino#1428), which
bumps zaino to the same librustzcash 0.30/0.10 versions and carries the
Ironwood (NU6.3) note commitment treestate needed for spendable Ironwood notes;
an empty frontier conflicts with the wallet's advancing tree and sync fails with
`CheckpointConflict`. Repoint at upstream zaino once it (and the NU6.3 work)
lands in a release. The zebra crates are consumed from crates.io at the
librustzcash 0.30/0.10 versions, so this backend needs no zebra [patch] either.

Code changes for the zaino 0.3 -> 0.5 API redesign (zaino ADR 0003):
- `ChainIndexConfig::new` is now a struct literal whose `network` is a
  `zebra_chain::parameters::Network`; the old payload-carrying
  `zaino_common::Network` is gone. Both the indexer config and the
  `State` validator connector now take the runtime network from the existing
  `network_to_zebra` helper, so the `network_to_zaino` converter is removed.
- `get_spendable_transparent_outputs` (zcash_client_backend 0.24.0-rc.4)
  gained a `lock_filter` argument; the sync spend-detection path passes
  `LockFilter::Unfiltered` so locked outputs are not mistaken for spent ones.

backends/zebra: update to zebra-state 12 / zcash_primitives 0.30

Zebra has published the librustzcash 0.30/0.10 cohort to crates.io, so both
backends consume the released versions directly rather than a git pin:

- zebra-chain 11.1.0 -> 11.3.0
- zebra-state 10.1.0 -> 12.0.1
- zebra-rpc   11.0.0 -> 15.0.0 (11.1.0 -> 15.0.0 in the zaino graph)

Co-Authored-By: Schell Carl Scivally <efsubenovex@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants