Skip to content

Extend split-recursion to multiple proof systems - #1018

Draft
RobinJadoul wants to merge 5 commits into
spec/mainfrom
spec/split-recursion
Draft

RobinJadoul wants to merge 5 commits into
spec/mainfrom
spec/split-recursion

Conversation

@RobinJadoul

Copy link
Copy Markdown
Collaborator

No description provided.

@RobinJadoul RobinJadoul self-assigned this Oct 13, 2026
@RobinJadoul RobinJadoul added the spec Updates and improvements to the spec document label Oct 13, 2026
@github-actions

Copy link
Copy Markdown

Kimi Code Review

⚠️ Review failed: Kimi API request failed with status 401


Automated review by Kimi (Moonshot AI)

@github-actions

Copy link
Copy Markdown

Codex Code Review

  • Medium — Incorrect challenge-binding requirement (recursion.typ:271): The specification requires committing to [x, r] before revealing z, but the checksum compares witnesses [π, r]. Binding the public instance x leaves π adaptable after the challenge, invalidating the random-checksum soundness argument. Require both witness commitments c₀ and c₁ to be fixed before deriving the same z, and include both in the Fiat–Shamir transcript.

The diff changes only the specification; no executable-code issues were found.

@erik-3milabs erik-3milabs left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

general remarks:

  • replace pi by proof
  • replace r by record
  • you're opted to write $v(x; w)$ rather than $v(x,w)$. This is, however, contrary to all other notation in this document. Not saying it is wrong, but it should be clarified somewhere

Comment thread spec/chapters/recursion.typ Outdated
we will write $comm(x)$ and $comm2(x)$ as the (deterministic) commitments to $x$
in the proof system of $verify_0$ and $verify_1$ respectively.

If we write $verify'_(b)([c_x, c_w]; w)$ to be an adaptation of $verify_(b)(c_x; w)$ that additionally gives has a public commitment to the private witness,#footnote[

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • $v_b$ is not yet defined at this point. Or do you mean to use it as a variable that can be either 0 or 1? Eitherway, we should probably define this. Also, I don't know if $b$ is the right choice here.
  • Also, $v'$ was already used in 36.1.2, so we're somewhat overloading things here.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

b is indeed just a generic bit here

Comment thread spec/chapters/recursion.typ Outdated
we will write $comm(x)$ and $comm2(x)$ as the (deterministic) commitments to $x$
in the proof system of $verify_0$ and $verify_1$ respectively.

If we write $verify'_(b)([c_x, c_w]; w)$ to be an adaptation of $verify_(b)(c_x; w)$ that additionally gives has a public commitment to the private witness,#footnote[

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If we write $verify'_(b)([c_x, c_w]; w)$ to be an adaptation of $verify_(b)(c_x; w)$ that additionally gives has a public commitment to the private witness,#footnote[
If we write $verify'_(b)([c_x, c_w]; w)$ to be an adaptation of $verify_(b)(c_x; w)$ that is additionally given a public commitment to the private witness,#footnote[

?

Comment thread spec/chapters/recursion.typ Outdated

The first two statements would follow naturally from proving $verify_(b)$ or the derived $verify'_(b)$.
To integrate the last statement, we introduce a "checksum" of the witness, which will be checked by both halves of the split:
$ verify^*_(b)([x, s]; w) = verify'_(b)(x; w) dot (serif("cksum")(w) =^? s). $

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$v^*$ is used for a different purpose later on: we're overloading here.

Comment thread spec/chapters/recursion.typ Outdated

- $serif("cksum")(x) = serif("Hash")(x)$: compute a hash in both halves, at the cost of needing to evaluate a hash in a proof system that is likely not a good fit for that hash.
- $serif("cksum")(x) = comm2(x)$: recompute the commitment $comm2(x)$ as part of $verify^*_0$, and let $verify^*_1$ simply check that the checksum equals the public commitment.
In practice, this would come at the cost of evaluating a Reed-Solomon blowup over the field of $verify_0$ and computing a merkle tree, both inside $verify^*_0$.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In practice, this would come at the cost of evaluating a Reed-Solomon blowup over the field of [...]

This is an implementation detail not described anywhere else in the document.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair, it is mostly meant as a remark to argue why it's not a good/performant approach

Comment thread spec/chapters/recursion.typ Outdated
Finally, we consider the instantiation $serif("chsum")(x) = chevron.l x, z chevron.r$ for a random zero-evader $z$.
This could be implemented by having an additional public input provided to $verify^*_(b)$, or by having $verify^*_(b)$ itself
derive it from the public inputs and context as a Fiat-Shamir challenge.
In either case, $z$ should not be known to the (recursion) prover before being bound to $[x, r]$ via its public commitment.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't the prover also commit to the proof it will be verifying first?

