Skip to content

perf(challenges): use signed accumulation for sparse evaluation - #268

Open
Acentelles wants to merge 2 commits into
LayerZero-Labs:markos/recursion-integrationfrom
Acentelles:perf/signed-sparse-challenge-evaluation
Open

Acentelles wants to merge 2 commits into
LayerZero-Labs:markos/recursion-integrationfrom
Acentelles:perf/signed-sparse-challenge-evaluation

Conversation

@Acentelles

@Acentelles Acentelles commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

SparseChallenge evaluation at a point now accumulates coefficients of magnitude one or two by signed addition in the extension field. Other coefficients are still embedded into the base field and multiplied in with a mixed base-field operation, and the ordinary base-field case is E = F.

Magnitude two is handled by repeating the term, which preserves the polynomial over every field. Inputs are validated as before: mismatched term counts, zero coefficients and out-of-range positions return an error.

There is no change to the proof, the transcript or the setup; only the verifier's arithmetic changes.

Changes

  • akita-challenges, challenge.rs: a signed-accumulation evaluator and its validation.

Measured effect (stacked; standalone not measured)

Standalone rows on this base are not measured. The figures below are total trace rows (real plus virtual) of Jolt's recursion example, whose guest verifies one Akita proof of an inner Jolt proof. Each was measured without and with this change, on two recursion integration builds that also carry the factored compression-weight evaluation and the terminal quotient certificate.

Build 1 was measured in two runs, on an AMD Ryzen 9 7950X host and an AMD EPYC 7B13 host; rows and guest ELFs are identical across the runs.

Inner proof Without With Difference
$2^{12}$ 68,927,710 68,257,497 -670,213
$2^{20}$ 167,526,238 162,763,883 -4,762,355

Build 2 adds further verifier changes and was measured in one run, on an AMD EPYC 7B13 host:

Inner proof Without With Difference
$2^{12}$ 68,380,552 67,710,339 -670,213
$2^{20}$ 166,866,977 162,104,622 -4,762,355

On build 2, the honest proof is accepted and a tampered proof is rejected, and the proof and tampered-proof bytes are identical with and without the change.

Reproduce

Run the a16z/jolt#1911 recursion example (--features akita,field-inline,ntt-inline, trace --embed) at inner $2^{12}$ and $2^{20}$ with the Akita dependency on this branch, then on ee03aa30, and compare the total rows.

Base

This PR targets markos/recursion-integration (ee03aa30), the recursion integration branch where this change was measured. It merges into main with the rest of that branch.

Current integration figures (whole stack, not this PR alone)

These are figures for the whole recursion integration stack: Jolt's recursion example with this PR's Akita changes together with the other changes on this branch, the Jolt-side verifier changes and the guest build settings. They are not a measurement of this PR alone.

Stack Inner $2^{12}$ rows Inner $2^{20}$ rows Hosts
Recursion head with these Akita changes 57,813,926 147,659,422 Census-reconciled on a Ryzen 9 5900XT; fold measured on EPYC 9124 and Ryzen 9 7950X
The same, with the follow-on no-carry tensor contraction fold 57,804,752 147,597,159 EPYC 9124

The Akita proof is 72,672 bytes at $2^{12}$ and 75,817 bytes at $2^{20}$ in both stacks, unchanged.

Receipt hashes (whole / closing):

  • census: 02a12d07 / 72c63ef2;
  • first fold: d23b9ab4 / 16ca914c;
  • follow-on fold: ea4ddf32 / f069836d.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant