Uh oh!
There was an error while loading. Please reload this page.
Update Aiur to Plonky3 0.6 - #605
Conversation
ec23add to
af8b452CompareUpdate the multi-stark dependency and Rust toolchain for Plonky3 0.6, along with the Rust 1.98 lint migrations required to keep the workspace warning-free. Refresh the Rust-compatible Blake3.lean pin in both root and compile-package manifests. Adapt recursive Aiur verification to Plonky3's pruned FRI multiproofs. Native proofs retain their compact serialized representation and native verification path; the FFI expands authenticated Merkle frontiers into per-query advice only when entering the existing recursive verifier circuit. Preserve the packed claim-digest convention in the recursion diagnostic and exercise the advice boundary in the end-to-end test and benchmark paths. CPU and CUDA recursive q1 runs produce identical 823,485-byte inner proofs and 331,273-byte outer proofs. The q50 Vector.extract_append workload retains identical CPU/CUDA proof sizes. Inner plus outer STARK proving measures 65.87s on CPU and 8.81s with CUDA on the RTX PRO 6000, a 7.48x speedup.
PR benchmark runs execute trusted workflow YAML from the default branch while loading composite actions from the PR checkout. When Bencher data and binary caches are unavailable, the workflow checks out main under base/ and asks Lake to rebuild it without first installing the Rust channel pinned by that checkout. Teach the existing CPU provenance action to install the base checkout's validated Rust channel and profile immediately before an uncached base build. The step is a no-op when the toolchain is already available and leaves cached benchmark comparisons unchanged.
74945f5 to
eab18e4Comparearthurpaulino
commented
Sep 1, 2026
!benchmark fresh |
|
| constant | execute-time (main) | execute-time (PR) | Δ% | prove-time (main) | prove-time (PR) | Δ% | throughput (const/s) (main) | throughput (const/s) (PR) | Δ% | peak-ram (main) | peak-ram (PR) | Δ% | proof-size (main) | proof-size (PR) | Δ% | verify-time (main) | verify-time (PR) | Δ% | fft-cost (main) | fft-cost (PR) | Δ% |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ByteArray.utf8DecodeChar?_utf8EncodeChar_append | 8.816 s | 8.990 s | +2.0% | 30.095 s | 29.094 s | -3.3% 🟢 | 92.210 | 95.380 | +3.4% 🟢 | 70.72 GiB | 72.35 GiB | +2.3% | 11.33 MiB | 11.07 MiB | -2.3% | 68.7 ms | 60.4 ms | -12.1% (1.14× faster) 🟢 | 134.35B | 134.35B | +0.0% |
Char.ofOrdinal_le_of_le | 6.689 s | 6.790 s | +1.5% | 25.631 s | 25.209 s | -1.6% | 107.800 | 109.600 | +1.7% | 63.87 GiB | 65.41 GiB | +2.4% | 11.33 MiB | 11.07 MiB | -2.3% | 73.7 ms | 60.3 ms | -18.2% (1.22× faster) 🟢 | 102.60B | 102.60B | +0.0% |
Array.extract_append | 6.679 s | 6.415 s | -4.0% 🟢 | 23.076 s | 22.072 s | -4.4% 🟢 | 69.600 | 72.760 | +4.5% 🟢 | 52.03 GiB | 52.79 GiB | +1.4% | 11.24 MiB | 10.99 MiB | -2.2% | 72.3 ms | 64.6 ms | -10.6% (1.12× faster) 🟢 | 97.08B | 97.08B | +0.0% |
Std.HashMap | 3.964 s | 4.002 s | +1.0% | 15.519 s | 15.133 s | -2.5% | 131.580 | 134.940 | +2.6% | 36.34 GiB | 37.08 GiB | +2.1% | 11.26 MiB | 11.00 MiB | -2.3% | 75.1 ms | 65.5 ms | -12.8% (1.15× faster) 🟢 | 61.88B | 61.88B | +0.0% |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq | 3.598 s | 3.528 s | -1.9% | 14.327 s | 13.806 s | -3.6% 🟢 | 130.310 | 135.230 | +3.8% 🟢 | 33.96 GiB | 34.69 GiB | +2.1% | 11.26 MiB | 11.01 MiB | -2.2% | 69.9 ms | 59.5 ms | -15.0% (1.18× faster) 🟢 | 55.68B | 55.68B | +0.0% |
String.append | 424.3 ms | 423.0 ms | -0.3% | 2.278 s | 2.124 s | -6.7% (1.07× faster) 🟢 | 143.540 | 153.930 | +7.2% (1.07× faster) 🟢 | 4.89 GiB | 5.00 GiB | +2.4% | 9.94 MiB | 9.74 MiB | -2.0% | 64.2 ms | 52.0 ms | -19.0% (1.24× faster) 🟢 | 3.37B | 3.37B | +0.0% |
Nat.add_comm | 260.1 ms | 259.8 ms | -0.1% | 1.068 s | 970.5 ms | -9.1% (1.10× faster) 🟢 | 43.070 | 47.400 | +10.1% (1.10× faster) 🟢 | 3.99 GiB | 4.64 GiB | +16.4% (1.16× larger) | 9.09 MiB | 8.91 MiB | -2.0% | 53.9 ms | 41.9 ms | -22.3% (1.29× faster) 🟢 | 308.40M | 308.40M | +0.0% |
FRI verifier on FRI (7 constants)
| constant | execute-time (main) | execute-time (PR) | Δ% | prove-time (main) | prove-time (PR) | Δ% | throughput (const/s) (main) | throughput (const/s) (PR) | Δ% | peak-ram (main) | peak-ram (PR) | Δ% | proof-size (main) | proof-size (PR) | Δ% | verify-time (main) | verify-time (PR) | Δ% | fft-cost (main) | fft-cost (PR) | Δ% |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ByteArray.utf8DecodeChar?_utf8EncodeChar_append | 5.488 s | 5.490 s | +0.0% | 31.664 s | 30.699 s | -3.0% 🟢 | 87.640 | 90.400 | +3.1% 🟢 | 101.37 GiB | 101.07 GiB | -0.3% | 3.97 MiB | 3.72 MiB | -6.3% (1.07× smaller) 🟢 | 29.2 ms | 23.8 ms | -18.5% (1.23× faster) 🟢 | 210.23B | 210.23B | +0.0% |
Char.ofOrdinal_le_of_le | 5.386 s | 5.489 s | +1.9% | 30.846 s | 30.914 s | +0.2% | 89.570 | 89.380 | -0.2% | 100.32 GiB | 100.32 GiB | +0.0% | 3.97 MiB | 3.72 MiB | -6.3% (1.07× smaller) 🟢 | 24.8 ms | 23.1 ms | -6.6% (1.07× faster) 🟢 | 207.18B | 207.18B | +0.0% |
Array.extract_append | 5.209 s | 5.235 s | +0.5% | 29.948 s | 28.844 s | -3.7% 🟢 | 53.630 | 55.680 | +3.8% 🟢 | 94.59 GiB | 95.37 GiB | +0.8% | 3.97 MiB | 3.73 MiB | -6.1% (1.07× smaller) 🟢 | 25.7 ms | 21.3 ms | -17.1% (1.21× faster) 🟢 | 200.65B | 200.65B | +0.0% |
Std.HashMap | 5.314 s | 5.306 s | -0.1% | 29.652 s | 29.584 s | -0.2% | 68.870 | 69.020 | +0.2% | 94.56 GiB | 95.34 GiB | +0.8% | 3.97 MiB | 3.72 MiB | -6.3% (1.07× smaller) 🟢 | 25.2 ms | 21.2 ms | -15.7% (1.19× faster) 🟢 | 203.35B | 203.35B | +0.0% |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq | 5.400 s | 5.333 s | -1.2% | 31.051 s | 30.174 s | -2.8% | 60.130 | 61.870 | +2.9% | 98.68 GiB | 99.48 GiB | +0.8% | 3.97 MiB | 3.73 MiB | -6.2% (1.07× smaller) 🟢 | 30.2 ms | 31.0 ms | +2.5% | 205.59B | 205.59B | +0.0% |
String.append | 4.334 s | 4.419 s | +2.0% | 27.489 s | 26.612 s | -3.2% 🟢 | 11.900 | 12.290 | +3.3% 🟢 | 87.87 GiB | 88.58 GiB | +0.8% | 3.97 MiB | 3.73 MiB | -6.1% (1.07× smaller) 🟢 | 34.5 ms | 22.7 ms | -34.3% (1.52× faster) 🟢 | 168.67B | 168.67B | +0.0% |
Nat.add_comm | 3.518 s | 3.499 s | -0.5% | 18.993 s | 17.942 s | -5.5% (1.06× faster) 🟢 | 2.420 | 2.560 | +5.8% (1.06× faster) 🟢 | 58.70 GiB | 59.42 GiB | +1.2% | 3.97 MiB | 3.72 MiB | -6.2% (1.07× smaller) 🟢 | 24.8 ms | 20.8 ms | -16.1% (1.19× faster) 🟢 | 130.84B | 130.84B | +0.0% |
Pipeline total (7 constants)
| constant | total-time (main) | total-time (PR) | Δ% | pipeline-throughput (const/s) (main) | pipeline-throughput (const/s) (PR) | Δ% | pipeline-peak-ram (main) | pipeline-peak-ram (PR) | Δ% |
|---|---|---|---|---|---|---|---|---|---|
ByteArray.utf8DecodeChar?_utf8EncodeChar_append | 1m 1.8s | 59.792 s | -3.2% 🟢 | 44.930 | 46.410 | +3.3% 🟢 | 101.37 GiB | 101.07 GiB | -0.3% |
Char.ofOrdinal_le_of_le | 56.477 s | 56.124 s | -0.6% | 48.920 | 49.230 | +0.6% | 100.32 GiB | 100.32 GiB | +0.0% |
Array.extract_append | 53.024 s | 50.916 s | -4.0% 🟢 | 30.290 | 31.540 | +4.1% 🟢 | 94.59 GiB | 95.37 GiB | +0.8% |
Std.HashMap | 45.172 s | 44.717 s | -1.0% | 45.210 | 45.660 | +1.0% | 94.56 GiB | 95.34 GiB | +0.8% |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq | 45.377 s | 43.980 s | -3.1% 🟢 | 41.140 | 42.450 | +3.2% 🟢 | 98.68 GiB | 99.48 GiB | +0.8% |
String.append | 29.767 s | 28.737 s | -3.5% 🟢 | 10.990 | 11.380 | +3.5% 🟢 | 87.87 GiB | 88.58 GiB | +0.8% |
Nat.add_comm | 20.061 s | 18.912 s | -5.7% (1.06× faster) 🟢 | 2.290 | 2.430 | +6.1% (1.06× faster) 🟢 | 58.70 GiB | 59.42 GiB | +1.2% |
Consume the Plonky3 0.6 batch-opening layout directly in Aiur instead of expanding every pruned Merkle frontier into one authentication path per FRI query. Sample all query indices from the unchanged transcript, sort and deduplicate them with an O(q log q) merge sort, authenticate each input and commit-phase commitment once, then retain the existing per-query reduced-opening and FRI arithmetic. Bind every frontier to transcript-derived indices, consume boundary digests in Plonky3's level/parent/child order, reject trailing frontier elements and inconsistent duplicate leaves, and assert all native opening dimensions and sibling counts. Explicitly constrain the digest-bound protocol specialization to cap height 0, binary FRI, and a constant final polynomial. Move memo_u32_less_than into IxVM Core so both substitution and multiproof sorting share its constrained rows. Strengthen the recursive negative test to mutate a structurally valid stage-1 commitment. Regenerate both checked-in Aiur Rust executors and retain interpreter/codegen query-count parity. On Vector.extract_append q50, recursive-verifier FFT cost falls from 204.073B to 201.166B. CPU outer proving improves from 50.09s to 45.03s and the full CPU pipeline from 90.64s to 82.90s. GPU outer proving improves from 15.85s to 13.72s and the full GPU pipeline from 28.86s to 26.69s. The outer proof grows from 3.92 MB to 4.17 MB. Validated with the MultiStark primitive suite, recursive honest/tamper/parity tests, codegen --check, release workspace clippy, release CUDA clippy, rustfmt, and diff checks.
arthurpaulino
commented
Sep 1, 2026
!benchmark fresh |
|
| constant | execute-time (main) | execute-time (PR) | Δ% | prove-time (main) | prove-time (PR) | Δ% | throughput (const/s) (main) | throughput (const/s) (PR) | Δ% | peak-ram (main) | peak-ram (PR) | Δ% | proof-size (main) | proof-size (PR) | Δ% | verify-time (main) | verify-time (PR) | Δ% | fft-cost (main) | fft-cost (PR) | Δ% |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ByteArray.utf8DecodeChar?_utf8EncodeChar_append | 8.874 s | 💥 CRASH | n/a | 44.291 s | 💥 CRASH | n/a | 62.650 | 💥 CRASH | n/a | 70.80 GiB | 💥 CRASH | n/a | 11.33 MiB | 💥 CRASH | n/a | 77.4 ms | 💥 CRASH | n/a | 134.35B | 💥 CRASH | n/a |
Char.ofOrdinal_le_of_le | 6.603 s | 💥 CRASH | n/a | 38.242 s | 💥 CRASH | n/a | 72.250 | 💥 CRASH | n/a | 63.81 GiB | 💥 CRASH | n/a | 11.33 MiB | 💥 CRASH | n/a | 76.9 ms | 💥 CRASH | n/a | 102.60B | 💥 CRASH | n/a |
Array.extract_append | 6.311 s | 💥 CRASH | n/a | 33.420 s | 💥 CRASH | n/a | 48.060 | 💥 CRASH | n/a | 51.95 GiB | 💥 CRASH | n/a | 11.24 MiB | 💥 CRASH | n/a | 86.5 ms | 💥 CRASH | n/a | 97.08B | 💥 CRASH | n/a |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq | 3.774 s | 💥 CRASH | n/a | 20.628 s | 💥 CRASH | n/a | 90.510 | 💥 CRASH | n/a | 33.97 GiB | 💥 CRASH | n/a | 11.26 MiB | 💥 CRASH | n/a | 82.6 ms | 💥 CRASH | n/a | 55.68B | 💥 CRASH | n/a |
Std.HashMap | 4.060 s | 💥 CRASH | n/a | 22.501 s | 💥 CRASH | n/a | 90.750 | 💥 CRASH | n/a | 36.36 GiB | 💥 CRASH | n/a | 11.26 MiB | 💥 CRASH | n/a | 84.1 ms | 💥 CRASH | n/a | 61.88B | 💥 CRASH | n/a |
String.append | 708.3 ms | 💥 CRASH | n/a | 2.863 s | 💥 CRASH | n/a | 114.220 | 💥 CRASH | n/a | 4.99 GiB | 💥 CRASH | n/a | 9.94 MiB | 💥 CRASH | n/a | 70.3 ms | 💥 CRASH | n/a | 3.37B | 💥 CRASH | n/a |
Nat.add_comm | 496.0 ms | 💥 CRASH | n/a | 1.330 s | 💥 CRASH | n/a | 34.580 | 💥 CRASH | n/a | 4.33 GiB | 💥 CRASH | n/a | 9.09 MiB | 💥 CRASH | n/a | 58.9 ms | 💥 CRASH | n/a | 308.40M | 💥 CRASH | n/a |
FRI verifier on FRI (7 constants)
| constant | execute-time (main) | execute-time (PR) | Δ% | prove-time (main) | prove-time (PR) | Δ% | throughput (const/s) (main) | throughput (const/s) (PR) | Δ% | peak-ram (main) | peak-ram (PR) | Δ% | proof-size (main) | proof-size (PR) | Δ% | verify-time (main) | verify-time (PR) | Δ% | fft-cost (main) | fft-cost (PR) | Δ% |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ByteArray.utf8DecodeChar?_utf8EncodeChar_append | 6.880 s | 💥 CRASH | n/a | 54.265 s | 💥 CRASH | n/a | 51.140 | 💥 CRASH | n/a | 101.05 GiB | 💥 CRASH | n/a | 3.97 MiB | 💥 CRASH | n/a | 49.5 ms | 💥 CRASH | n/a | 210.23B | 💥 CRASH | n/a |
Char.ofOrdinal_le_of_le | 6.813 s | 💥 CRASH | n/a | 53.449 s | 💥 CRASH | n/a | 51.690 | 💥 CRASH | n/a | 99.81 GiB | 💥 CRASH | n/a | 3.97 MiB | 💥 CRASH | n/a | 45.1 ms | 💥 CRASH | n/a | 207.18B | 💥 CRASH | n/a |
Array.extract_append | 6.371 s | 💥 CRASH | n/a | 50.695 s | 💥 CRASH | n/a | 31.680 | 💥 CRASH | n/a | 95.19 GiB | 💥 CRASH | n/a | 3.97 MiB | 💥 CRASH | n/a | 58.1 ms | 💥 CRASH | n/a | 200.65B | 💥 CRASH | n/a |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq | 6.748 s | 💥 CRASH | n/a | 53.378 s | 💥 CRASH | n/a | 34.980 | 💥 CRASH | n/a | 98.71 GiB | 💥 CRASH | n/a | 3.97 MiB | 💥 CRASH | n/a | 46.1 ms | 💥 CRASH | n/a | 205.59B | 💥 CRASH | n/a |
Std.HashMap | 6.455 s | 💥 CRASH | n/a | 50.868 s | 💥 CRASH | n/a | 40.140 | 💥 CRASH | n/a | 95.03 GiB | 💥 CRASH | n/a | 3.97 MiB | 💥 CRASH | n/a | 45.7 ms | 💥 CRASH | n/a | 203.35B | 💥 CRASH | n/a |
String.append | 5.307 s | 💥 CRASH | n/a | 47.595 s | 💥 CRASH | n/a | 6.870 | 💥 CRASH | n/a | 87.89 GiB | 💥 CRASH | n/a | 3.97 MiB | 💥 CRASH | n/a | 32.4 ms | 💥 CRASH | n/a | 168.67B | 💥 CRASH | n/a |
Nat.add_comm | 4.526 s | 💥 CRASH | n/a | 31.415 s | 💥 CRASH | n/a | 1.460 | 💥 CRASH | n/a | 58.66 GiB | 💥 CRASH | n/a | 3.97 MiB | 💥 CRASH | n/a | 28.0 ms | 💥 CRASH | n/a | 130.84B | 💥 CRASH | n/a |
Pipeline total (7 constants)
| constant | total-time (main) | total-time (PR) | Δ% | pipeline-throughput (const/s) (main) | pipeline-throughput (const/s) (PR) | Δ% | pipeline-peak-ram (main) | pipeline-peak-ram (PR) | Δ% |
|---|---|---|---|---|---|---|---|---|---|
ByteArray.utf8DecodeChar?_utf8EncodeChar_append | 1m 38.6s | 💥 CRASH | n/a | 28.160 | 💥 CRASH | n/a | 101.05 GiB | 💥 CRASH | n/a |
Char.ofOrdinal_le_of_le | 1m 31.7s | 💥 CRASH | n/a | 30.130 | 💥 CRASH | n/a | 99.81 GiB | 💥 CRASH | n/a |
Array.extract_append | 1m 24.1s | 💥 CRASH | n/a | 19.090 | 💥 CRASH | n/a | 95.19 GiB | 💥 CRASH | n/a |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq | 1m 14.0s | 💥 CRASH | n/a | 25.230 | 💥 CRASH | n/a | 98.71 GiB | 💥 CRASH | n/a |
Std.HashMap | 1m 13.4s | 💥 CRASH | n/a | 27.830 | 💥 CRASH | n/a | 95.03 GiB | 💥 CRASH | n/a |
String.append | 50.458 s | 💥 CRASH | n/a | 6.480 | 💥 CRASH | n/a | 87.89 GiB | 💥 CRASH | n/a |
Nat.add_comm | 32.745 s | 💥 CRASH | n/a | 1.400 | 💥 CRASH | n/a | 58.66 GiB | 💥 CRASH | n/a |
The Warp x64 runner pool mixes Intel Granite Rapids and AMD Zen 5, and a build job may land on one vendor while the job that runs its binaries lands on the other. Neither vendor's feature set contains the other's, so `-Ctarget-cpu=native` does not produce a portable binary: Zen 5 enables SSE4A, and LLVM emits it. Disassembling the workspace built for znver5 finds 31 SSE4A instructions, all INSERTQ, in `ix-ffi` and in `aiur_ixvm_witness::add_entries_parallel`. Granite Rapids has no SSE4A, so the first one executed raises #UD, killing the process with SIGILL during witness generation. That is what turned every row of #605's benchmark into a crash. Pin the measured intersection of the two CPUs instead. x86-64-v4 covers every AVX-512 subset Plonky3 uses; +avx512vbmi2 preserves its VPSHRDQ interleave and +gfni preserves LLVM's byte-shift lowering. A workspace built with these flags contains no instruction absent from either vendor and has an instruction vocabulary identical to a graniterapids build. blake3 dispatches on CPUID at runtime and is unaffected either way. `.cargo/config.toml` keeps `-Ctarget-cpu=native`: a developer builds and runs on one machine, and x86-64-v4 would exclude every host without AVX-512. Only CI has the split, so only CI pins the ISA. The new guard fails the job when a runner lacks a required feature, so the assumption is enforced rather than assumed, and the shared `warp-x64` cargo cache key becomes sound now that codegen no longer varies by host. Pinning also removes a benchmarking hazard that never crashed: LLVM sets prefer-256-bit for Granite Rapids but not for Zen 5, so the same source vectorized 3.2x more widely depending on the build host, and main-vs-PR timings were not comparable across a vendor split. Drop the CPU-mismatch warning the benchmark comment used to carry. It detected a real problem, but the flags above prevent that problem, and computing it in one job to render it in another cost a Markdown file threaded through cache entries, artifacts, and a `--warning-file` flag on `ix bench compare`. Warnings belong to the run that finds them.
arthurpaulino
commented
Sep 1, 2026
!benchmark fresh |
|
The Warp x64 runner pool mixes Intel Granite Rapids and AMD Zen 5, and a build job may land on one vendor while the job that runs its binaries lands on the other. Neither vendor's feature set contains the other's, so `-Ctarget-cpu=native` does not produce a portable binary: Zen 5 enables SSE4A, and LLVM emits it. Disassembling the workspace built for znver5 finds 31 SSE4A instructions, all INSERTQ, in `ix-ffi` and in `aiur_ixvm_witness::add_entries_parallel`. Granite Rapids has no SSE4A, so the first one executed raises #UD, killing the process with SIGILL during witness generation. That is what turned every row of #605's benchmark into a crash. Pin the measured intersection of the two CPUs instead. x86-64-v4 covers every AVX-512 subset Plonky3 uses; +avx512vbmi2 preserves its VPSHRDQ interleave and +gfni preserves LLVM's byte-shift lowering. A workspace built with these flags contains no instruction absent from either vendor and has an instruction vocabulary identical to a graniterapids build. blake3 dispatches on CPUID at runtime and is unaffected either way. `.cargo/config.toml` keeps `-Ctarget-cpu=native`: a developer builds and runs on one machine, and x86-64-v4 would exclude every host without AVX-512. Only CI has the split, so only CI pins the ISA. The new guard fails the job when a runner lacks a required feature, so the assumption is enforced rather than assumed, and the shared `warp-x64` cargo cache key becomes sound now that codegen no longer varies by host. RUSTFLAGS is hashed into that key, so the flag change rotates it on its own. Pinning also removes a benchmarking hazard that never crashed: LLVM sets prefer-256-bit for Granite Rapids but not for Zen 5, so the same source vectorized 3.2x more widely depending on the build host, and main-vs-PR timings were not comparable across a vendor split.
d7fc2f1 to
feb014dComparesamuelburnham
commented
Sep 1, 2026
!benchmark fresh |
|
| constant | execute-time (main) | execute-time (PR) | Δ% | prove-time (main) | prove-time (PR) | Δ% | throughput (const/s) (main) | throughput (const/s) (PR) | Δ% | peak-ram (main) | peak-ram (PR) | Δ% | proof-size (main) | proof-size (PR) | Δ% | verify-time (main) | verify-time (PR) | Δ% | fft-cost (main) | fft-cost (PR) | Δ% |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ByteArray.utf8DecodeChar?_utf8EncodeChar_append | 9.269 s | 9.073 s | -2.1% | 31.250 s | 30.269 s | -3.1% 🟢 | 88.800 | 91.680 | +3.2% 🟢 | 70.72 GiB | 72.28 GiB | +2.2% | 11.33 MiB | 11.06 MiB | -2.4% | 68.5 ms | 62.7 ms | -8.5% (1.09× faster) 🟢 | 134.35B | 134.35B | +0.0% |
Char.ofOrdinal_le_of_le | 6.964 s | 6.879 s | -1.2% | 26.884 s | 25.793 s | -4.1% 🟢 | 102.780 | 107.120 | +4.2% 🟢 | 63.83 GiB | 65.31 GiB | +2.3% | 11.33 MiB | 11.07 MiB | -2.3% | 77.9 ms | 59.3 ms | -23.8% (1.31× faster) 🟢 | 102.60B | 102.60B | +0.0% |
Array.extract_append | 6.676 s | 6.751 s | +1.1% | 23.925 s | 23.179 s | -3.1% 🟢 | 67.130 | 69.290 | +3.2% 🟢 | 51.97 GiB | 52.72 GiB | +1.4% | 11.24 MiB | 10.99 MiB | -2.2% | 71.1 ms | 57.2 ms | -19.5% (1.24× faster) 🟢 | 97.08B | 97.08B | +0.0% |
Std.HashMap | 4.171 s | 4.079 s | -2.2% | 16.222 s | 15.628 s | -3.7% 🟢 | 125.880 | 130.670 | +3.8% 🟢 | 36.29 GiB | 37.10 GiB | +2.2% | 11.26 MiB | 11.01 MiB | -2.2% | 74.8 ms | 66.6 ms | -11.0% (1.12× faster) 🟢 | 61.88B | 61.88B | +0.0% |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq | 3.697 s | 3.648 s | -1.3% | 14.858 s | 14.287 s | -3.8% 🟢 | 125.650 | 130.680 | +4.0% 🟢 | 34.02 GiB | 34.75 GiB | +2.1% | 11.26 MiB | 11.00 MiB | -2.2% | 75.5 ms | 57.7 ms | -23.6% (1.31× faster) 🟢 | 55.68B | 55.68B | +0.0% |
String.append | 435.5 ms | 434.0 ms | -0.4% | 2.307 s | 2.129 s | -7.7% (1.08× faster) 🟢 | 141.750 | 153.600 | +8.4% (1.08× faster) 🟢 | 5.74 GiB | 5.52 GiB | -3.9% 🟢 | 9.94 MiB | 9.74 MiB | -2.1% | 64.4 ms | 50.2 ms | -22.1% (1.28× faster) 🟢 | 3.37B | 3.37B | +0.0% |
Nat.add_comm | 267.1 ms | 264.3 ms | -1.1% | 1.068 s | 984.9 ms | -7.8% (1.08× faster) 🟢 | 43.060 | 46.710 | +8.5% (1.08× faster) 🟢 | 4.51 GiB | 3.99 GiB | -11.5% (1.13× smaller) 🟢 | 9.09 MiB | 8.90 MiB | -2.1% | 53.3 ms | 47.9 ms | -10.2% (1.11× faster) 🟢 | 308.40M | 308.40M | +0.0% |
FRI verifier on FRI (7 constants)
| constant | execute-time (main) | execute-time (PR) | Δ% | prove-time (main) | prove-time (PR) | Δ% | throughput (const/s) (main) | throughput (const/s) (PR) | Δ% | peak-ram (main) | peak-ram (PR) | Δ% | proof-size (main) | proof-size (PR) | Δ% | verify-time (main) | verify-time (PR) | Δ% | fft-cost (main) | fft-cost (PR) | Δ% |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ByteArray.utf8DecodeChar?_utf8EncodeChar_append | 5.680 s | 4.975 s | -12.4% (1.14× faster) 🟢 | 33.109 s | 30.692 s | -7.3% (1.08× faster) 🟢 | 83.820 | 90.410 | +7.9% (1.08× faster) 🟢 | 101.44 GiB | 99.74 GiB | -1.7% | 3.97 MiB | 3.98 MiB | +0.2% | 26.3 ms | 22.3 ms | -15.4% (1.18× faster) 🟢 | 210.23B | 203.74B | -3.1% 🟢 |
Char.ofOrdinal_le_of_le | 5.599 s | 5.014 s | -10.5% (1.12× faster) 🟢 | 32.280 s | 31.379 s | -2.8% | 85.590 | 88.050 | +2.9% | 99.81 GiB | 101.09 GiB | +1.3% | 3.97 MiB | 3.98 MiB | +0.2% | 27.6 ms | 28.6 ms | +3.6% | 207.18B | 208.08B | +0.4% |
Array.extract_append | 5.315 s | 4.858 s | -8.6% (1.09× faster) 🟢 | 30.962 s | 29.672 s | -4.2% 🟢 | 51.870 | 54.120 | +4.3% 🟢 | 95.00 GiB | 95.36 GiB | +0.4% | 3.97 MiB | 3.99 MiB | +0.4% | 26.0 ms | 39.4 ms | +51.3% (1.51× slower) | 200.65B | 200.40B | -0.1% |
Std.HashMap | 5.445 s | 4.864 s | -10.7% (1.12× faster) 🟢 | 31.021 s | 29.949 s | -3.5% 🟢 | 65.830 | 68.180 | +3.6% 🟢 | 94.50 GiB | 95.90 GiB | +1.5% | 3.97 MiB | 3.98 MiB | +0.2% | 25.4 ms | 25.6 ms | +0.8% | 203.35B | 204.11B | +0.4% |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq | 5.496 s | 4.898 s | -10.9% (1.12× faster) 🟢 | 32.335 s | 29.501 s | -8.8% (1.10× faster) 🟢 | 57.740 | 63.290 | +9.6% (1.10× faster) 🟢 | 98.72 GiB | 95.35 GiB | -3.4% 🟢 | 3.97 MiB | 3.98 MiB | +0.3% | 25.9 ms | 31.9 ms | +23.0% (1.23× slower) | 205.59B | 199.65B | -2.9% |
String.append | 4.487 s | 3.955 s | -11.8% (1.13× faster) 🟢 | 28.710 s | 27.141 s | -5.5% (1.06× faster) 🟢 | 11.390 | 12.050 | +5.8% (1.06× faster) 🟢 | 87.89 GiB | 88.65 GiB | +0.9% | 3.97 MiB | 3.97 MiB | +0.1% | 37.6 ms | 27.4 ms | -27.2% (1.37× faster) 🟢 | 168.67B | 164.80B | -2.3% |
Nat.add_comm | 3.619 s | 3.077 s | -15.0% (1.18× faster) 🟢 | 19.611 s | 17.954 s | -8.5% (1.09× faster) 🟢 | 2.350 | 2.560 | +8.9% (1.09× faster) 🟢 | 58.66 GiB | 58.03 GiB | -1.1% | 3.97 MiB | 3.98 MiB | +0.2% | 27.6 ms | 22.0 ms | -20.4% (1.26× faster) 🟢 | 130.84B | 124.20B | -5.1% (1.05× fewer) 🟢 |
Pipeline total (7 constants)
| constant | total-time (main) | total-time (PR) | Δ% | pipeline-throughput (const/s) (main) | pipeline-throughput (const/s) (PR) | Δ% | pipeline-peak-ram (main) | pipeline-peak-ram (PR) | Δ% |
|---|---|---|---|---|---|---|---|---|---|
ByteArray.utf8DecodeChar?_utf8EncodeChar_append | 1m 4.4s | 1m 1.0s | -5.3% (1.06× faster) 🟢 | 43.120 | 45.520 | +5.6% (1.06× faster) 🟢 | 101.44 GiB | 99.74 GiB | -1.7% |
Char.ofOrdinal_le_of_le | 59.164 s | 57.172 s | -3.4% 🟢 | 46.700 | 48.330 | +3.5% 🟢 | 99.81 GiB | 101.09 GiB | +1.3% |
Array.extract_append | 54.887 s | 52.851 s | -3.7% 🟢 | 29.260 | 30.390 | +3.9% 🟢 | 95.00 GiB | 95.36 GiB | +0.4% |
Std.HashMap | 47.243 s | 45.577 s | -3.5% 🟢 | 43.220 | 44.800 | +3.7% 🟢 | 94.50 GiB | 95.90 GiB | +1.5% |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq | 47.193 s | 43.788 s | -7.2% (1.08× faster) 🟢 | 39.560 | 42.640 | +7.8% (1.08× faster) 🟢 | 98.72 GiB | 95.35 GiB | -3.4% 🟢 |
String.append | 31.017 s | 29.270 s | -5.6% (1.06× faster) 🟢 | 10.540 | 11.170 | +6.0% (1.06× faster) 🟢 | 87.89 GiB | 88.65 GiB | +0.9% |
Nat.add_comm | 20.680 s | 18.939 s | -8.4% (1.09× faster) 🟢 | 2.220 | 2.430 | +9.5% (1.09× faster) 🟢 | 58.66 GiB | 58.03 GiB | -1.1% |
#606) * Authenticate all frontier group members in the recursive verifier The in-circuit pruned-multiproof walk (mmcs_verify_multi / frontier_level) collapses queries that share a parent to a single lead node and hashes only the lead's rows via inject_maybe(ar, ...). Non-lead members' opened rows for the shorter (injected) matrices were still consumed in their own per-query FRI arithmetic (batch_views_at) but never authenticated against any commitment — the leaf hash covers only the tallest matrices, and shorter ones are bound solely through injection. A prover could therefore forge a non-lead member's shorter-matrix opening. Plonky3's reference verify_batch_pruned guards exactly this with InconsistentGroupOpening (and InconsistentDuplicateOpenings for equal-index queries); the port had neither. The prior per-query walk did not have the gap, so it was introduced with the direct multiproof consumption. - frontier_level: on a group merge, assert the lead and member agree on every not-yet-injected matrix (height <= next_lh) via select_rows_le + pointer equality. Transitive across pairwise merges, so the whole group is pinned; matches InconsistentGroupOpening. - frontier_merge: duplicate transcript indices must open the SAME full rows, not merely the same tallest-matrix leaf digest; matches InconsistentDuplicateOpenings. Pointer equality is admissible inside assert_eq! (equal pointers imply equal content; a spurious mismatch costs only completeness — see IxVM.Core). select_rows_le selects rows of matrices at height <= target, mirroring select_rows. Validated: the group-merge branch is genuinely reached by the factorial recursion proof (an always-false variant of the new assert fails the honest test), the honest proof still verifies with the real assert (completeness preserved), the existing tamper tests still reject, and the full lake test suite is green (2717 checks). aiur_multi_stark.rs regenerated; kernel executor unchanged. * Drop the multi_stark::advice dependency Companion to multi-stark removing its unused per-query advice module. ix consumed native pruned multiproofs directly and referenced only advice::AdviceError, whose two arms (verification failed, serialization failed) were immediately string-formatted by the FFI. Replace it with a plain Result<Vec<u8>, String>: AiurSystem::proof_to_advice_bytes maps both failures to a message, and the FFI passes the string straight to LeanExcept::error_string. No behavior change; the Lean binding (Except String ByteArray) is unaffected. Bump the multi-stark pin to the advice-removed revision. Requires that multi-stark's ap/bump-p3-drop-advice be pushed first, exactly as with every other pin in this series. * Bump multi-stark audit revision --------- Co-authored-by: Arthur Paulino <arthurleonardo.ap@gmail.com>
Update the multi-stark dependency and Rust toolchain for Plonky3 0.6, along with the Rust 1.98 lint migrations required to keep the workspace warning-free. Refresh the Rust-compatible Blake3.lean pin in both root and compile-package manifests.
Adapt recursive Aiur verification to Plonky3's pruned FRI multiproofs. Native proofs retain their compact serialized representation and native verification path; the FFI expands authenticated Merkle frontiers into per-query advice only when entering the existing recursive verifier circuit.
Preserve the packed claim-digest convention in the recursion diagnostic and exercise the advice boundary in the end-to-end test and benchmark paths. CPU and CUDA recursive q1 runs produce identical 823,485-byte inner proofs and 331,273-byte outer proofs.
The q50 Vector.extract_append workload retains identical CPU/CUDA proof sizes. Inner plus outer STARK proving measures 65.87s on CPU and 8.81s with CUDA on the RTX PRO 6000, a 7.48x speedup.