Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
2003aa2
cargo update
zancas Jul 3, 2026
3d45603
refactor: drop bip0039 and json deps, shrink lockfile 172->154
zancas Jul 3, 2026
19c702c
refactor: DRY block submission into zebra_rpc::submit_template_block
zancas Jul 3, 2026
3648aec
refactor: DRY the daemon launch path and shared parsing helpers
zancas Jul 3, 2026
40738ec
refactor: DRY Drop impls and accessors with in-repo macro_rules
zancas Jul 3, 2026
d16eb09
feat!: gate the legacy stack (zcashd + lightwalletd) behind non-defau…
zancas Jul 4, 2026
757f7fb
build: drop three low-value dev/build dependencies, lockfile 158 -> 142
zancas Jul 4, 2026
a6af852
bump toolchain
zancas Jul 4, 2026
226149d
docs: stamp CHANGELOG 0.7.0 and backfill the zebra-excision entries
zancas Jul 4, 2026
0b38b6e
docs: note the 1.95 -> 1.96 toolchain bump in the 0.7.0 CHANGELOG
zancas Jul 4, 2026
678cff9
feat!: activate NU6.3 across the regtest stack, harden the zebrad con…
zancas Jul 5, 2026
c57a346
feat: consume ironwood_spendable from devtool balance --json
zancas Jul 5, 2026
0dc4a51
test: assert shield value lands in the ironwood pool
zancas Jul 5, 2026
78511f7
feat!: make the Validator the sole source of activation-height truth,…
zancas Jul 7, 2026
fa2da0b
feat: allocate listener ports deterministically and add an Indexer-co…
zancas Jul 7, 2026
2a82fa6
fix: approve zingo_consensus::NetworkKind for the public API
zancas Jul 7, 2026
34fce91
fix: name the convergence test so binary-less CI filters it out
zancas Jul 7, 2026
1eb4966
chore: delete dead and duplicated shell scripts
zancas Jul 7, 2026
1a7b573
feat: port the trailing-whitespace check to a Rust workbench crate
zancas Jul 7, 2026
66df2cf
ci: cache the cargo build in the trailing-whitespace workflow
zancas Jul 7, 2026
8c3089e
feat: port the justfile recipes into the workbench crate
zancas Jul 7, 2026
c797ed2
feat!: define the Wallet abstraction the harness actuates generically
zancas Jul 8, 2026
f6a2af5
Merge pull request #280 from zingolabs/add_zingo_cli
zancas Jul 8, 2026
63b31a0
feat(zcash_local_net): add LocalNet::from_parts to expose the indexer…
zancas Jul 9, 2026
1a7bb7e
feat(zcash_local_net)!: publish front proxies as the canonical endpoints
zancas Jul 9, 2026
85502cd
fix(ci): exclude process-spawning test binaries by binary_id, not name
zancas Jul 9, 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
15 changes: 11 additions & 4 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,14 @@ fail-fast = false

[profile.ci]
fail-fast = false
# devtool_client excluded until CI provisions the zcash-devtool binary in
# test.yaml (the tests arrived with add_client_support and have never had
# their binary in the runner image).
default-filter = 'not (test(zebra) | test(zaino) | test(devtool_client))'
# These test binaries spawn real zcashd/zebrad/zainod/lightwalletd/devtool
# processes, which the CI image does not provide. Exclude by binary_id, not
# by test-name substring: name filters both missed binary-requiring tests
# with unconventional names and silently hid pure unit tests that happened
# to mention a binary in their name.
default-filter = '''
not (
binary_id(zcash_local_net::integration)
| binary_id(regtest-launcher::e2e)
)
'''
9 changes: 3 additions & 6 deletions .github/workflows/ci-pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,18 @@ jobs:
- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Install just
uses: extractions/setup-just@v2

- name: Install cargo-binstall
uses: taiki-e/install-action@v2
with:
tool: cargo-binstall

- name: Install cargo-check-external-types
# Pinned to match PINNED_NIGHTLY (nightly-2025-10-18, rustdoc JSON
# format 56). 0.5.0 requires format 57; bump both together.
# Pinned to match PINNED_NIGHTLY in workbench/src/main.rs (nightly-2025-10-18,
# rustdoc JSON format 56). 0.5.0 requires format 57; bump both together.
run: cargo binstall cargo-check-external-types@0.4.0 -y --force

- name: Run checks
run: just check-external-types
run: cargo +nightly-2025-10-18 run --release -p workbench -- check-external-types

reject-trailing-whitespace:
uses: ./.github/workflows/trailing-whitespace.yaml
Expand Down
8 changes: 1 addition & 7 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -57,19 +57,13 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v6

- name: create binaries dir
run: mkdir -p ./test_binaries/bins

