Repository navigation
perf(recursion): cut the recursion verifier guest to 44.9M trace rows at inner 2^12 (43.2% below #1911) - #2143
Open
Acentelles wants to merge 107 commits into
Open
Acentelles wants to merge 107 commits into
Acentelles wants to merge 107 commits into
Conversation
l3-compression-weights on jolt-akita, the recursion host and the recursion guest selects Akita's factored evaluation of the compression relation weights (same field values). Feature-off guests compile byte for byte as before: only Cargo feature tables and host-only code change.
The recursion example enables l3-compression-weights by default. The feature forwards weakly (jolt-akita?/l3-compression-weights) and the host adds the guest feature only together with akita, so Dory builds are unchanged. --no-default-features turns it off. Host-side Cargo and cfg changes only.
Adds l2-terminal-quotient to jolt-akita (enabling akita-pcs's feature), the recursion host and the verifier guest, the host's guest-feature line, and a tamper-l2 tool for the rejection fixtures (quotient flip, noncanonical, extra, short, response flip). Feature-off guest sources are untouched.
The recursion example enables l2-terminal-quotient by default next to l3-compression-weights. The feature forwards weakly (jolt-akita?/l2-terminal-quotient), and the host's guest-feature line, the tamper-l2 command and its helpers are compiled only together with akita, so Dory builds are unchanged and Akita builds prove and verify with the quotient certificate. --no-default-features turns both off. Host-side Cargo and cfg changes only.
Adds the word-decode and word-transcript features: Fp128 proof elements are deserialized from fixed 16-byte tuples with register-sized accumulators, and transcript scalars can be absorbed as whole words. Both are off by default.
The recursion example enables word-decode by default next to the factored compression weights and the terminal quotient certificate. The feature forwards weakly (jolt-akita?/word-decode) and the host forwards it to the guest only together with akita, so Dory builds are unchanged. --no-default-features turns all three off. Host-side Cargo and cfg changes only.
The recursion example enables word-memory by default next to the factored compression weights, the terminal quotient certificate and word decoding. The host forwards it to the guest only together with akita, so Dory builds are unchanged. --no-default-features turns all four off. Host-side Cargo and cfg changes only.
The recursion example's default features use Akita changes that are not in LayerZero-Labs/akita yet. Pin the Akita crates to the fork commit that carries them so a fresh checkout builds the measured configuration.
…hold 1000 and one codegen unit by default The recursion host now builds the verifier guest with ZEROOS_GUEST_RUSTFLAGS=-Cllvm-args=-inline-threshold=1000 and CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1 (new default feature guest-codegen). The settings apply to the verifier guest build only; the inner guests and their proofs are unchanged. A value the caller already set for either variable wins. RECURSION_GUEST_CODEGEN=off, or building without the feature (--no-default-features), restores the stock guest build. Host-side Cargo and source changes only.
…to 1750 The guest-codegen default for the recursion verifier guest build moves from -Cllvm-args=-inline-threshold=1000 to -Cllvm-args=-inline-threshold=1750, still with one codegen unit. Thresholds of 2000 and above fail to link the guest. A caller value for ZEROOS_GUEST_RUSTFLAGS still wins, and RECURSION_GUEST_CODEGEN=off restores the stock guest build. Host-side source change only; the inner guests and their proofs are unchanged.
…cursion verifier guest build The guest-codegen default for the recursion verifier guest build adds -Cllvm-args=-enable-gvn-hoist and -Cllvm-args=-enable-dfa-jump-thread to -Cllvm-args=-inline-threshold=1750, still with one codegen unit. A caller value for ZEROOS_GUEST_RUSTFLAGS still wins, and RECURSION_GUEST_CODEGEN=off restores the stock guest build. Host-side source change only; the inner guests and their proofs are unchanged.
…he recursion verifier guest build The guest-codegen default for the recursion verifier guest build adds -Cllvm-args=-enable-ext-tsp-block-placement and -Cllvm-args=-enable-tail-merge=false to the existing inline threshold, GVN hoisting and DFA jump threading flags, still with one codegen unit. A caller value for ZEROOS_GUEST_RUSTFLAGS still wins, and RECURSION_GUEST_CODEGEN=off restores the stock guest build. Host-side source change only; the inner guests and their proofs are unchanged.
The verifier_api test verifies Dory fixtures with VerifierPCS (Dory). With jolt-sdk's akita feature, jolt_verifier::verify is the Akita path, whose OneHotTrace metadata bounds Dory does not implement, so the test target failed to compile (E0277) whenever akita was unified into jolt-sdk, for example through the recursion example's akita feature. Gate the test to builds without akita, like verifier_preprocessing_from_prover.
…erifier guest build The guest-codegen default for the recursion verifier guest build adds -Cllvm-args=-split-spill-mode=size to the existing inline threshold, GVN hoisting, DFA jump threading, ExtTSP block placement and no tail merging flags, still with one codegen unit. A caller value for ZEROOS_GUEST_RUSTFLAGS still wins, and RECURSION_GUEST_CODEGEN=off restores the stock guest build. Host-side source change only; the inner guests and their proofs are unchanged.
…e recursion verifier guest build The guest-codegen default for the recursion verifier guest build adds -Cllvm-args=-riscv-disable-cost-per-use=true to the existing inline threshold, GVN hoisting, DFA jump threading, ExtTSP block placement, no tail merging and size-oriented spill splitting flags, still with one codegen unit. A caller value for ZEROOS_GUEST_RUSTFLAGS still wins, and RECURSION_GUEST_CODEGEN=off restores the stock guest build. Host-side source change only; the inner guests and their proofs are unchanged.
The recursion host enables tensor-no-carry by default (weak dependency on jolt-akita, as the other default verifier arms) and forwards it to the verifier guest. The guest's Akita separates dense residual equality weights into a high-part sum and a no-carry low span; the field values, proofs and transcripts are unchanged. Turn it off with --no-default-features.
…tractions Moves the Acentelles/akita-lz pin from 9db4ee25 to a6a34dcf, which is 9db4ee25 plus the optional no-carry tensor contraction (feature tensor-no-carry). Cargo.lock changes only the git source revisions.
Put each attribute of the terminal-contraction items in algebra.rs, field_inline.rs and solinas/fp128.rs on its own line, as cargo fmt --check requires. Formatting only; no code change.
…revalidated catalog
Acentelles
marked this pull request as ready for review
October 28, 2026 09:35
b90491fa is the previous pin bcc1f30c plus four optional, default-off verifier features and one comment-only commit: lazy-scan-errors (the setup-scan kernels build InvalidProof only on the failure path), digest-nozero (the prevalidated verifier view copies its row digests without zero-filling first), golomb-word (doubleword table and packed doubleword stores in the terminal z Golomb-Rice decoder) and fill-ingress (each bounded equality-fill run is scaled through Field::scale_slice_into). With the features off the Akita sources keep every line. Only the pin, its comment and the lockfile sources change.
Each feature keeps the field values, proofs and transcripts and is forwarded from the recursion host to the verifier guest (and to the host's Akita) only when `akita` is enabled: - lazy-scan-errors: Akita's setup-scan kernels build InvalidProof only on the failure path. - digest-nozero: with prevalidated-catalog, the verifier view rebuild copies its row digests without zero-filling first. - golomb-word: doubleword trailing-ones table and packed doubleword stores in Akita's terminal z Golomb-Rice decoder. - bytecode-fold (jolt-claims): the stage 6b bytecode read-RAF fold indexes its flag classes through a direct word table, with open addressing kept for keys beyond it; same classes, sums and first error. - fill-ingress (jolt-field, Akita): Field::scale_slice_into, which a field-inline Fp128 guest serves by loading the scale once per slice; Akita's bounded equality fill scales each run through it. All five are off by default.
lazy-scan-errors, digest-nozero, golomb-word, bytecode-fold and fill-ingress join the recursion host's default features, after weighted-dot-horner-triplet. Builds without `akita` do not pull Akita in; `--no-default-features` turns all of them off.
Clippy's semicolon_if_nothing_returned (pedantic, denied by -D warnings) flags the unit-valued tail call in Fp128's scale_slice_into. Adding the semicolon does not change the generated code.
b215e829 is the previous pin b90491fa plus the optional, default-off setup-lane-streams root setup scan (each lane streamed with its row scales hoisted; implies terminal-contraction) and its import gate. With the feature off the Akita sources keep every line. Only the pin, its comment and the lockfile sources change.
…t feature jolt-akita forwards setup-lane-streams to akita-pcs. The recursion host reaches it through a weak dependency edge and forwards it to the verifier guest only with akita, so builds without akita do not pull akita in. Field values, proofs, Akita proof bytes and transcripts are unchanged.
The recursion host enables setup-lane-streams by default and forwards it to the verifier guest, so the stock feature list builds with it. Field values, proofs, Akita proof bytes and transcripts are unchanged. Turn it off with --no-default-features.
The generated prevalidated catalog file stored the view bytes as an alignment-1 array. The run-time check compares them with the setup copy, which is 8-aligned, and the comparison takes its word loop only when both addresses agree modulo 8. Depending on how the guest data happened to be laid out, the comparison could fall into its byte loop. Store the bytes in an 8-aligned wrapper so the comparison stays on the word path. The bytes, digests and accept set are unchanged.
d04bf51f is the previous pin b215e829 plus the optional, default-off compiled carry-state graphs for the eq-pair tensor recurrences (akita-algebra/carry-graph). With the feature off the Akita sources keep every line. Only the pin, its comment and the lockfile sources change.
With `carry-graph` (and `akita`), the host reads the padded trace length shared by the inner proofs in the stream it is about to verify, emits Akita's fixed carry-state graph source for that size, and names the file in JOLT_CARRY_GRAPH_RS for the verifier guest build only. The guest then evaluates the eq-pair tensor recurrences through the compiled graphs. The graphs depend only on the size, never on a proof's values. If the proofs do not share one supported size, or RECURSION_CARRY_GRAPH=off, the file holds no graph and the guest keeps the recurrence path. The graph file is part of the guest build cache key.
9f778c0c is the previous pin d04bf51f plus two optional, default-off verifier features: MLE leaf tiles (akita-algebra/mle-leaf-tiles) and signed-byte challenge evaluation (akita-challenges/signed-byte-sum). With both features off the Akita sources keep every line. Only the pin, its comment and the lockfile sources change.
…um verifier guest features Two optional verifier features, both default off and both effective only with `akita`; each is forwarded to the verifier guest and to the host's Akita. Same field values, proofs and transcripts. - mle-leaf-tiles: Akita evaluates low-variable multilinear extensions by fixed leaf tiles (akita-pcs/mle-leaf-tiles). - signed-byte-sum: Akita evaluates a sparse challenge at powers by taking its signed byte coefficients in through one field sum. jolt-field gains the matching default-off feature `signed-byte-sum`: Field::sum_signed_bytes (a generic fold) and, in the field-inline guest, an Fp128 override that accumulates each nonzero coefficient's magnitude in the field accumulator register. tests/signed_byte_sum.rs checks the integer contract, including i8::MIN and the empty sum, for both 128-bit Solinas primes.
Both features join the recursion example default list. Turn them off with --no-default-features plus the other defaults.
13128559 is the previous pin 9f778c0c plus two optional, default-off verifier features: setup-weight tiles in the direct setup scan (akita-verifier/setup-weight-tiles) and word-level challenge decode (akita-challenges/challenge-word-decode). With both features off the Akita sources keep every line. Only the pin, its comment and the lockfile sources change.
…t feature New feature jolt-field/setup-weight-tiles: Field::add_scaled_slice adds scale * src[i] to dst[i] over the shorter slice. The default is the plain loop; the field-inline Fp128 guest path keeps the scale in a field register and adds each product to its destination through the field register add, four elements per tile, then checks every result as a canonical value. Same field values; tests/setup_weight_tiles.rs compares it with the plain loop on random and boundary inputs for both 128-bit primes. The feature is forwarded recursion -> jolt-akita -> akita-pcs (whose direct setup scan uses it) and to the verifier guest. Default off.
…uest feature Forwards Akita's akita-challenges/challenge-word-decode (through jolt-akita and akita-pcs) to the recursion host and the verifier guest. With it on, sampling a signed sparse challenge decodes positions and signs from whole 64-bit SHAKE output words instead of byte by byte; same consumption, rejection and challenges. Default off.
… by default Both features join the recursion default list after signed-byte-sum. They are forwarded in the weak form (jolt-akita?/...), so --no-default-features builds are unchanged and the defaults take effect only with akita. No Akita default changes.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This branch builds on #1911's recursion example, whose guest verifies one Akita proof of an inner Jolt proof inside Jolt. It makes that verifier guest execute 43.2% fewer trace rows at inner$2^{12}$ (44,896,354 against #1911's 79,032,888) and 41.4% fewer at inner $2^{20}$ . No change alters what the verifier checks or the Jolt proof format; every change sits behind a feature of the recursion example and can be turned off.
What changes
Jolt verifier and field code (feature of the recursion example in brackets; dropping it turns the change off):
jolt-inlines/blake2): packed Spongefish prefix compressions are computed once and reused.word-decode): Fp128 proof elements are decoded from fixed 16-byte tuples with register-sized accumulators, with the same canonicality checks.word-memory): exact RV64 doublewordmemcpyandmemcmp, linked as strong symbols; misaligned copies combine aligned loads by shifts, tails are byte-exact.rowptr-registers): the field-inline weighted dot keeps each block's row base pointers in registers instead of reloading them on every term.weighted-dot-horner): when the 64 weights are the powersweighted-dot-horner-triplet, implies the previous one): full five-row blocks of 64 two-limb elements advance three coefficients per step through the existing load-accumulate offsets; other shapes keep the one-coefficient path.immutable-recipes, enabled by the build command, not a Cargo default): the host verifies each embedded proof natively and compiles the closed form of every stage claim expression into the guest as a coefficient table; the guest evaluates claims from the table and falls back to the expression tree for any missing key, too-wide term, zero-knowledge mode or other field. If native verification fails, the tables are empty.terminal-contraction, forwarded to Akita): terminal ring relations are contracted with signed 16-bit coefficients, and the hot weighted-dot kernels and Akita's fused setup-scan job are forced inline.prevalidated-catalog, forwarded to Akita): the host validates the setup's one-hot catalog view with Akita's canonical loader and records the validated values; the guest reuses them only when the bytes it reads equal the recorded ones, and otherwise runs the validating loader. The generated file stores the recorded view bytes in an 8-byte-aligned static. The setup copy they are compared with is also 8-aligned, so the guest'smemcmpalways takes its doubleword loop, whatever the data layout of the guest image. The bytes and checks are unchanged.lazy-scan-errors, forwarded to Akita): Akita's setup-scan kernels and fused scan job buildInvalidProofonly on the failure path instead of building it and dropping it on success; same results, checks and first error.digest-nozero, impliesprevalidated-catalog, forwarded to Akita): the prevalidated verifier view rebuild takes the row digests as the 32-byte chunks of the view bytes instead of zero-filling a vector and overwriting it.golomb-word, forwarded to Akita): the terminali16values, with the same checks, conversion order and first error.bytecode-fold,jolt-claims): the stage 6b bytecode read-RAF fold finds each flag class through a direct word table keyed by the packed instruction tag instead of hashing, with open addressing kept for larger keys; same classes, sums and first error.fill-ingress,jolt-fieldand Akita): newField::scale_slice_intocomputesdst[i] = src[i] * scale; the field-inline Fp128 guest loads the scale into a field register once per slice, and Akita's bounded equality fill scales each run through it. The zero and one shortcuts and the checks are unchanged.setup-lane-streams, forwarded to Akita, impliesterminal-contraction): the root multi-group setup scan accumulates each lane of a setup segment as one stream, scaling its row weight once per lane, instead of dispatching every setup weight through the per-weight role combination; same field values, checks and errors.carry-graph, forwarded to Akita): before building the verifier guest, the host reads the padded trace length shared by the embedded inner proofs and emits Akita's fixed carry-state graphs for that size into a generated source file that the guest compiles in. The guest then evaluates the eq-pair tensor recurrences of the Akita verifier by following these graphs instead of rediscovering the carry states at run time. The graphs depend only on the trace size, never on proof values. If the proofs do not share one supported size, or withRECURSION_CARRY_GRAPH=off, the file holds no graph and every evaluation takes the existing recurrence path; any shape mismatch also falls back. Same field values, checks and errors.mle-leaf-tiles, forwarded to Akita): Akita evaluates the multilinear extensions of low-variable tables through fixed leaf tiles instead of the generic halving fold. Same field values, checks and errors.signed-byte-sum,jolt-fieldand Akita): newField::sum_signed_bytescomputessetup-weight-tiles,jolt-fieldand Akita): newField::add_scaled_sliceaddsscale * src[i]todst[i]over the shorter slice. The field-inline Fp128 guest keeps the scale in a field register and adds each product to its destination with the field register add, four elements per tile, then checks every result as a canonical value; Akita's direct setup scan takes its setup weights through it in fixed tiles instead of one weight at a time. Same field values, checks and errors.challenge-word-decode, forwarded to Akita): sampling a signed sparse fold challenge reads the SHAKE output a 64-bit word at a time and decodes positions and signs from the word instead of byte by byte. Same stream consumption, rejections and challenges.Akita verifier changes, through the Akita pin: factored compression weights (
l3-compression-weights), a terminal quotient certificate (l2-terminal-quotient), batched reduced setup rows, signed sparse challenge evaluation, static operator-norm tables, no-carry tensor contraction (tensor-no-carry), tensor equality run accumulation (tensor-eq-runs), structured setup-scan sums of products (setup-sop-structured) a segment-wise shared setup scan (segment-setup), and the Akita halves of the lazy setup-scan errors, digests without a zero fill, doubleword Golomb-Rice decode, equality-fill scaling and streamed setup lanes above, the compiled carry-state graphs (akita-algebra/carry-graph), the MLE leaf tiles (akita-algebra/mle-leaf-tiles), the signed-byte challenge evaluation (akita-challenges/signed-byte-sum), the setup-weight tiles (akita-verifier/setup-weight-tiles) and the word-level challenge decode (akita-challenges/challenge-word-decode).Verifier guest build, host side only:
guest-codegen;RECURSION_GUEST_CODEGEN=off): one codegen unit, no debug information, inline threshold 1750 and a set of LLVM code-generation options (GVN hoisting, DFA jump threading, ExtTSP block placement without tail merging, size-oriented spill splitting, no RISC-V cost-per-use model, PHI-elimination edge splitting, spill-copy elimination, post-RA scheduling). Inner guests keep the workspace release profile.RECURSION_GUEST_LINK_ORDER=off): the verifier guest is linked with a one-line lld symbol ordering file that places__default_main_entrynext to ZeroOS's__main_entrystub, whosejreaches only 1 MiB. No guest or ZeroOS code changes.RECURSION_WRITE_IF_CHANGED=off): unchanged generated sources are not rewritten; an optional cache (RECURSION_GUEST_ELF_CACHE=<dir>) skips rebuilding an unchanged verifier guest.Why and benefit
Recursion cost is the number of RISC-V trace rows the verifier guest executes, since that sets the size of the outer proof. Most rows went to the Akita verifier: evaluating the public setup at every fold level, compression and tensor equality weights, re-validating data the host already validated, and field arithmetic with poor register use. The changes remove repeated work, replace arithmetic by cheaper identities that give the same values, and let the compiler keep hot values in registers.
Total trace rows (real plus virtual) of the verifier guest, measured on this branch as published:
c2c45df3b)c2c45df3bPer change, measured cumulatively on local builds (Akita from a local checkout; each delta is the change's effect at that point of the stack):
The last eight rows reach the main entry by a far call instead of the link order (+1 row). Measured separately at inner$2^{12}$ , the first three changes of the fifth-to-last row save about 337,000 rows together and its last two about 287,000. The local build of the compiled carry-state graphs predates the alignment of the generated catalog view (see testing): its view landed at an address 2 modulo 8, so its $2^{12}$ and 3,611,627 at $2^{20}$ , the MLE leaf tiles with the signed-byte challenge evaluation saved 842,544 and 1,281,541 against their previous head, and the setup-weight tiles with the word-level challenge decode save 543,132 and 5,171,312 against the previous head (see testing). The published tree is 1,375 rows below the local build at inner $2^{12}$ and 1,783 at $2^{20}$ .
memcmptook the byte loop; the next row adds the alignment. On the published tree, where the view is always 8-aligned, the compiled carry-state graphs saved 1,116,663 rows at innerProof sizes: the Jolt proof format is unchanged. The Akita proof is 72,672 bytes at inner$2^{12}$ and 75,817 at $2^{20}$ , unchanged by every change after the terminal quotient certificate. The terminal quotient certificate ($2^{12}$ and 4,009 at $2^{20}$ (about 5% of the Akita proof) and removes 9,784,020 and 9,945,515 trace rows. It is kept deliberately as an accepted trade; every other change leaves the Akita proof size unchanged. Trace rows are not prover time.
l2-terminal-quotient) is the one change that grows the Akita proof: it adds 2,992 and 3,056 bytes on this branch, and removes about 6.6 million trace rows at both sizes. Rebased onto current Jolt and Akita main, where Akita's parameters changed, it adds 4,025 bytes at innerHow it was tested
cargo fmt --all --check, the repository's style checker and Clippy with-D warnings(recursion feature sets, default and--no-default-featuresworkspace graphs) pass, and Akita's own Clippy with-D warnings, with Jolt's crates patched in, passes on the pinned Akita commit with its new features off and on.jolt-fieldClippy withsolinas,signed-byte-sumand withsolinas,setup-weight-tiles, and Akita's Clippy without and with the new features, the latter also onakita-challengesandakita-pcs, and with each of the two newest features on its own crate) passed on that host:RECURSION_FIB_N=74858) that is not in this branch.parallel, and on withlazy-scan-errors. For the compiled carry-state graphs, an Akita unit test compiles every graph used at innereval_at_powstests (seven, including a comparison with the dense polynomial at boundary points) pass on the new module, and ajolt-fieldtest checks the integer contract ofsum_signed_bytesfor every coefficient fromjolt-fieldtest comparesadd_scaled_slicewith the plain loop on random and boundary inputs (scales 0, 1 andjolt-field's default features, and the Akita root setup scan tests (the 2,048-point row oracle and both lane-stream tests) pass with the tiles on, with and withoutparallel. For the word-level challenge decode, the Akita sampler and fold-draw tests pass with the feature off, on, and on withparallel, and three new tests check word reads against canonical SHAKE output at every lane and rate boundary, rejection against the byte reference with the same stream position, and signs against the scalar path with exact consumption. New tests also cover word encoding, the word transcript and the word memory routines (jolt-platform/tests/word_memory.c).setup-weight-tilesandchallenge-word-decodeoff gives 45,441,307 rows at innertensor-eq-runs,setup-sop-structured,segment-setup,weighted-dot-hornerorimmutable-recipesoff, the guest ELF is byte-identical to the build without that change;RECURSION_GUEST_CODEGEN=offreproduced the earlier rows and ELF exactly.RECURSION_GUEST_LINK_ORDER=offthe same build fails to link, because the stub'sjto__default_main_entrywould need 1,109,678 bytes of reach; with the ordering file it links at both sizes.memcmp: it compares the generated catalog view (11,471 bytes at innermemcmpused its byte loop, about 13 rows per byte against under 1 on the doubleword loop. The remaining 541 rows were two smallermemcpylayout effects and the entry stub. The code was the same on both sides. The view bytes are now 8-aligned. In both guest images both copies sit at addresses divisible by 8, and the generator has unit tests for the alignment and the generated text.Risks
13128559, a commit on a fork fetched through theLayerZero-Labs/akitaURL. Seven of its changes are in the open Reduce recursive verifier rows and update the Jolt pin LayerZero-Labs/akita#277. Everything else in the pin is not yet in an Akita PR, notably the terminal quotient certificate (kept out of feat: Jolt logo #277 because it adds bytes to the Akita proof), the segment-wise setup scan, the inline fused setup-scan job, the prevalidated verifier view, and the five commits that add the Akita side of the lazy setup-scan errors, digests without a zero fill, doubleword Golomb-Rice decode and equality-fill scaling (plus one comment-only commit), the two commits that add the streamed setup lanes, the commit that adds the compiled carry-state graphs, the commit that adds the MLE leaf tiles and signed-byte challenge evaluation, and the two commits that add the setup-weight tiles and the word-level challenge decode. The pin should be moved to merged Akita before or soon after this merges.l2-terminal-quotientto keep the earlier format.--symbol-ordering-fileand Rust's per-function sections, for the verifier guest only. A ZeroOS entry stub with longer reach (for example atailcall) would make it unnecessary. The guest target path must not contain whitespace; the host checks this.sum_signed_bytesandadd_scaled_slicerun only in the guest and are covered by the accept, reject and repeat runs.word-memoryoverlaps perf(runtime): accelerate general RV64 guest memcpy and memmove #2142 onmemcpy; with both, this branch'smemcpybecomes perf(runtime): accelerate general RV64 guest memcpy and memmove #2142's fallback.How to turn it off
--no-default-features --features akita,field-inline,ntt-inline.l3-compression-weights,l2-terminal-quotient,word-decode,word-memory,guest-codegen,tensor-no-carry,rowptr-registers,tensor-eq-runs,setup-sop-structured,segment-setup,weighted-dot-horner,weighted-dot-horner-triplet,terminal-contraction,prevalidated-catalog,lazy-scan-errors,digest-nozero,golomb-word,bytecode-fold,fill-ingress,setup-lane-streams,carry-graph,mle-leaf-tiles,signed-byte-sum,setup-weight-tiles,challenge-word-decode;digest-nozeroneedsprevalidated-catalog,setup-lane-streamsneedsterminal-contraction); turning off the Horner rule means dropping both Horner features.immutable-recipes, or setRECURSION_IMMUTABLE_RECIPES=offto build with empty tables.RECURSION_GUEST_CODEGEN=off,RECURSION_GUEST_LINK_ORDER=off(links only while less than 1 MiB of code precedes the main entry, so not withprevalidated-catalog),RECURSION_WRITE_IF_CHANGED=offandRECURSION_CARRY_GRAPH=off(no graph: the recurrence path). A caller'sZEROOS_GUEST_RUSTFLAGSoverrides the build settings.Evidence
https://github.com/a16z/jolt/pull/2143/checks