Repository navigation
493 lines (480 loc) · 28.6 KB
/
Copy pathci.yml
File metadata and controls
493 lines (480 loc) · 28.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# The audit's PROC-1: three regression tests that fail on v0.1 existed and nothing ran them on
# push; an 87-minute release suite was run by hand; a hard fork reached sixteen droplets and came
# back within a day. CI from a clean checkout is the cheapest thing that would have caught any of
# it.
#
# The jobs, by when they run:
#
# every push (branches and tags) and pull request
# check-and-test minutes. `cargo check --workspace --tests` (a `--lib`-only gate has
# silently broken `main.rs` and `tests/` here before) and every library
# suite, the node's fixture-backed aggregation tests included (their
# pinned fixtures are in-repo, checked first by recursion-fixtures.sh
# --check). The rVM's long proving tests are skipped by name:
# scripts/ci-fixture-skips.sh is the one list.
# lint clippy, warnings denied, on the hand-maintained crates.
# supply-chain `cargo audit` and `cargo deny check` (deny.toml).
# guest-provenance the vendored guests are circuits' files at the pin and rebuild from source.
# clean-clone fullnode checked out ALONE: `cargo metadata --locked` and a locked check of
# every target. The test that keeps PROC-2 closed.
# every `v*` tag and every night
# zk-guards the guards of the Fixed High zk findings, so that a regression in one is
# caught at the tag and not only by hand.
# every night (18:00 UTC)
# nightly-proving the wallet flow and the cluster suite, which really prove bundles.
# nightly-zkvm the zkVM's whole suite, then guest v2's real-proof cheats.
# nightly-rvm the rVM's whole suite less its two tier-18/19 round trips.
# mutation-controls one named edit per Fixed zk finding must turn its named test red (HB-4).
#
# Audit v6 (2026-09-30), what this file was and is now:
# PROC-7 the nightly ran the workspace without --no-fail-fast, skipped only `agg_executor::`
# and set no RECURSION_FIXTURES, so it died at `randprotocol-node --lib` on the
# fixture-backed aggregation tests on every run: 0 of 6 nightlies were green and the
# zkVM and rVM suites had never run in CI. Now: --no-fail-fast, the same skip list as
# the fast job, and the two proof suites in jobs of their own. Its open half (no job
# had the fixtures the node's aggregation tests read) closed 2026-10-08: the pinned
# set is committed (#131) and both jobs run those tests.
# PROC-6 no permissions block, actions pinned by tag, no dependency gate. Now: read-only
# token, every action pinned by commit, `supply-chain`.
# PROC-2 see `clean-clone`.
# `.github/workflows/release.yml` builds a tag's binaries only when this workflow's run for the
# tagged commit is green (PROC-4), so a job that is red here blocks a release.
#
# The workspace builds from this repository alone (audit v6 PROC-2, issue #109, 2026-10-01).
# circuits' `evm-core`/`sbpf-core` are vendored under `vendor/circuits/` and the optional CUDA
# backend `rand-zkvm-cuda` is a git dependency on the public randprotocol/zkp-circuits repository
# at a pinned revision, which cargo fetches. Only `guest-provenance` checks circuits out, to compare
# the vendored copies with their source at `CIRCUITS_PIN`; `clean-clone` is the job that proves
# the rest need no sibling, and it is a required job.
#
# Every `uses:` is a full commit sha with its tag in the trailing comment (looked up with
# `git ls-remote` on 2026-09-30). To move one: look the new tag's sha up the same way (the peeled
# `^{}` sha for an annotated tag) and change both halves of the line.
name: ci
on:
push:
pull_request:
schedule:
# 18:00 UTC daily, for the proving suites.
- cron: "0 18 * * *"
# The token every job gets: read the repository, nothing else. No job here writes.
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
# The circuits commit this tree's vendored crates were synced from (deploy/sync-zkvm.sh). Bump it
# in the same commit as a re-vendor, or CI builds this workspace against a tree it did not vendor.
# 56b7061 is circuits branch feat/scan-compact: main c83b1c7 (tree aggregation, 4a244b6) plus
# viewing.rs's ScanKey and EnvelopeHead; recursion/ is 4a244b6's. The rand-zkvm-cuda revs stay
# at the pushed 71e1a04, where rand-zkvm-cuda/ is identical to this commit's.
CIRCUITS_PIN: b3e21d9ea16225452bcd03a94317cb61e1705979
jobs:
check-and-test:
if: github.event_name != 'schedule'
runs-on: ubuntu-latest
timeout-minutes: 90
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
path: fullnode
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable (branch head, 2026-09-30)
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
workspaces: fullnode
- name: System dependencies
run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
# The gate that has actually caught things here: `--lib` compiles neither `src/main.rs` nor
# `tests/`, so a change to a shared type can pass a library test run and break both.
- name: Check every target
working-directory: fullnode
run: cargo check --workspace --tests
# Private multisig phase 4 (spec §6.5): the signer checks are the pure crate
# `randprotocol-msig`, which the clients' wasm and native cores vendor, so it must keep
# compiling for the browser — no RPC, filesystem, tokio or prover crept into its cone.
- name: The signer checks build for wasm32
working-directory: fullnode
run: |
rustup toolchain install 1.98.1 --profile minimal --target wasm32-unknown-unknown
RUSTFLAGS='--cfg getrandom_backend="wasm_js"' cargo +1.98.1 check -p randprotocol-msig --target wasm32-unknown-unknown
# The node's aggregation tests read the pinned recursion fixtures committed at
# crates/randprotocol-node/fixtures/recursion (#131). A missing, truncated or edited file
# fails here, by name, rather than as a panic or a wrong digest in the middle of the suite.
- name: The recursion fixtures are the pinned bytes
working-directory: fullnode
run: bash scripts/recursion-fixtures.sh --check
- name: Library suites
working-directory: fullnode
# The skips are scripts/ci-fixture-skips.sh's, the one list this job and the nightly share:
# the rVM's two long round trips, by full name, nothing else. The node's fixture-backed
# aggregation tests run here (since 2026-10-08): the fixtures they read are in-repo and
# checked above. Until
# then this step skipped them, and for a while its comment claimed the nightly covered
# them; it did not, as no job had the fixtures.
run: cargo test --workspace --lib --bins --release -- $(scripts/ci-fixture-skips.sh)
- name: Integration suites that do not prove
working-directory: fullnode
# Named one by one rather than filtered by a `--skip` pattern: the cluster suite's proving
# tests are not distinguishable by name (a bond is a bundle proof; the sealed-sync capstone
# reads as a sync test), and a pattern that looks right silently lets 90 minutes of proving
# into the fast job. A new cheap test has to be added here on purpose — that is the trade.
run: |
cargo test -p randprotocol-node --release --test submit --test ws
# Coverage push 2026-10-11: suites the nightly already ran, cheap and proof-free, that the
# fast job and the coverage measurement did not name. The prover service and its HTTP
# surface run on a stub prove function; the `rand`/`rand-node` binaries are driven as an
# operator runs them (loopback RPC fakes, no real node, no GPU); `network` is two or three
# libp2p swarms on 127.0.0.1. genesis_cli's aggregation-tree test (one minute alone) stays
# with the nightly.
cargo test -p randprotocol-prover --release --test http --test service --test pairing --test wire --test retired_flag --test cli
cargo test -p randprotocol-client --release --test cli_scripts --test cli_rpc --test cli_perp --test cli_token_bridge --test rpc_methods
cargo test -p randprotocol-node --release --test prover_hosted --test keygen_cli --test prover_flag --test network --test cli_multisig --test cli_staking --test cli_vesting --test cli_datadir --test cli_bridge_gov
cargo test -p randprotocol-node --release --test genesis_cli -- --skip aggregation_tree_section
# The downstream repos' RPC contract (randscan, randbridge.org, randprotocol.org,
# zusd.money): every field they read, by presence and JSON type. One validator, one
# faucet mint, no proof.
cargo test -p randprotocol-node --release --test rpc_contract
cargo test -p randprotocol-zkvm --release --test guest_provenance
# HCS-1's tripwire: the verifier keys' known answers. Every key is salted from StdRng's
# stream, so a dependency bump that moves it (rand, rand_core, chacha20) refuses every
# proof on the fleet; nightly alone would catch it a day after the push that did it.
cargo test -p randprotocol-zkvm --release --test verifier_key
cargo test -p randprotocol-rvm --release --test verifier_key
cargo test -p randprotocol-node --release --test cluster -- --exact \
a_synced_certified_but_uncommitted_chain_is_not_committed \
a_batch_whose_evidence_blocks_are_junk_commits_nothing \
a_node_served_one_block_at_a_time_still_reaches_the_tip \
four_validators_plus_late_observer_syncs \
validator_restarts_from_disk_and_resumes \
restart_cycles_keep_all_nodes_in_sync \
two_of_four_down_halts_and_recovers_without_fork \
node_behind_by_more_than_one_sync_batch_catches_up \
corrupted_rocksdb_is_detected_truncated_and_resynced \
faucet_mint_via_rpc_reaches_every_node \
faucet_is_rejected_when_genesis_disables_it \
a_refused_transaction_is_not_verified_twice
# Audit CS6-1: the compiled guests and the two test assets under
# `crates/randprotocol-zkvm/guests-compiled/` are copies of circuits' `guests-compiled/` at
# CIRCUITS_PIN (`guests-compiled/PROVENANCE.md`). This job checks the copies are those files,
# byte for byte, and that circuits' public source at the pin rebuilds them. Its own job, not a
# step of check-and-test: it installs the guest target and clears `$CARGO_HOME/config.toml`
# (`rand-guest` refuses to build under one), neither of which should touch the main suite.
guest-provenance:
if: github.event_name != 'schedule'
runs-on: ubuntu-latest
timeout-minutes: 60
env:
# solc 0.8.37's static Linux build, the release `erc20.runtime.hex` was compiled with
# (PROVENANCE.md; the same digest binaries.soliditylang.org/linux-amd64/list.json publishes).
SOLC_URL: https://github.com/ethereum/solidity/releases/download/v0.8.37/solc-static-linux
SOLC_SHA256: 5de843c2c93563cc66425c99a4fb13fdbf32b4c4ae07469480faaf126e14404a
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
path: fullnode
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
repository: randprotocol/zkp-circuits
ref: ${{ env.CIRCUITS_PIN }}
path: circuits
- name: The vendored copies are circuits' files at the pin
run: |
cd fullnode/crates/randprotocol-zkvm/guests-compiled
sha256sum -c SHA256SUMS
while read -r _ f; do
cmp "$f" "$GITHUB_WORKSPACE/circuits/guests-compiled/$f"
done < SHA256SUMS
cd "$GITHUB_WORKSPACE/circuits/guests-compiled/sbpf/programs" && sha256sum -c spl_token.so.sha256
# PROC-2 (#109): the vendored `evm-core`/`sbpf-core` crates are circuits' at the pin, whole
# (`vendor/circuits/PROVENANCE.md`); `diff -r` rather than the manifest alone so a file added
# upstream and not copied is found too (the manifest cannot list what is not here).
- name: The vendored circuits crates are circuits' at the pin
run: |
cd fullnode/vendor/circuits
sha256sum -c SHA256SUMS
grep -q "^circuits: $CIRCUITS_PIN$" PROVENANCE.md
for crate in evm-core sbpf-core dilithium-core; do
diff -r --exclude Cargo.lock --exclude target "$crate" "$GITHUB_WORKSPACE/circuits/guests-compiled/$crate"
done
# The CUDA backend is a git dependency at its own revision (`crates/randprotocol-zkvm/Cargo.toml`),
# which may trail CIRCUITS_PIN; what must not differ between the two is the backend itself and
# the constants table it `#[path]`-includes from research, or a cuda build would prove with a
# table the vendored crate does not have.
- name: rand-zkvm-cuda's revision matches the pin where it matters
run: |
rev=$(sed -n 's/^rand-zkvm-cuda = { git = "https:\/\/github.com\/randprotocol\/zkp-circuits", rev = "\([0-9a-f]*\)", optional = true }$/\1/p' fullnode/crates/randprotocol-zkvm/Cargo.toml)
test -n "$rev"
grep -q "rev = \"$rev\"" fullnode/crates/randprotocol-rvm/Cargo.toml
cd circuits
git fetch --depth 1 origin "$rev"
git diff --quiet "$rev" "$CIRCUITS_PIN" -- rand-zkvm-cuda research/src/poseidon2_constants.rs
- name: The guest toolchain rand-guest pins
run: |
rustup toolchain install 1.98.1 --profile minimal --target riscv32im-unknown-none-elf --component llvm-tools
rm -f "${CARGO_HOME:-$HOME/.cargo}/config" "${CARGO_HOME:-$HOME/.cargo}/config.toml"
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
workspaces: circuits/rand-guest
# Builds fib, keccak256, evm, sbpf, dilithium-verify and msauth from source with `rand-guest
# build` and compares: the four image containers byte for byte, the two legacy flat pins by
# program (base_pc, words, hc). circuits' gate lists all six at the pin (private multisig).
- name: circuits rebuilds the six guests from source
working-directory: circuits/rand-guest
run: cargo test --release --test build -- --exact build_reproduces_every_committed_image_and_reports_hc
# Inline rather than circuits' `contracts/build.sh`: that script's `mktemp -t erc20.runtime.hex`
# is BSD syntax and GNU mktemp refuses a template without X's.
- name: solc 0.8.37 recompiles erc20.runtime.hex
working-directory: circuits/guests-compiled/evm
run: |
curl -sSfL -o "$RUNNER_TEMP/solc" "$SOLC_URL"
echo "$SOLC_SHA256 $RUNNER_TEMP/solc" | sha256sum -c
chmod +x "$RUNNER_TEMP/solc"
"$RUNNER_TEMP/solc" --version
"$RUNNER_TEMP/solc" --optimize --optimize-runs 200 --evm-version shanghai --bin-runtime contracts/ERC20.sol \
| tail -1 > "$RUNNER_TEMP/erc20.runtime.hex"
diff contracts/erc20.runtime.hex "$RUNNER_TEMP/erc20.runtime.hex"
# Clippy with warnings denied, on the crates maintained in this repository. `--no-deps` is what
# limits the lint to the named packages: without it `-D warnings` also lands on the vendored
# `randprotocol-zkvm` and `randprotocol-rvm` when they are compiled as dependencies. Those two
# are copies of circuits' `research` and `recursion` crates (deploy/sync-zkvm.sh) and are linted
# upstream, not here; a lint fixed in the copy would be lost at the next re-vendor.
lint:
if: github.event_name != 'schedule'
runs-on: ubuntu-latest
timeout-minutes: 60
continue-on-error: false
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
path: fullnode
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable (branch head, 2026-09-30)
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
workspaces: fullnode
- name: System dependencies
run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
# rust-toolchain.toml pins the channel cargo uses in this directory; the component has to
# be added to that toolchain, not to the runner's default one.
- name: Clippy for the pinned toolchain
working-directory: fullnode
run: |
channel=$(sed -n 's/^channel = "\(.*\)"/\1/p' rust-toolchain.toml)
rustup toolchain install "$channel" --profile minimal --component clippy
- name: Clippy, warnings denied, hand-maintained crates only
working-directory: fullnode
run: |
cargo clippy --no-deps \
-p randprotocol-core -p randprotocol-node -p randprotocol-client \
-p randprotocol-prover -p bridge-codec -p randprotocol-msig \
--all-targets -- -D warnings
# Audit v6, PROC-6: a dependency and supply-chain gate. `cargo audit` fails on a RUSTSEC
# vulnerability in Cargo.lock and prints unmaintained crates as warnings; `cargo deny check`
# (deny.toml) fails on a vulnerability, a yanked crate, a registry or git source that is not
# listed, and a licence that is not listed, and reports duplicate versions. The two tools are
# built from crates.io at pinned versions with --locked, not fetched as prebuilt binaries by a
# third-party action.
supply-chain:
if: github.event_name != 'schedule'
runs-on: ubuntu-latest
timeout-minutes: 45
env:
CARGO_AUDIT_VERSION: 0.22.2
CARGO_DENY_VERSION: 0.20.2
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
path: fullnode
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable (branch head, 2026-09-30)
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
# Caches the two installed tools between runs; nothing in the workspace is built here.
workspaces: fullnode
cache-targets: false
# Installed from outside the checkout, so `fullnode/rust-toolchain.toml` does not pick the
# compiler that builds the tools.
- name: Install cargo-audit and cargo-deny
run: |
cargo install --locked cargo-audit --version "$CARGO_AUDIT_VERSION"
cargo install --locked cargo-deny --version "$CARGO_DENY_VERSION"
- name: cargo audit
working-directory: fullnode
run: cargo audit
- name: cargo deny check
working-directory: fullnode
run: cargo deny check
# Audit v6, PROC-2 (issue #109): a third party who clones fullnode alone can build it. This job
# is that clone — no sibling `circuits/` — and it is the test that keeps PROC-2 closed: it failed
# at `cargo metadata` until 2026-10-01, on the first sibling path dependency cargo read (cargo
# loads every path dependency's manifest, optional or not, so no feature could fix it; the
# sibling crates are vendored under `vendor/circuits/` now and the CUDA backend is a git
# dependency cargo fetches). `scripts/clean-clone-check.sh` is the same test run locally, on the
# working tree. `--tests` on the check, so the dev-dependencies resolve from a lone clone too.
clean-clone:
if: github.event_name != 'schedule'
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable (branch head, 2026-09-30)
- name: System dependencies
run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
- name: No sibling checkout
run: test ! -e ../circuits
- name: cargo metadata, locked, with no sibling checkout
run: cargo metadata --locked --format-version 1 > /dev/null
- name: cargo check, locked, every target, default features
run: cargo check --workspace --tests --locked
# Audit v6, PROC-7: the guards of the Fixed High zk rows, on every `v*` tag and every night.
# They pass in private runs and fail when their fix is reverted; before this job nothing ran
# them routinely, so a regression would have been caught only by hand.
# zkVM tests/privacy_floor.rs the 2^7 floor on private tables (INT-1, COV-2, INT-6, HCS-3)
# tests/logup_blind.rs blinded LogUp terminals (INT-2, GV-1)
# rVM tests/cheating.rs the recursion machine refuses every forged trace
# tests/tables.rs its tables' constraints
# None of the four reads RECURSION_FIXTURES (the rVM tests that do are aggregate, exit,
# fixtures, verifier, tape_n and self_verify, which stay in nightly-rvm). Measured on a laptop
# on 2026-09-30, release profile, after the build: the zkVM pair 259 s and 6.2 GB peak resident
# (logup_blind's two tests are 227 s of it), the rVM pair 3.3 s and 0.3 GB — inside a hosted
# runner's memory, though this job has not yet run on one.
zk-guards:
if: github.event_name == 'schedule' || startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
timeout-minutes: 120
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
path: fullnode
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable (branch head, 2026-09-30)
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
workspaces: fullnode
- name: System dependencies
run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
- name: zkVM guards (privacy floor, LogUp blinding)
working-directory: fullnode
run: cargo test -p randprotocol-zkvm --release --test privacy_floor --test logup_blind
- name: rVM guards (cheating, tables)
if: always()
working-directory: fullnode
run: cargo test -p randprotocol-rvm --release --test cheating --test tables
# The wallet flow and the cluster suite prove real bundles in the test FRI profile. They take
# the workspace proving slot, so they run one after another whatever the runner's core count.
# If a hosted runner cannot carry them (memory, or wall time), point this job at a self-hosted
# runner on a fleet machine rather than deleting it.
#
# `--no-fail-fast`: cargo runs every test binary and reports every failure, where it used to
# stop at the first red binary (PROC-7). The skips are the fast job's, from the one script; the
# zkVM and rVM crates are excluded here because they have jobs of their own below. The node's
# fixture-backed tests run here too, on the in-repo fixtures, checked first.
nightly-proving:
if: github.event_name == 'schedule'
runs-on: ubuntu-latest
timeout-minutes: 360
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
path: fullnode
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable (branch head, 2026-09-30)
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
workspaces: fullnode
- name: System dependencies
run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
- name: The recursion fixtures are the pinned bytes
working-directory: fullnode
run: bash scripts/recursion-fixtures.sh --check
- name: The node, wallet, prover and core suites
working-directory: fullnode
run: |
cargo test --workspace --exclude randprotocol-zkvm --exclude randprotocol-rvm \
--release --no-fail-fast -- $(scripts/ci-fixture-skips.sh)
# The zkVM's own suite: the AIR and cheating tests, the end-to-end proofs, the hidden bundle's
# real-proof cheats. One test at a time: a real-proof cheat needs about 5.7 GB.
nightly-zkvm:
if: github.event_name == 'schedule'
runs-on: ubuntu-latest
timeout-minutes: 360
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
path: fullnode
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable (branch head, 2026-09-30)
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
workspaces: fullnode
- name: System dependencies
run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
- name: The zkVM suite
working-directory: fullnode
run: cargo test -p randprotocol-zkvm --release --no-fail-fast -- --test-threads=1
# Issue #61: `tests/hidden_cheating.rs`'s real-proof cheats prove the guest
# `HIDDEN_BUNDLE_GUEST` names, v1 by default — so the step above covers v1 end to end and
# the branch-free v2 (`hc_bundle 651043e2…`, chain 16's guest) only in the emulator and one
# tier-14 proof. Its cheats have to be real proofs every night too, not a manual run someone
# remembers before a cut. Only `real_proof_` here: the fuzz and the emulator companions are
# guest-agnostic (they compare v1 and v2 on every run) and already ran above. ~35 min;
# Production FRI, one proof at a time.
- name: Guest v2's real-proof cheating suite
if: always()
working-directory: fullnode
env:
HIDDEN_BUNDLE_GUEST: v2
run: |
cargo test -p randprotocol-zkvm --release --test hidden_cheating real_proof_ \
-- --test-threads=1
# The rVM's own suite, less its two long round trips (tier 18, N=1, and tier 19, N=2: tens of
# GB, the exit's own runs, not a gate's; the N=2 one is also `#[ignore]`d in source), skipped
# by full name from scripts/ci-fixture-skips.sh (a bare `--skip round_trips` here used to drop
# the ISA's encode/decode round trip too).
# No RECURSION_FIXTURES is set, so the fixture-using tests
# (aggregate, exit, verifier, tape_n, self_verify) prove their fixtures into
# `target/recursion-fixtures` on the runner first; whether a hosted runner's memory and the
# time limit carry that is untested (audit v6 says as much). If they do not, this is the job to
# move to a self-hosted runner with a provisioned cache. (The node's fixture-backed aggregation
# tests need no such cache: they read the pinned set committed in-repo, #131.)
nightly-rvm:
if: github.event_name == 'schedule'
runs-on: ubuntu-latest
timeout-minutes: 360
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
path: fullnode
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable (branch head, 2026-09-30)
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
workspaces: fullnode
- name: System dependencies
run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
- name: The rVM suite
working-directory: fullnode
run: |
cargo test -p randprotocol-rvm --release --no-fail-fast \
-- $(scripts/ci-fixture-skips.sh)
# HB-4 (audit v6 §8.28, option 2; issue #100): a mutation control per Fixed zkVM finding — one
# named one-line edit that removes the fix, and the named test that must go red under it,
# applied and restored one at a time by scripts/mutation-controls.sh (its header lists every
# control and the findings without one, with the reason). Nightly only: each control recompiles
# the crate it touches in release, and some of the named tests prove. The script exits non-zero
# on a test that stays green under its mutation (`MISSING`) — that is a finding about the suite,
# to be fixed with a test, not by softening the mutation. The checkout is the runner's own, so
# the in-place edits never reach a commit.
mutation-controls:
if: github.event_name == 'schedule'
runs-on: ubuntu-latest
timeout-minutes: 360
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
path: fullnode
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable (branch head, 2026-09-30)
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
workspaces: fullnode
- name: System dependencies
run: sudo apt-get update && sudo apt-get install -y clang libclang-dev
- name: Mutation controls
working-directory: fullnode
env:
CARGO_INCREMENTAL: "0"
LOGDIR: ${{ runner.temp }}/mutation-controls
run: scripts/mutation-controls.sh