Build on stock Rust 1.75 (no rustup) + heads-up: island_search analysis tool models the superseded dialog circuit
Two small contributions for other contestants, both reproducible against the current main (the trailmix_ludicrous jump-2 default circuit). Neither touches the scored harness or correctness; part 1 is a downstream build recipe, part 2 is an observation about the in-repo analysis tooling.
Part 1 — Building on stock Rust 1.75 (no rustup)
The repo pins rust-toolchain = "1.93.0" and ships a v4 Cargo.lock, so a clone needs rustup to fetch that toolchain. In environments with only a stock rustc 1.75.0, the following minimal, value-preserving changes let both build_circuit and eval_circuit build and run (and eval_circuit still validates 9024/9024 on the deployed circuit):
- Drop the toolchain pin + relock. Remove
rust-toolchain and the v4 Cargo.lock, then cargo generate-lockfile (produces a v3 lock that 1.75's cargo accepts).
- Repoint
alloy-primitives → ruint. alloy-primitives is used only for U256, which is ruint::aliases::U256. Replace the use alloy_primitives::U256; lines (8 files) with use ruint::aliases::U256; and drop the dependency. In Cargo.toml:
ruint = { version = "=1.15.0", default-features = false, features = ["alloc"] }
sha3 = "=0.10.8"
(The default ruint features pull an edition-2024 indexmap that won't build on 1.75; default-features = false + alloc avoids it.)
- Pin
zeroize. cargo update -p zeroize --precise 1.7.0 (1.9.0 requires a newer edition).
- One 1.82+ API. The two
Option::is_none_or(|x| …) calls in src/point_add/rounds/dialog/compressed.rs → .map_or(true, |x| …).
Builds in ~1 min, 37-crate tree. This is purely a packaging accommodation for older toolchains — the emitted op-stream is unchanged.
Part 2 — src/point_add/island_search.rs screens against the superseded dialog circuit
island_search.rs (explicitly "analysis tooling, not part of the scored circuit") screens Fiat-Shamir nonces using the dialog-Kaliski predicate: check_point_add_apply_hazards → build_gcd_transcript, sized by DialogGcdFilterConfig::active_iterations. The deployed default circuit is now trailmix_ludicrous, whose inversion is a jump-2 divstep with a different transcript structure.
The module is currently orphaned (no mod island_search; in point_add/mod.rs). I wired it in behind a thin bin and ran its own base-nonce sanity check against the deployed circuit:
- It reports
[base] … hard=9024 (expect hard=0) on the deployed circuit's own baked nonce (DIALOG_TAIL_NONCE), at every budget I tried: DIALOG_GCD_ACTIVE_ITERATIONS ∈ {258, 360, 402, 520}.
- The point derivation is correct —
island_search::absorb_op matches eval_circuit::fiat_shamir_seed byte-for-byte (same quantum_ecc-fiat-shamir-v2 domain, 1-byte kind + six 8-byte fields). So the nonces produce exactly the points eval tests.
- The mismatch is the predicate: it models the old dialog GCD transcript, not the jump-2 one, so it marks every shot "hard" regardless of budget.
Consequence: a contestant who tries to use the in-repo screener to hunt nonces for the current circuit will be misled — it can't distinguish a good trailmix island from a bad one. The trailmix island nonces actually in mod.rs (e.g. the one a comment attributes to a "GPU strong-prefilter hunt") are evidently produced by an out-of-repo, jump-2-aware screener.
Low-effort fixes that would help: either a note in island_search.rs that it targets the legacy dialog route, or a trailmix-aware predicate (a jump-2 convergence + apply model) so the public tool matches the deployed circuit.
Filed by an independent contestant building on the challenge. Happy to PR the 1.75 build changes behind a feature/CI note if useful, and to share the exact repro for the island_search base-nonce check.
Build on stock Rust 1.75 (no rustup) + heads-up:
island_searchanalysis tool models the superseded dialog circuitTwo small contributions for other contestants, both reproducible against the current
main(thetrailmix_ludicrousjump-2 default circuit). Neither touches the scored harness or correctness; part 1 is a downstream build recipe, part 2 is an observation about the in-repo analysis tooling.Part 1 — Building on stock Rust 1.75 (no
rustup)The repo pins
rust-toolchain = "1.93.0"and ships a v4Cargo.lock, so a clone needsrustupto fetch that toolchain. In environments with only a stockrustc 1.75.0, the following minimal, value-preserving changes let bothbuild_circuitandeval_circuitbuild and run (andeval_circuitstill validates 9024/9024 on the deployed circuit):rust-toolchainand the v4Cargo.lock, thencargo generate-lockfile(produces a v3 lock that 1.75's cargo accepts).alloy-primitives→ruint.alloy-primitivesis used only forU256, which isruint::aliases::U256. Replace theuse alloy_primitives::U256;lines (8 files) withuse ruint::aliases::U256;and drop the dependency. InCargo.toml:ruintfeatures pull an edition-2024indexmapthat won't build on 1.75;default-features = false+allocavoids it.)zeroize.cargo update -p zeroize --precise 1.7.0(1.9.0 requires a newer edition).Option::is_none_or(|x| …)calls insrc/point_add/rounds/dialog/compressed.rs→.map_or(true, |x| …).Builds in ~1 min, 37-crate tree. This is purely a packaging accommodation for older toolchains — the emitted op-stream is unchanged.
Part 2 —
src/point_add/island_search.rsscreens against the superseded dialog circuitisland_search.rs(explicitly "analysis tooling, not part of the scored circuit") screens Fiat-Shamir nonces using the dialog-Kaliski predicate:check_point_add_apply_hazards→build_gcd_transcript, sized byDialogGcdFilterConfig::active_iterations. The deployed default circuit is nowtrailmix_ludicrous, whose inversion is a jump-2 divstep with a different transcript structure.The module is currently orphaned (no
mod island_search;inpoint_add/mod.rs). I wired it in behind a thin bin and ran its own base-nonce sanity check against the deployed circuit:[base] … hard=9024 (expect hard=0)on the deployed circuit's own baked nonce (DIALOG_TAIL_NONCE), at every budget I tried:DIALOG_GCD_ACTIVE_ITERATIONS∈ {258, 360, 402, 520}.island_search::absorb_opmatcheseval_circuit::fiat_shamir_seedbyte-for-byte (samequantum_ecc-fiat-shamir-v2domain, 1-byte kind + six 8-byte fields). So the nonces produce exactly the pointsevaltests.Consequence: a contestant who tries to use the in-repo screener to hunt nonces for the current circuit will be misled — it can't distinguish a good trailmix island from a bad one. The trailmix island nonces actually in
mod.rs(e.g. the one a comment attributes to a "GPU strong-prefilter hunt") are evidently produced by an out-of-repo, jump-2-aware screener.Low-effort fixes that would help: either a note in
island_search.rsthat it targets the legacy dialog route, or a trailmix-aware predicate (a jump-2 convergence + apply model) so the public tool matches the deployed circuit.Filed by an independent contestant building on the challenge. Happy to PR the 1.75 build changes behind a feature/CI note if useful, and to share the exact repro for the
island_searchbase-nonce check.