Comment thread spec/chapters/recursion.typ Outdated
the verification cost of computing $z$ and the soundness error of the zero-evader.
Where needed, multiple independent $z$ can be used to amplify soundnes.
In settings where both $verify^*_(b)$ are in the same proof system, with the same commitment scheme, but different representations of the committed data
(e.g. representing $pi$ as a sequence of committed bytes and as a sequence of extension field elemens),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
(e.g. representing $pi$ as a sequence of committed bytes and as a sequence of extension field elemens),
(e.g. representing $pi$ as a sequence of committed bytes and as a sequence of extension field elements),

Comment thread spec/chapters/recursion.typ Outdated
A larger $[pi, r]$ comes at a cost --- whether a cost of soundness or a cost of deriving more independent random $alpha_i$ ---
and as such should be kept as short as possible.
Since values that only one $verify^*_(b)$ reads or writes cannot lead to a differing result, the checksummed data need only
be the subsequence of elements of $[pi, r]$ that is read or written by both $verify^*_0$ and $verify^*_1$.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
be the subsequence of elements of $[pi, r]$ that is read or written by both $verify^*_0$ and $verify^*_1$.
be the subsequence of elements of $[pi, r]$ that is accessed by both $verify^*_0$ and $verify^*_1$.

or "interacted"?
Reason I'm proposing this, is to avoid the ambiguous interpretation that one need only include values that are either read by both or written by both (where in practice we see values being "written" by one and read by the other)

Comment thread spec/chapters/recursion.typ Outdated
Comment on lines +242 to +243
To enable recursion from a split verifier, we start by considering that each part of the split may
be prove in a different proof system, and with a different commitment scheme.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
To enable recursion from a split verifier, we start by considering that each part of the split may
be prove in a different proof system, and with a different commitment scheme.
To enable recursion from a split verifier, we start by considering that either part may
be proven in a different proof system, each using a different commitment scheme.

Comment thread spec/chapters/recursion.typ Outdated
Comment on lines +244 to +245
For a split verifier $(verify_0, verify_1, d_verify)$ to be recursively proven,
we will write $comm(x)$ and $comm2(x)$ as the (deterministic) commitments to $x$

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
For a split verifier $(verify_0, verify_1, d_verify)$ to be recursively proven,
we will write $comm(x)$ and $comm2(x)$ as the (deterministic) commitments to $x$
We write $comm(x)$ and $comm2(x)$ as the (deterministic) commitments to $x$

Comment thread spec/chapters/recursion.typ Outdated
Comment on lines +252 to +256
our goal then becomes to prove the following statements in parallel:

1. $verify'_0([comm(bb(x)), c_0]; [pi, r]) = 1$
2. $verify'_1([comm2(bb(x)), c_1]; [pi, r]) = 1$
3. $exists pi, r: comm([pi, r]) = c_0 and comm2([pi, r]) = c_1$

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't flow right for me just yet. At this point we have just introduced $v'_i$ as taking one more argument than $v_i$ (but haven't bound it to anything). As a result, step 3 feels useless: we have to ensure the commitments given to both $v'_i$ match the same thing. But both $v'_i$ don't actually do anything with that parameter at this point?

Perhaps we should start with

  1. $v_0(x, [\pi, r]) = 1$
  2. $v_1(x, [\pi', r']) = 1$
  3. show that $(\pi, r) = (\pi', r')$

then introduce $v'_b([x, s], [\pi, r]) = v_b(x, [\pi, r]) = 1 \wedge comm_b(x, \pi, r) = s$

and then transition to

  1. $v' _0([x, s0], [\pi, r]) = 1$
  2. $v'_1([x, s1], [\pi', r']) = 1$
  3. $\exists \pi, r: comm_0(x, pi, r) = s0 \wedge comm_1(x, pi, r) = s1$

wdyt?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

but haven't bound it to anything

I felt like that was implied by the (informal) definition of the v'_b, and that elaborating that more formally would needlessly take up extra space.

Comment thread spec/chapters/recursion.typ Outdated
#aside[Minimizing the length of $z$][
A larger $[pi, r]$ comes at a cost --- whether a cost of soundness or a cost of deriving more independent random $alpha_i$ ---
and as such should be kept as short as possible.
Since values that only one $verify^*_(b)$ reads or writes cannot lead to a differing result, the checksummed data need only

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clarify what you mean by "differing result". What result?

Comment thread spec/chapters/recursion.typ Outdated
Co-authored-by: Erik <159244975+erik-3milabs@users.noreply.github.com>
@erik-3milabs
erik-3milabs self-requested a review October 19, 2026 12:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

spec Updates and improvements to the spec document

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants