Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
8780e94
Rename `makers test` set `package` -> `packages`
zancas Jul 2, 2026
9923aaa
added ChainIndexRpcExt trait to split functionality not required by z…
idky137 Jul 2, 2026
abbeb86
move methods into chain_index / blockchainsource pt 1
idky137 Jul 2, 2026
c7671b8
move methods into chain_index / blockchainsource pt 2 - get_block / g…
idky137 Jul 2, 2026
2a4df3f
move methods into chain_index / blockchainsource pt 2 - get_block_deltas
idky137 Jul 3, 2026
4b2c231
move methods into chain_index / blockchainsource - get_difficulty
idky137 Jul 3, 2026
91c3772
move methods into chain_index / blockchainsource - proxy methods
idky137 Jul 3, 2026
68cb4fb
move methods into chain_index / blockchainsource - validate address
idky137 Jul 3, 2026
179feab
move methods into chain_index / blockchainsource - blockchain info
idky137 Jul 3, 2026
60a8dc2
move methods into chain_index / blockchainsource - subtree roots
idky137 Jul 3, 2026
511fe58
move methods into chain_index / blockchainsource - mempool
idky137 Jul 3, 2026
9c697ee
moved last split functionality out of indexerservices
idky137 Jul 3, 2026
c158d4e
Merge branch 'dev' into test_tool_update
zancas Jul 3, 2026
6a06967
Merge pull request #1362 from zingolabs/feat/ironwood_nu6_3
zancas Jul 5, 2026
6d838c0
merged fetchservice and stateservice into unified NodeBackedIndexerSe…
idky137 Jul 5, 2026
3bf2c27
Merge remote-tracking branch 'origin/dev' into move_functionality_int…
idky137 Jul 5, 2026
ec44cff
refactor(zaino-common): DRY logging and activation-height conversions
zancas Jul 5, 2026
7d19e0e
build(zaino-common): drop unused deps thiserror, nu-ansi-term, hex
zancas Jul 5, 2026
24c31aa
fix: install rustls CryptoProvider explicitly and pin provider to ring
zancas Jul 4, 2026
13163ea
build: drop unnecessary rustls "std" feature from zaino-common
zancas Jul 4, 2026
30681b9
ci: report advisory publish dry-run failures as warnings, not a red X
zancas Jul 4, 2026
90522a2
docs: ADR-0006 — prefer aws-lc-rs CryptoProvider; start CONTEXT.md gl…
zancas Jul 5, 2026
a62dcd3
build: prefer aws-lc-rs CryptoProvider with post-quantum key exchange
zancas Jul 5, 2026
94cccea
fix(workbench): satisfy clippy manual_pattern_char_comparison
zancas Jul 5, 2026
5e4d45e
make persistent db validation wait on migration
idky137 Jul 6, 2026
9385878
Merge pull request #1366 from zingolabs/debug_1360
zancas Jul 6, 2026
b155101
fixed ironwood migration
idky137 Jul 6, 2026
8c2378b
Merge branch 'dev' into dry_zaino_common
zancas Jul 7, 2026
7180e3c
feat!: enforce the Validator as the sole source of activation-height …
zancas Jul 7, 2026
d445446
test(e2e): wallet-tier Ironwood activation suite on the transition fi…
zancas Jul 7, 2026
c6ec679
test: enforce the Ironwood boundary invariants at its edges, and on t…
zancas Jul 7, 2026
888d0cc
build(makers): add an ironwood set to the test front door
zancas Jul 7, 2026
8aeb2d3
fix(e2e): position the boundary cells from the observed tip and pin t…
zancas Jul 7, 2026
6402edd
test(zaino-fetch): pin the verbosity-2 getblock transaction-object sh…
zancas Jul 7, 2026
576b72d
fix(zaino-fetch): deserialize verbosity-2 getblock transaction objects
zancas Jul 7, 2026
d3538cf
Merge branch 'dev' into fix_ironwood_db_migration
zancas Jul 7, 2026
17df071
Merge pull request #1379 from zingolabs/fix_ironwood_db_migration
zancas Jul 7, 2026
1c8249c
Merge pull request #1376 from zingolabs/ironwood_demos
zancas Jul 7, 2026
d634327
Merge branch 'dev' into fix_getblock_verbosity_2
zancas Jul 7, 2026
d1d3551
Merge branch 'dev' into move_functionality_into_blockchainsource
zancas Jul 7, 2026
63dc84c
refactor(state): apply ironwood-migration polish from review of #1379
zancas Jul 7, 2026
933c52c
Merge branch 'dev' into heights_from_validator
zancas Jul 7, 2026
083ced1
test!: expect derived Sapling keys from z_validateaddress on all conn…
zancas Jul 8, 2026
5f2ac73
fix(zaino-state): preserve typed error causes across the BlockchainSo…
zancas Jul 8, 2026
fd322a1
fix(zaino-state): keep the typed RpcError on sendrawtransaction hex r…
zancas Jul 8, 2026
39053f1
fix(zaino-state)!: return Option from chaintip_update_subscriber inst…
zancas Jul 8, 2026
dfc6d98
fix(zaino-state): replace the getaddressdeltas tip unwrap with a type…
zancas Jul 8, 2026
e094e56
fix(zaino-state): make the service teardown safe off the multi-thread…
zancas Jul 8, 2026
61d1192
fix(zaino-state): omit multi-address outputs from getblockdeltas again
zancas Jul 8, 2026
d198d9d
fix(zaino-state): proxy getchaintips to the validator while still syn…
zancas Jul 8, 2026
0d62a5a
fix(zaino-state): resolve tip-relative getblock heights, keep the -8 …
zancas Jul 8, 2026
493032b
fix(zaino-state): never let the source syncer task outlive its chain …
zancas Jul 8, 2026
06fd01f
test(zaino-state): pin the getblockheader raw-to-wire serde round-trip
zancas Jul 8, 2026
8048bf8
Merge pull request #1361 from zingolabs/move_functionality_into_block…
zancas Jul 9, 2026
064b177
fix: wait for the validator's first block in the connector spawn paths
aphelionz Jul 9, 2026
b93daac
Merge pull request #1389 from aphelionz/fix_startup_no_blocks_crash_loop
zancas Jul 9, 2026
144da39
Merge pull request #1355 from zingolabs/test_tool_update
nachog00 Jul 9, 2026
a1a4431
Merge branch 'dev' into fix_getblock_verbosity_2
nachog00 Jul 9, 2026
1cfc75f
Merge pull request #1381 from zingolabs/fix_getblock_verbosity_2
nachog00 Jul 9, 2026
0460df6
Merge branch 'dev' into ironwood_migration_polish
nachog00 Jul 9, 2026
72695a2
Merge pull request #1384 from zingolabs/ironwood_migration_polish
nachog00 Jul 9, 2026
bddf4ad
Merge branch 'dev' into dry_zaino_common
zancas Jul 9, 2026
86f9303
build: bump zcash_local_net to the tip of infrastructure PR #278
zancas Jul 9, 2026
c9f9524
Merge pull request #1371 from zingolabs/dry_zaino_common
nachog00 Jul 9, 2026
2185ab6
Merge branch 'dev' into heights_from_validator
zancas Jul 9, 2026
0789c36
Merge branch 'dev' into heights_from_validator
zancas Jul 9, 2026
4285738
build: record zaino-common's rustls dependency in the lockfile
zancas Jul 9, 2026
5bc7180
refactor: derive the adoption plumbing from the mirror macro
zancas Jul 9, 2026
ef3ed37
feat: verify the public-network schedule against the validator at spawn
zancas Jul 9, 2026
0713cfb
refactor!: name The Public Testnet exactly, everywhere it is meant
zancas Jul 9, 2026
5ecfe71
style: clear the two outstanding clippy warnings
zancas Jul 9, 2026
c94ae24
Merge pull request #1375 from zingolabs/heights_from_validator
zancas Jul 9, 2026
46c5e93
bump deps
zancas Jul 13, 2026
1a795db
build(zainod): drop the unused zebra-chain dependency
zancas Jul 13, 2026
1e255d0
build: advance ZEBRA_VERSION to the 6.0.0 final release
zancas Jul 13, 2026
483a6ca
build: remove unused dependency edges across the workspace
zancas Jul 13, 2026
46d18c6
build: demote test-only dependencies to dev-dependencies
zancas Jul 13, 2026
4141a5d
feat(test-runner): add a packages row and per-suite timing to the sum…
zancas Jul 13, 2026
2f3541a
fix(ci): refresh the trixie apt pins the point release superseded
zancas Jul 13, 2026
45ed68d
refactor(test-runner): measure wall-clock time with Instant, not outp…
nachog00 Jul 13, 2026
642a405
Merge pull request #1394 from zingolabs/bump_deps
zancas Jul 13, 2026
dda8497
fix(ci): make publish dry-run advisory for PRs targeting rc/stable
nachog00 Jul 13, 2026
bf6101d
Merge pull request #1398 from zingolabs/fix/publish-dry-run-advisory-…
zancas Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env.testing-artifacts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# zcashd Git tag (https://github.com/zcash/zcash/releases)
ZCASH_VERSION=6.20.0

