chore: bump leanVM to 8fcbd779 and leanSpec to latest main#408
Conversation
Bump the multisig dependency to commit 0520822 and switch the git remote from the renamed leanMultisig repo to leanVM. Pin transitive Plonky3 to 3f67d136 (the rev leanVM 0520822 locks against); the floating Plonky3 HEAD pulled in a newer rev that requires the unstable maybe_uninit_slice feature and fails to build on stable.
🤖 Kimi Code ReviewSecurity Critical: Dependency Downgrades Detected This PR migrates dependencies from 1. Critical:
|
🤖 Claude Code ReviewHere is the full review: PR #408 Review: chore: bump leanVM to 8fcbd779 and leanSpec to latest mainThis is a focused dependency bump with a clear, well-documented rationale. The overall approach is sound. A few things worth noting: CorrectnessThe core alignment goal — pinning both The Dependency version notesThe lock file now contains two coexisting versions of
Stable-Rust build fixPinning Plonky3 to MinorThe trailing newline removal in The comment update in What to verify before merge
SummaryThe change is correct and well-scoped. The pinning strategy (matching leanVM rev to what leanSpec uses, pinning Plonky3 to avoid nightly requirements) is the right approach. No correctness or security issues found. Automated review by Claude (Anthropic) · sonnet · custom prompt |
🤖 Codex Code ReviewFindings
No direct local Rust/style issues stood out beyond those two concerns. I couldn’t run Automated review by OpenAI Codex · gpt-5.4 · custom prompt |
Greptile SummaryThis PR bumps the
Confidence Score: 5/5Safe to merge — all changes are dependency version pins with no logic modifications. The PR makes no changes to application logic, only updates dependency sources and commit hashes. The Cargo.lock reflects exactly what the description promises: leanVM repo rename, Plonky3 stable-Rust pin, and cascading transitive updates. The Makefile hash bump aligns leanSpec with the same prover/verifier revision, which is the intended pairing. No files require special attention. The Cargo.lock is the most complex file but all changes are machine-generated and consistent with the declared intent.
|
| Filename | Overview |
|---|---|
| crates/common/crypto/Cargo.toml | Updated lean-multisig and leansig_wrapper git sources from the renamed leanMultisig repo to leanVM at rev 8fcbd779; no structural changes. |
| crates/common/crypto/src/lib.rs | Comment-only change updating 'leanMultisig' to 'leanVM' to reflect the upstream repository rename. |
| Makefile | Bumps LEAN_SPEC_COMMIT_HASH from 825bec6b (2026-05-21) to 30ffb6ca (2026-06-03), aligning leanSpec with the rev that ships lean-multisig-py v0.0.6. |
| Cargo.toml | Trailing newline removed — no substantive change. |
| Cargo.lock | All leanVM crates re-pinned to 8fcbd779; Plonky3 re-pinned to 3f67d136; cascade bumps to spin (0.11→0.10), num-bigint (0.4.6→0.3.3 for mt-* crates), getrandom (0.4.2→0.3.4 for tempfile), and windows-sys (0.52/0.60→0.61.2) are consistent with the PR description. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["crates/common/crypto/Cargo.toml"] -->|"lean-multisig @ 8fcbd779"| B["leanEthereum/leanVM.git"]
A -->|"leansig_wrapper @ 8fcbd779"| B
B -->|"transitive dep"| C["Plonky3 @ 3f67d136\n(stable Rust compatible)"]
C -->|"uses"| D["spin 0.10.0"]
C -->|"uses"| E["num-bigint 0.3.3\n(mt-field, mt-koala-bear)"]
F["Makefile\nLEAN_SPEC_COMMIT_HASH"] -->|"30ffb6ca (2026-06-03)"| G["leanEthereum/leanSpec\n(lean-multisig-py v0.0.6)"]
G -.->|"locks same prover/verifier rev"| B
Reviews (1): Last reviewed commit: "chore: bump leanSpec pin to latest main ..." | Re-trigger Greptile
leanSpec main renamed fixture fields and typed the block proof: - Validator pubkey fields: attestationPubkey/proposalPubkey -> attestationPublicKey/proposalPublicKey - Attestation validatorId -> validatorIndex (steps and SSZ vectors) - signedBlock.proof is now a typed container (leanSpec #799) nesting the raw lean-multisig Type-2 wire one level deeper; re-wrap it into the SSZ-envelope form SignedBlock.proof stores. The flat shape is still accepted for older spec-assets simulators (Hive).
The leanSpec bump moved the proof backend from the devnet-4 prover to devnet5 (8fcbd779), which peaks at ~4-5 GiB per proof. `-n auto` on the 4-vCPU/16 GiB GitHub runner spawns 4 concurrent provers (~18 GiB) and nondeterministically OOM-kills the runner mid-generation. Proving is core-bound (rayon saturates all cores per proof), so capping to 2 workers barely affects wall-time while keeping peak memory under the limit. The Makefile keeps -n auto for local machines with more memory.
-n 2 cleared the hard OOM (no more 'shutdown signal') but the runner still thrashed and lost its heartbeat at ~1h23m, so GitHub cancelled the job. Drop to a single prover (~4.5 GiB, well under the 16 GiB runner) and add a 15s free -m sampler to confirm memory is the cause and tune the worker count. The sampler is temporary.
The memory-sampler trap expanded $MON at definition time (double quotes), which shellcheck flags as SC2064. Single-quote it so it expands when the trap fires; MON is still in scope then. No behavior change.
The fixtures cache save used a bare always(), so when generation was cancelled or OOM-killed mid-run it still saved the empty fixtures dir under leanspec-fixtures-<pin>. Later runs hit that empty cache, skipped generation, and the Rust tests failed with no fixtures present. Gate the save on the generate step's outcome == 'success' so a partial or aborted generation never poisons the cache. The pre-existing poisoned cache entry was deleted manually.
Memory was confirmed as the cause: a single devnet5 prover peaks ~12 GiB, so only -n 1 fits the 16 GiB runner. Drop the free -m sampler now that the finding is recorded; keep -n 1 and the success-gated cache save.
SignedBlock.proof fixtures have used the nested PR #799 container shape
({ proof: { data: "0x..." } }) since the current leanSpec pin. The flat
PR #717 shape ({ data: "0x..." }) was only kept for older Hive spec-asset
simulators; those will move to the new format too.
Replace the untagged ProofField enum with a single MergedProof struct so
there is one decode path, and update the verify_signatures e2e payload to
the nested shape. The Hive test-driver verify_signatures endpoint now
accepts only the nested format.
🗒️ Description / Motivation
Recent leanVM changes introduced performance improvements. The upstream repo was also renamed from
leanMultisigtoleanVM. The pin matches the exact leanVM rev that leanSpec uses, so fixtures and client use the same prover/verifier.What Changed
8fcbd779: the leanVM devnet5 rev that leanSpec main locks vialean-multisig-pyv0.0.6.leanEthereum/leanMultisigto the renamedleanEthereum/leanVM.3f67d136(the rev leanVM8fcbd779locks against). The floating Plonky3 HEAD otherwise resolved to a newer rev that requires the unstablemaybe_uninit_slicefeature and fails to build on stable.LEAN_SPEC_COMMIT_HASHin the Makefile to latest leanSpec main (30ffb6ca, 2026-06-03), which is what pulls inlean-multisig-pyv0.0.6.