Files
zeekayandHanzo Dev bf864eca57 Refuse proofs that choose their own difficulty
A STARK/FRI proof carries its own security parameters, and this
verifier read them without ever asking whether they were enough:
log_blowup and num_queries were range-checked in Header::decode and
then never consulted as policy. Every point on the accepted grid
verified, including log_blowup=1, num_queries=1 -- about one bit of
query-phase soundness, two attempts to forge.

Header::check_admissible is now the one place that decides, called
from Header::decode for proofs off the wire and from the kernel for a
ParsedProof assembled in memory. MIN_SOUNDNESS_BITS = 128, enforced
as log_blowup * num_queries, which is an exact integer product under
the capacity bound and so identical on every platform. A range check
could not express it: the admissible region is bounded by a product,
and no pair of per-field minimums draws that line.

The floor would have bought nothing on its own. Folding is linear, so
a prover who commits to an arbitrary word and folds it honestly
satisfies every Merkle opening, every colinearity check and the
final-polynomial evaluation -- a uniformly random word verified at 64
queries. The degree claim was never enforced anywhere: the ladder
leaves 2^(log_final_poly - log_blowup) coefficients alive and the wire
carries 2^log_final_poly of them, and nothing required the surplus to
be zero. check_claimed_degree does, and the header now requires
log_final_poly >= log_blowup so the ladder cannot run past degree 1.

The toy prover grows prove_word, which commits to a word rather than
to a polynomial -- the freedom an adversary has, and the only way to
test that the degree bound is real. Golden vectors are regenerated at
the cheapest admissible parameters (53 KB, up from 30 KB at 16
queries); every one of their 53,029 bytes is now shown to be
load-bearing.

What the floor does not fix: fold challenges come from the Goldilocks
BASE field, and the proximity-gap term scales as N^2/|F|, so provable
commit-phase soundness is at most 64 - 2*log_lde bits before
constants. No query count moves that. LLM.md carries the numbers.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-08 02:41:26 -07:00
..