ZEBRA_VERSION=6.0.0-rc.0
ZEBRA_VERSION=6.0.0

# zcash-devtool git ref (https://github.com/zingolabs/zcash-devtool) —
# the wallet client driven by wallet-tests via zcash_local_net, built
Expand Down
45 changes: 21 additions & 24 deletions .github/workflows/publish-dry-run.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,11 @@ jobs:
publish-dry-run:
name: cargo publish --dry-run
runs-on: ubuntu-latest
# Blocking context (pushes to rc/** or stable, and PRs targeting them):
# this job MUST pass. Advisory context (everything else): findings inform
# but the run stays green. Keep this predicate the exact inverse of the
# "Compute check mode" step below — job-level continue-on-error cannot
# read step outputs, so the two encode the same rule twice.
continue-on-error: >-
${{
github.event_name == 'pull_request'
&& !startsWith(github.base_ref, 'rc/')
&& github.base_ref != 'stable'
|| github.event_name != 'pull_request'
&& !startsWith(github.ref_name, 'rc/')
&& github.ref_name != 'stable'
}}
# Blocking context: direct pushes to rc/** or stable — the branch is in
# release-prep state and must publish cleanly. Advisory context: everything
# else, including PRs that *target* rc/** or stable. Those PRs carry
# unbumped dev code; version bumps happen on the RC branch after merge, so
# a publish failure at PR time is expected, not actionable.
steps:
- name: Checkout repository
uses: actions/checkout@v7
Expand All @@ -37,11 +28,12 @@ jobs:
- name: Compute check mode
id: mode
run: |
# Inverse of the job's continue-on-error predicate above.
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
target="${{ github.base_ref }}"
else
if [[ "${{ github.event_name }}" == "push" ]]; then
target="${{ github.ref_name }}"
else
# PRs (including those targeting rc/** or stable) are always
# advisory — they carry pre-bump code by design.
target=""
fi
if [[ "$target" == rc/* || "$target" == stable ]]; then
echo "mode=blocking" >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -96,13 +88,18 @@ jobs:
echo "============================================"
echo ""
echo "The workspace does not publish cleanly as a set. Common causes:"
echo " - a [patch.crates-io] override pulling in unreleased upstream code"
echo " - a [patch.crates-io] override pulling in unreleased upstream"
echo " code (published crates cannot depend on unpublished revisions)"
echo " - a dependency on a git revision or path outside the workspace"
echo " - a crate that does not compile from its packaged form"
echo " - new cross-crate API or features that exist in the workspace but"
echo " not in the published dependency; resolved by the version bump +"
echo " publish of that dependency at the next release"
echo ""
if [[ "${{ steps.mode.outputs.mode }}" == "advisory" ]]; then
echo "::warning::publish dry-run failed — the workspace would not release cleanly. Advisory on this branch, but it must be resolved before the next release."
exit 0
fi
echo "::error::publish dry-run failed — the workspace would not release cleanly."
exit 1
fi

- name: Annotate on failure (advisory context only)
if: failure() && steps.mode.outputs.mode == 'advisory'
run: |
echo "::warning::publish dry-run failed — the workspace would not release cleanly. This must be resolved before the next release."
40 changes: 40 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,46 @@ and this library adheres to Rust's notion of
## Unreleased

### Changed
- `zaino-state`: `FetchService` and `StateService` are merged into a single
generic `NodeBackedIndexerService<Source>` (module
`zaino_state::indexer::node_backed_indexer`; the former `backends` module is
gone). The validator connection is now selected at runtime rather than by type:
`NodeBackedIndexerServiceConfig { common, connection }` carries a
`ValidatorConnectionType` of either `Rpc` (JSON-RPC, formerly `Fetch`) or
`Direct(DirectConnectionConfig)` (Zebra `ReadStateService`, formerly `State`).
The per-backend `Fetch/StateServiceConfig`, `Fetch/StateServiceError`, and
`BackendConfig` types are replaced by `NodeBackedIndexerServiceConfig`,
`NodeBackedIndexerServiceError`, and `ValidatorConnectionType`.
- **Breaking** — config: `zainod.toml`'s `backend` selector is renamed
`state` → `direct` and `fetch` → `rpc`. The legacy `"state"` / `"fetch"`
values are still accepted as aliases, so existing config files keep working.
- `zaino-state`: the `ChainIndex` trait is split into `ChainIndex` (the
wallet-essential core: chain/tx/address/mempool access) and a
`ChainIndexRpcExt: ChainIndex` extension (compact-block serving, subtree
roots, and the block-explorer / mining / node-passthrough RPCs). The split is
a provisional first pass to be refined into finer capability traits later.
- `zaino-state`: all remaining backend-split RPC functionality has moved out of
the `FetchService` (`JsonRpSeeConnector`) and `StateService`
(`ReadStateService`) backends and into `BlockchainSource` /
`ChainIndex`. Both backends now resolve every fetch through their `ChainIndex`
indexer — building responses from Zaino's own indexed state where possible and
delegating to the `ValidatorConnector` (`BlockchainSource`) only for
validator-only or passthrough data. Validator connection/syncer spawning also
moves into `ValidatorConnector::spawn_fetch` / `spawn_state`, so each
service/subscriber now holds only `{ indexer, data, config }`. This readies
the two backends for their eventual merge into a single
`ValidatorBackedIndexerService`. No behaviour change.
- TLS: zaino now installs rustls's **aws-lc-rs** CryptoProvider as its
preferred process-level default (was ring) and enables rustls's
`prefer-post-quantum` feature, so the X25519MLKEM768 hybrid key exchange
leads zaino's outbound handshakes (ADR-0006). Installation remains
first-install-wins: an embedder that installs a provider before zaino
keeps its choice.

### Deprecated
- Classical TLS key exchange (X25519, SECP256R1, SECP384R1) is deprecated:
still offered and accepted for wallet compatibility, slated for refusal
once major wallet stacks negotiate hybrid key exchange (ADR-0006).
- **Breaking** — config: `storage.database.sync_write_batch_bytes` (bytes) is
renamed to `sync_write_batch_size` and given in **GiB** (default raised from
4 GiB to 32 GiB); this budget now also bounds the txout-set accumulator
Expand Down
67 changes: 67 additions & 0 deletions CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,70 @@ its packaged content differs. The tree cannot be released until that crate's
version is bumped. An unchanged crate keeping its published version is not a
violation.
_Avoid_: stale version, forgotten bump

### Chains and networks

**The Public Testnet**:
The public Zcash test network, and only that. Its regimes are
non-hermetic — state is shared with other participants, and an epoch
the public chain has left (e.g. pre-NU6.3 once NU6.3 activates there)
cannot be re-entered. Always this exact phrase in prose; identifiers
use `the_pub_testnet` and types use `PubTestnet`.
_Avoid_: bare "Testnet"/"testnet", and especially "testnet" for any
locally-launched chain, even one launched under a testnet network kind

**Regtest net**:
A hermetic, locally-launched chain whose activation heights the
launcher chooses. Every hermetic local net is a regtest net, whatever
network-kind flag it runs under.
_Avoid_: local testnet, custom testnet

### Pools and upgrades

**Ironwood / Orchard (era naming)**:
Eras, fixtures, and predicates that speak of shielded pools are named by
pool — Orchard, Ironwood — and a name that mentions one pool pairs with
the other pool's name, never with the upgrade's. **NU6.3** names only the
network upgrade itself: activation heights, consensus branch ID,
consensus rules.
_Avoid_: mixing vocabularies in one name or one sibling set (e.g. an
`ORCHARD_ONLY_*` fixture whose sibling is `NU6_3_ACTIVE_*` — the sibling
is `IRONWOOD_ONLY_*`)

**Cross-address restriction**:
The post-NU6.3 rule the Orchard Action circuit enforces: "(g_d, pk_d)
of the output note must equal (g_d, pk_d) of the spent note" — the
output note must carry the same expanded receiver (diversified base
g_d, diversified transmission key pk_d) as its spent note, so each
Orchard action is either change to the spent note's own address or a
withdrawal (positive value balance). Orchard-to-Orchard transfers to
any other address — including another address of the same wallet — are
prohibited. A companion transaction-level rule forbids new value
entering the pool. Source:
<https://zcash.github.io/ironwood/design/action-circuit.html#the-cross-address-restriction>
_Avoid_: "exit-only" (overclaims — same-receiver change still lands in
the pool and its commitment tree still grows)

### TLS and cryptography

**Preferred CryptoProvider**:
The TLS cryptography provider zaino installs as the process-wide default
when no provider is installed yet. A preference, not a mandate: an
embedder (e.g. zallet) that installs a provider before zaino keeps its
choice, and zaino handshakes through it.
_Avoid_: "enforced provider" (implies zaino overrides an embedder's
already-installed provider; it never does)

**Hybrid key exchange**:
A TLS 1.3 key-exchange group combining a classical curve with a
post-quantum KEM (key-encapsulation mechanism), e.g. X25519MLKEM768.
Secure if either component holds. Hybrids are the post-quantum
deployment vehicle, not a classical fallback.
_Avoid_: calling hybrids "classical" because they contain a classical
component

**Classical key exchange**:
A key-exchange group with no post-quantum component (X25519, SECP256R1,
SECP384R1). Deprecated in zaino: still accepted for client
compatibility, slated for refusal once major wallet stacks negotiate
hybrids.
Loading
Loading