spec: Recursion - #943
spec: Recursion#943erik-3milabs wants to merge 16 commits into
Conversation
Kimi Code ReviewAutomated review by Kimi (Moonshot AI) |
Codex Code Review
|
| When recursing on this process, the prover provides the verifier with this commitment. | ||
| We thus have to demonstrate the commitments the prover provides are as expected. | ||
| This is achieved by having the verification algorithm `COMMIT` (see @commit) | ||
| to the public input it is provided. | ||
| This act produces an imbalance in the LogUp-component of the proof-of-verification, | ||
| which must be balanced during verification in the _next_ recursion layer. | ||
| In later recursions, the verifier must consistently `COMMIT` to its public input | ||
| and use the _same_ public input to balance out the LogUp-component of the proof | ||
| it is provided. | ||
| This solution effectively kicks the can down the road; the final verifier has to | ||
| provide the initial input to the program as input to verify the recursive proof. |
There was a problem hiding this comment.
- We may not have access to COMMIT in a future flock-fieldvm hybrid
- Isn't this handled by
$\mathbb{c}_1 = \bar{\mathbb{x}}$ already? Since the instance$\mathbb{x}$ includes the public input?
There was a problem hiding this comment.
Re 2.
Do you mean that having the guest COMMIT to PAGE storing it, and all PAGEs are committed to by the VM?
In that case the verifier will have to add a constraint to that specific PAGE table, constraining that it contains the commitment on the required address 🤔 or were you thinking of a different solution?
There was a problem hiding this comment.
There are multiple PAGEs that need to be present to correctly represent the ELF being loaded into memory, so those would be part of
So in the end, we'd need these specific tables to be used already as precomputed tables (which could/would be part of a verification key that can be derived from the ELF once and not computed on every verification).
cdesaintguilhem
left a comment
There was a problem hiding this comment.
Mostly minor comments!
| verify': commitmentSpace^2 times {0, 1} times proofSpace: (commitment_0, commitment_1, b, proof) mapsto | ||
| cases( | ||
| verify(commitment_0, proof) &text("if") b=0, | ||
| verify(commitment_1((commitment_0, commitment_1); dot), proof) &text("if") b=1 |
There was a problem hiding this comment.
I can't parse what commitment_1((commitment_0, commitment_1); dot) is meant to be here.
| are henceforth referred to as _function instances_, or simply _instances_. | ||
| Where convenient, we may also denote this as $function(input; dot) in instanceSpace$ | ||
| with instance space $instanceSpace$. | ||
| We then define $relation subset.eq instanceSpace$ |
There was a problem hiding this comment.
This relation is actually a language.
There was a problem hiding this comment.
I rewrote the paragraph, as discussed. Is it correct now?
| Since these commitments are deterministic, the verifier can locally reconstruct | ||
| the commitments and verify any opening proofs against its own version of the commitment. |
There was a problem hiding this comment.
As an optimisation: if the verifier has the DECODE and relevant PAGE tables in the clear, the prover does not even need to provide the corresponding openings as part of the proof string.
There was a problem hiding this comment.
The downside would be that you get an increased storage cost in the verifying key, where storing those tables on-chain would be very costly, compared to just merkle roots.
ff44161 to
f92d469
Compare
RobinJadoul
left a comment
There was a problem hiding this comment.
I'm wondering whether we should choose for the
8e0d8f7 to
82dcc54
Compare
Co-authored-by: Robin Jadoul <robin.jadoul@gmail.com>
Co-authored-by: Erik <159244975+erik-3milabs@users.noreply.github.com>
82dcc54 to
a75546f
Compare
RobinJadoul
left a comment
There was a problem hiding this comment.
Not paying attention to all possible typography yet, trying to get the last high-level stuff out of the way
I'll try to do another pass later this week, but this is a first go at it
| #let (proofSpace, proof) = ($bb(Pi)$, $pi$) | ||
|
|
||
| #let (commitmentSpace, commitment) = ($cal(C)$, $bb(c)$) | ||
| #let commit(x) = $overline(#x)$ |
There was a problem hiding this comment.
| #let commit(x) = $overline(#x)$ | |
| #let commit(x) = $dash(#x)$ |
should work better for html export
(except there's some weird rendering issues where at least FF, and seemingly other browsers too, so maybe this should be a later effort to clean up browser rendering a bit, as chromium also seems generally quite bad atm)
There was a problem hiding this comment.
I'm leaving it out of the commitment-batch for now, but would be happy to switch once we've established how to fix the html support issue.
|
|
||
| == Recursively proving proof verification | ||
| Now observe that the verifier $verify$ is itself a function in | ||
| $verifierSpace := {hat(f): commitmentSpace times proofSpace to BB} subset.eq programSpace$. |
There was a problem hiding this comment.
I think that to use the proof as private input, we need to have
The former is probably the more interesting, though that kinda moves the meaning of
There was a problem hiding this comment.
Let's discuss this in person
| For example, there may exist proofs that _attest to the existence of itself_ in a finite number of recursion steps. | ||
| Such a proof would be accepted by $verify'$ even if $instance in.not language$. | ||
| In practice, one might be able to prevent this problem by including a recursion-level counter in the proof. | ||
| The existence of other soundness gaps are not ruled out by the authors. |
There was a problem hiding this comment.
Feels a bit weird to phrase it like this, maybe something about not providing a full proof of soundness (yet)?
There was a problem hiding this comment.
sure. wdyt of
| The existence of other soundness gaps are not ruled out by the authors. | |
| The provision of a full soundness proof is deferred. |
?
| $program$ and input $input$ are committed to separately. | ||
| Recall that a (split) program is encoded as one or more | ||
| `DECODE` (@decode) and/or `FIELD-DECODE` (@field-decode) tables, while the | ||
| input $input$ --- and private input $witness$ and record $record$ for that matter |
There was a problem hiding this comment.
Technically, public input is committed private input, but committed values are now available through COMMIT's PAGEs
There was a problem hiding this comment.
A) some committed values (namely those COMMITted by the guest program) are available through the COMMIT's PAGEs, right?
B) how would you propose the text be modified? I'm confused by the remark.
| Leveraging the `COMMIT` chip is mostly useful in situations where revealing full `PAGE` | ||
| tables is unnecessarily expensive or cumbersome, e.g., when committing to small | ||
| amounts of data or to data scattered across several `PAGE` tables. | ||
| One potential limitation is that `COMMIT`ting in this way is at the discretion of the VM's | ||
| guest program. |
There was a problem hiding this comment.
I think this model of COMMIT is outdated since epoch/L2G system for committing? Though I suppose a COMMIT-domain PAGE table is not strictly different from just providing the same interactions from the verifier.
There was a problem hiding this comment.
why would this model be outdated? I don't see how the epoch/L2G system changed this.
| - derives challenges from $proof$ by means of Fiat-Shamir, and assert that they | ||
| match those located in $record$ at the expected location. | ||
| - Performs the binary arithmetic steps required to verify that $proof$ attests | ||
| to $instance$ (when $b=0$) or $instance2$ (when $b != 0$#footnote[The RiscV-VM's `PAGE` tables only supports byte data. All non-zero data is treated as $b=1$.]), |
There was a problem hiding this comment.
We can assert the bit-ness of b as well, alternatively
There was a problem hiding this comment.
You mean by including
x = EQ[b, 0];
y = EQ[b, 1];
z = x + y;
z = EQ[z; 1];
in the guest program?
Co-authored-by: Robin Jadoul <robin.jadoul@gmail.com>
|
|
||
| == Recursively proving proof verification | ||
| Now observe that the verifier $verify$ is itself a function in | ||
| $verifierSpace := {hat(f): commitmentSpace times proofSpace to BB} subset.eq programSpace$. |
There was a problem hiding this comment.
Let's discuss this in person
| For example, there may exist proofs that _attest to the existence of itself_ in a finite number of recursion steps. | ||
| Such a proof would be accepted by $verify'$ even if $instance in.not language$. | ||
| In practice, one might be able to prevent this problem by including a recursion-level counter in the proof. | ||
| The existence of other soundness gaps are not ruled out by the authors. |
There was a problem hiding this comment.
sure. wdyt of
| The existence of other soundness gaps are not ruled out by the authors. | |
| The provision of a full soundness proof is deferred. |
?
| For each value on the record, the "sending" half _verifies_ that it is as expected, | ||
| whilst the "receiving" half _assumes_ its correctness and resumes verification under this assumption. | ||
| One can now conclude that the proof satisfies the instance | ||
| when both algorithm-halves produce the same record for this input. |
There was a problem hiding this comment.
A)
| when both algorithm-halves produce the same record for this input. | |
| when both algorithm-halves accept the same record for this input. |
B) let's discuss this in person.
| ] | ||
|
|
||
| More formally, we define | ||
| $v_0, v_1: instanceSpace times proofSpace to recordSpace$ as a valid _split_ of |
There was a problem hiding this comment.
like this, you mean, right?
| $v_0, v_1: instanceSpace times proofSpace to recordSpace$ as a valid _split_ of | |
| $v_0, v_1: commitmentSpace times proofSpace to recordSpace$ as a valid _split_ of |
| $ | ||
| where $recordSpace$ denotes the communication record space. | ||
| That is, the two halves agree if and only if the instance-proof verifies succesfully. | ||
| By applying the Kronecker delta function $delta$ #footnote("https://en.wikipedia.org/wiki/Kronecker_delta"), |
There was a problem hiding this comment.
I included it, as I've encountered a wild variety of notation for the delta function and wanted to point the reader to the exact definition I'm using here. We could alternatively derive it in the document and keep it self-contained. wdyt?
| Leveraging the `COMMIT` chip is mostly useful in situations where revealing full `PAGE` | ||
| tables is unnecessarily expensive or cumbersome, e.g., when committing to small | ||
| amounts of data or to data scattered across several `PAGE` tables. | ||
| One potential limitation is that `COMMIT`ting in this way is at the discretion of the VM's | ||
| guest program. |
There was a problem hiding this comment.
why would this model be outdated? I don't see how the epoch/L2G system changed this.
| - derives challenges from $proof$ by means of Fiat-Shamir, and assert that they | ||
| match those located in $record$ at the expected location. | ||
| - Performs the binary arithmetic steps required to verify that $proof$ attests | ||
| to $instance$ (when $b=0$) or $instance2$ (when $b != 0$#footnote[The RiscV-VM's `PAGE` tables only supports byte data. All non-zero data is treated as $b=1$.]), |
There was a problem hiding this comment.
You mean by including
x = EQ[b, 0];
y = EQ[b, 1];
z = x + y;
z = EQ[z; 1];
in the guest program?
There was a problem hiding this comment.
hmmm, this should be removed, no?
| #let (proofSpace, proof) = ($bb(Pi)$, $pi$) | ||
|
|
||
| #let (commitmentSpace, commitment) = ($cal(C)$, $bb(c)$) | ||
| #let commit(x) = $overline(#x)$ |
There was a problem hiding this comment.
I'm leaving it out of the commitment-batch for now, but would be happy to switch once we've established how to fix the html support issue.
| $program$ and input $input$ are committed to separately. | ||
| Recall that a (split) program is encoded as one or more | ||
| `DECODE` (@decode) and/or `FIELD-DECODE` (@field-decode) tables, while the | ||
| input $input$ --- and private input $witness$ and record $record$ for that matter |
There was a problem hiding this comment.
A) some committed values (namely those COMMITted by the guest program) are available through the COMMIT's PAGEs, right?
B) how would you propose the text be modified? I'm confused by the remark.
No description provided.