- name: Symlink lightwalletd and zcash binaries
run: ln -s /usr/bin/lightwalletd /usr/bin/zcashd /usr/bin/zcash-cli ./test_binaries/bins/

- name: Download archive
uses: actions/download-artifact@v6
with:
name: nextest-archive

- name: Run tests
run: |
cargo nextest run --verbose --profile ci --retries 2 -E 'not binary_id(regtest-launcher::e2e)' --archive-file nextest-archive.tar.zst \
cargo nextest run --verbose --profile ci --retries 2 --archive-file nextest-archive.tar.zst \
--workspace-remap ./ ${{ env.NEXTEST-FLAGS }}

5 changes: 4 additions & 1 deletion .github/workflows/trailing-whitespace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,8 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v6

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Reject trailing whitespace
run: ./utils/trailing-whitespace.sh reject
run: cargo run --release -p workbench -- trailing-whitespace reject
93 changes: 93 additions & 0 deletions CONTEXT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# infras

Test infrastructure for the Zcash ecosystem: harnesses that launch and drive
local Zcash networks (validators, indexers, clients) for integration testing.

## Language

**Validator**:
A full-node process that maintains chain state and serves the node RPC
(zebrad, or legacy zcashd).
_Avoid_: node, daemon, full node

**Indexer**:
A process that consumes a Validator's data and serves the light-client
gRPC protocol (zainod, or legacy lightwalletd).
_Avoid_: proxy, server

**Wallet**:
A light-client process the harness manages alongside the Validator and
Indexer: restored from a seed, synced through an Indexer, driven to
send and shield, and queried for balances and addresses. The harness
actuates every Wallet through one generic interface; each
implementation lives with its own binary (zcash-devtool, zingo-cli).
_Avoid_: client (the superseded name), lightclient

**Legacy stack**:
zcashd (Validator) and lightwalletd (Indexer). Opt-in only, scheduled for
simultaneous removal; neither is part of the harness's future.
_Avoid_: deprecated components, old stack

**Core stack**:
zebrad (Validator) and zainod (Indexer) — the components the harness is
built around and that survive Legacy-stack removal.
_Avoid_: new stack, default stack

**Compatibility conf**:
The `zcash.conf`-format file lightwalletd parses to discover its backend
Validator. Owned by the Legacy stack: zcashd uses it as its own process
config, and zebrad produces one only to serve lightwalletd. Dies with the
Legacy stack.
_Avoid_: zcashd config (when the lightwalletd-facing file is meant)

**Devtool contract**:
The behavioral interface the harness relies on from the zcash-devtool
binary: its CLI surface, its output formats, and the activation-heights
schema. A process boundary pinned by tests against the real binary — never
a Cargo dependency.
_Avoid_: devtool API, devtool dependency

**Canonical heights**:
The single regtest activation-heights shape the harness ships as its
default for launching Validators, validates, and golden-tests: every
network upgrade the Devtool contract knows about activates at height 2.
Exactly one shape exists per release; it advances in lockstep when a new
upgrade is adopted, and older shapes live only in older releases. Any
other shape is configured on the Validator alone; every other component
receives [[Validator heights]].
_Avoid_: all-at-2 (informal), custom heights, partial activation

**Front**:
The transparent TCP relay that is the canonical public endpoint of one
Backend listener. It binds `127.0.0.1:0` before the Backend starts,
every published port and address accessor returns it, and the
Backend's real endpoint is never published — so all clients, the
harness's own launch-time clients included, cross the Front for the
Backend's entire networked lifetime. A Front carries at most one
registered observer; with none it is pure passthrough.
_Avoid_: proxy (bare), tap (the observer is the tap; the Front is the
endpoint)

**Backend**:
A managed network service as the Front machinery sees it: start/stop
lifecycle, log access for readiness parsing, and — once ready — raw
listener endpoints as socket addresses. Processes are the only
implementation today; the contract deliberately fits a future
container whose endpoints are published host mappings.
_Avoid_: process (when the abstraction is meant), node

**Indexer convergence**:
The moment the Indexer's view of the chain includes the Validator's
tip. Mining returns as soon as the Validator has the blocks; the
Indexer catches up on its own cadence, so anything that reads through
the Indexer right after mining must wait for convergence rather than
poll around the gap.
_Avoid_: indexer catch-up, tip lag (as names for the barrier)

**Validator heights**:
Activation heights whose provenance is a query of the running Validator —
the only form in which any non-Validator component may hold regtest
heights. The Validator is configured with heights exactly once, at
launch; the Indexer and the wallet client derive theirs from it, and
supplying heights to those components by hand is unrepresentable.
_Avoid_: provider heights, custom heights, caller heights
Loading
Loading