Split Accumulation
The last chapter kept one claim alive across a chain of proofs and left the expensive check to a single decider at the end. That worked because the accumulator carried everything the next prover needed, but it had a price, since every step had to run a complete inner product argument for the proof it verified and another for the merge.
This chapter removes those arguments from the recursive path. The idea comes from noticing that the recursive verifier never needs to read most of a proof, so we divide both the proof and the accumulator into a short part that the circuit reads and a long part that only a prover and a decider ever touch. The long part need not be short at all, which is why a step can use the non-succinct proof of chapter 09. Bünz, Chiesa, Lin, Mishra and Spooner formalized this in Proof-Carrying Data without Succinct Arguments under the name split accumulation, and it is the form the Ragu Book says Ragu implements.
Reconstructed from code at commit 3219e08, not confirmed by the authors
The book gives the syntax and a simplified scheme for evaluation claims. The explicit formulas, the choice of what the toy circuit reads, and the numeric run are our own assembly of that scheme with chapter 08 and chapter 09. We could read only the abstract of the paper, so the description of the scheme here follows the book. Section 11 compares all of this with the code.
Terminology
This chapter says that claims fold into an accumulator, because the book uses "accumulation" and "folding" interchangeably for what Ragu does. A fuse is still the PCD operation of chapter 02, which contains folds. A merge still means the operation on Halo's claims from chapter 11. The book's evaluation section says "merge circuit" where its IVC section says "fuse circuit" for the same object, and we use "fuse".
1. What atomic accumulation still costs
Section 9 of chapter 11 named its scheme atomic, because the accumulator alone lets anyone produce and check the next update. To see what that property costs, count the group work in one recursive step of that scheme:
Take generators, and one step that holds one earlier accumulator and one new proof. The circuit batches the proof's claims, which takes scalar multiplications, runs the proof's inner product argument up to the split, which takes , and then runs the merge, which takes , for in all. Outside the circuit, the prover commits to with scalar multiplications and runs two inner product arguments at each, so at every step.
Most of this comes from the two inner product arguments. Both exist for the same reason. An accumulation verifier sits inside a circuit, so anything it reads becomes part of that circuit, and an atomic verifier reads the whole proof it is given. The proof therefore has to be short, which forces an argument at every step, and the output of each argument is one more claim about for the merge to handle.
If the verifier could leave most of a proof unread, the proof could stay long, and the arguments could go. That requires some other party to check the unread part eventually, and the decider is already such a party. We therefore need to find out which parts of a proof the recursive verifier has to read, and we can do that by inspecting the verifier of chapter 09.
2. Sorting the verifier's work by what it reads
Section 16 of chapter 09 listed that verifier's steps. Here are the ones concerned with openings and the revdot product, sorted by the data each one touches:
| Verifier step from chapter 09 | Work for | What it reads |
|---|---|---|
| Compute | Two geometric sums | Challenges |
| Check the split of | A few field operations | Instance values |
| Derive | One inverse and a few multiplications per claim | Instance values and prover messages |
| Compute and | 5 scalar multiplications | Instance commitments and prover messages |
| Recompute , , | 3 MSMs of size , or scalar multiplications | Witness vectors |
| Compute | field multiplications | Witness vectors |
| Recompute from | 1 MSM of size , or scalar multiplications | Witness vector |
| Evaluate | field multiplications | Witness vector |
The two groups differ sharply, and the difference lines up with cost. Every step that reads a witness vector is linear, and every step that avoids one is cheap. This is the division that chapter 09 drew when it listed the instance part and the witness part of the proof. There we noted the division only as a matter of size, and now we can use it as a plan. The circuit runs the upper rows, and the lower rows wait for a decider.
The lower rows still look like several separate jobs. The last two are the evaluation check, and they concern the claims that chapter 08 knows how to batch. This chapter defers those. The revdot row needs its own folding, which is the subject of chapter 14, and the correctness of against the circuit is the subject of chapter 15. We left the computation of out of the table for that reason, since it is linear and reads the circuit rather than the proof. The book lists the same three subprotocols as the verifier's linear work.
3. Instances and witnesses
Chapter 03 introduced instances and witnesses for a whole statement, and the same words apply to one evaluation claim. Its instance is the triple of commitment, point and value. Its witness is the polynomial behind the commitment, together with the blinding factor. The relation between them has two conditions:
Take the first claim of chapter 09. Its instance is , three values that anyone can hold. Its witness is with . Checking the claim takes both parts, since and .
The instance has a fixed size, so a circuit can read it at a fixed cost. The witness has entries, and checking the first condition takes an MSM of that size. The instance alone also says nothing conclusive, because any prover can write down a triple. It becomes meaningful only when somebody with the witness runs the check.
The word "witness" here needs a warning. The book's evaluation section calls this a secret witness, held by the prover. In this chapter that describes who needs the data, which is different from a promise that the data stays hidden. Section 11 returns to the point.
4. An accumulator with two parts
Chapter 08 turned a list of evaluation claims into a single triple, and a triple is again an instance of the relation above. So the output of that reduction has the right shape to serve as an accumulator, if we keep the output polynomial with it. Following the book's definition, the accumulator has two parts:
The circuit reads the first part, and the second part travels beside the proof. This is what separates the scheme from chapter 11. There the polynomial could be rebuilt from public challenges, whereas here nothing in the instance's and determines :
For , trying all polynomials with 3 coefficients finds that pass through this point, and each extra coefficient multiplies that count by 43. With 8 coefficients there are of them. In chapter 11, by contrast, gave one polynomial and only one.
The commitment does narrow this down, since a binding commitment fixes one polynomial as far as any prover can tell, but finding it from would mean solving discrete logs. So a party who holds only the instance cannot run the next fold and cannot decide the accumulator. Whoever continues the computation has to receive the witness too. That is the price of the split, and we measure it in Section 7.
5. The three algorithms
A scheme of this kind has three algorithms. The book gives the first two in this form, and it names the decider in its description of accumulation:
| Algorithm | Reads | Produces | Runs |
|---|---|---|---|
| , the accumulation prover | Proofs and accumulators, both parts | A new accumulator, both parts, and a proof of the update | Outside any circuit |
| , the accumulation verifier | Instances of the inputs, the new instance, and | Accept or reject | Inside the next circuit |
| , the decider | One accumulator, both parts | Accept or reject | Once, outside any circuit |
The second row is the defining feature of the scheme, because a verifier that reads only instances has no need for a short witness. To turn chapter 08's reduction into these algorithms, we only have to decide what goes in the input list and which messages form .
The input list
A step holds an earlier accumulator and a new proof. The accumulator's instance is itself one evaluation claim, and the proof contributes the claims of chapter 09. That gives five claims about five polynomials:
The book's list has two more entries for the constant wire, which our toy circuit does not use. The proof in chapter 09 also carried its own batched triple . A recursive step has no need to batch the proof's claims separately and then fold the result, because it can place them directly in this one list.
The accumulation prover
The prover follows the steps of chapter 08 with this list. We keep that chapter's weights, in which the first claim takes the highest power of and takes the highest power of . Write for the claims in order and for their polynomials, so that is the old accumulator's polynomial and are , , and .
After receiving , the prover divides and combines,
and it sends . After receiving , it sends the five values . After receiving , it forms the new witness:
Here is zero for and , which have no blinding factor. The messages make up the accumulation proof, , which matches the book's. The book describes it as an internal value for the circuit's prover, so it goes into the next circuit's witness and is not an output of the recursive step.
The accumulation verifier
The verifier derives what the new instance has to be, using only the old instances and . Its arithmetic never mentions a polynomial's coefficients:
It accepts if the claimed new instance equals , and if is the challenge that the transcript produced. This takes one scalar multiplication per commitment and one inverse per claim, however large is, because no vector and no inner product argument appears in the calculation.
The two sides agree for an honest prover. Expanding the commitment to the new witness and applying linearity gives
which is the verifier's . Substituting into the definition of , and using from Section 4 of chapter 08 for each term of , gives the verifier's in the same way.
The decider
The decider checks the relation of Section 3 on the accumulator, so it computes one MSM and one evaluation. It accepts if and . Chapter 09's verifier performed this same check at the end, when it recomputed from a revealed . That chapter said the reveal fits how the proof will be used, and we can now say how, since the revealed polynomial is the accumulator's witness and the reveal gives the decider its input.
6. A run on the toy curve
We now run a chain with the step function from chapter 10, starting from , with chapter 09's eight generators. All challenges are picked by hand, and all arithmetic takes place on one curve.
Two simplifications apply to this run. Each proof covers only its step's circuit, because a circuit that also holds would be far too large for the toy curve, so the run shows the folds on their own. We also ignore the fact that a circuit over cannot do arithmetic on points whose coordinates lie in , which the next chapter addresses.
The first fold has no earlier accumulator, so its list holds only the first proof's four claims. Chapter 09 already did this calculation:
Chapter 09's proof of gives the input list, and no accumulator exists yet. Running the fold with , and repeats chapter 09's batching with no changes, so . The result is
So chapter 09's batch was the first accumulator all along. The second step brings a new proof and has an accumulator to fold:
The second step applies to and outputs . Its challenges are , and , so . The statement gives . The script confirms that this proof's revdot product and split check hold, and these are its polynomials and claims:
| Polynomial | Coefficients of | Blinding | Commitment | Point | Value |
|---|---|---|---|---|---|
| (21, 4, 21, 35, 35, 35, 0, 0) | 17 | 33 | 27 | ||
| (21, 21, 39, 40, 19, 38, 26, 37) | 29 | 37 | 24 | ||
| (0, 0, 38, 42, 8, 34, 2, 9) | 0 | 37 | 12 | ||
| (0, 0, 0, 39, 0, 0, 0, 0) | 0 | 34 | 35 |
The list now has the five claims of Section 5. The old accumulator is , so its polynomial and its instance come first, in the place that Section 5 calls . The first stage combines the quotients:
The verifier sends , whose powers give the weights in the next table. The first row divides by , which is the only difference from chapter 09's list.
| Quotient | Weight | Coefficients of |
|---|---|---|
| 40 | (13, 38, 23, 32, 41, 18, 17) | |
| 2 | (8, 34, 3, 29, 35, 0, 0) | |
| 13 | (21, 0, 28, 2, 10, 19, 37) | |
| 20 | (41, 29, 23, 39, 2, 34, 9) | |
| 1 | (20, 36, 39, 0, 0, 0, 0) | |
| (15, 11, 26, 37, 31, 13, 8) |
With the blinding factor , the prover sends .
Next the prover sends the values at a fresh point:
The verifier sends , and the prover sends the five values. The verifier then derives from those values and the instances:
| Input | Value at | Claimed value | Ratio | Weight | Term | |
|---|---|---|---|---|---|---|
| 28 | 23 | 13 | 7 | 40 | 22 | |
| 28 | 27 | 40 | 14 | 2 | 28 | |
| 42 | 24 | 36 | 22 | 13 | 28 | |
| 35 | 12 | 36 | 9 | 20 | 8 | |
| 16 | 35 | 39 | 37 | 1 | 37 |
The last column sums to , and the prover gets the same number by evaluating .
The first row is the fold's link to the past. The value now sits inside the formula for , so a false would make this number wrong. The last stage produces the new instance:
The verifier sends . Each input carries its weight into the commitment, the value and the blinding factor.
| Input | Weight | Commitment | Value at | Blinding factor |
|---|---|---|---|---|
| 24 | 37 | 7 | ||
| 13 | 28 | 27 | ||
| 16 | 28 | 17 | ||
| 23 | 42 | 29 | ||
| 25 | 35 | 0 | ||
| 1 | 16 | 0 | ||
| Combined |
The accumulation verifier has now finished. It read no polynomial, and its recomputation gave . The prover computes the new witness from the polynomials, using the same weights, which gives and . This vector has 8 entries, the same as .
The witness kept its length even though it absorbed a new round of claims, because each fold takes a linear combination of vectors that all have entries. This is why a proof's size does not depend on the length of its history, as chapter 02 required.
The third step repeats the procedure, and the next table collects all three folds:
| Fold | New proof covers | Input claims | Accumulator instance | Accumulator witness | |
|---|---|---|---|---|---|
| 1 | 4 | (17, 12, 34, 38, 23, 36, 30, 17) | |||
| 2 | 5 | (24, 21, 24, 38, 4, 11, 26, 7) | |||
| 3 | 5 | (5, 39, 23, 37, 39, 0, 2, 21) |
Suppose the chain stops here, so that a decider takes over:
The decider receives . It computes , which equals , and it evaluates , which equals . It accepts. One MSM over 8 generators and one evaluation of 8 coefficients stand in for opening all twelve polynomials of the three proofs.
The following figure shows how the two parts move through this chain.

A tree needs no new idea. A node with two children holds two accumulators and two proofs, and all of their claims go in one list, in the way chapter 10 described:
Suppose a second chain has proved and reached the accumulator . A node takes this one and from its two children, along with one new proof from each side. The input list has claims. With , and , the fold outputs . The accumulation verifier accepts, and the decider accepts the witness . The proof grows to one point and 10 values, while the output keeps the same three-part instance and 8-entry witness.
7. What the split costs and what it saves
The next table puts the two schemes side by side for the opening work alone. Both schemes also need the commitments to the proof's polynomials, and both still have to deal with the revdot product and the wiring. Those parts are the same in both columns, so we leave them out.
| For and 32-byte values | Atomic (chapter 11) | Split (this chapter) |
|---|---|---|
| Scalar multiplications in the circuit, one proof and one accumulator | ||
| Scalar multiplications in the circuit, two proofs and two accumulators | ||
| Growth of that count with | Logarithmic | None |
| Prover's scalar multiplications for this opening work at each step | , to commit to | |
| Accumulator data that the circuit reads | bytes | bytes |
| Proof and accumulator data handed to the next prover | bytes | bytes |
| How much of that is the accumulator's witness | None | bytes |
| Decider | 1 MSM of | 1 MSM of and one evaluation |
The saving and the cost both come from one change. The verifier's count falls and stops depending on , since the and have gone. The prover's group work falls, since it no longer folds generators. In return, the data handed from step to step changes from a few short values to whole vectors, because the next prover needs every one of them. These byte counts describe our protocol at Ragu's polynomial size, and Ragu's own proofs have a different layout, as Section 11 shows.
Because the witness never enters a circuit, the growth affects storage and bandwidth and does not affect recursion. That trade suits a system like Ragu, where a proof stays large while it is being fused and only needs to become short when it leaves the tree.
The decider's linear work has not disappeared, and it has the same size as in chapter 11. It occurs once for a whole history in both schemes. The difference lies in what the steps before it had to do.
8. Why a NARK is enough
We can now rewrite the recursive relation of chapter 10. The circuit no longer checks the previous proof. It checks that the accumulator was updated correctly to take that proof in. Following the book's relation, with the inputs narrowed to what reads,
The book lists the whole of and in the witness, and reads only their instance parts. The witness parts go to , which runs outside the circuit, so a proof of this relation can be a NARK. The output handed onward is the pair . A final verifier checks directly and then runs the decider on . The paper's abstract states the general result, which is that any non-interactive argument of knowledge with a split accumulation scheme yields proof-carrying data, without requiring the argument to be succinct.
The reasoning runs backward from the end, in the same way as chapter 10's walk. The final verifier establishes that the last circuit was satisfied, so passed on the last fold. The decider establishes that the last accumulator is true. A passing fold with a true output means, except with small probability, that its inputs were true too, so the earlier accumulator and the last proof's opening claims were true. Each earlier proof has its own circuit that did the same thing for the fold before it. Section 10 examines the step in the middle of this argument.
Chapter 09 listed two linear costs as targets for this part of the site. The cost of computing does not arise on the recursive path of this scheme, because that path contains no inner product argument. The other cost, computing , remains. In the toy run the script recomputes from the circuit, because the folds in this chapter establish what opens to, and they establish nothing about whether belongs to the right circuit. The wiring chapter deals with this.
The base case and the record of initial states follow chapter 10. Our run began with no accumulator at the first fold, which keeps the numbers equal to chapter 09's. The book uses a placeholder accumulator instead, while the code uses one Bootstrap step, and that chapter's warning compares them. The Merkle root of initial states in the book's PCD description has no counterpart in the code, so we leave it out.
9. Folding schemes
Nova introduced a related formalization called a folding scheme, which its abstract describes as a reduction from checking two instances of a relation to checking one. We could read only that abstract, so this section rests on it and on the book. The book says the two formalizations are equivalent for all practical purposes, and elsewhere it calls folding a related alternative that merges statements without running a proof's verifier during accumulation. The two wordings fit together once we write our scheme as a folding scheme.
Take the relation of Section 3 with , , as instance and , as witness. Then Section 5 reduces checking five instances of this relation to checking one instance of the same relation, with a verifier that sees only instances:
| Accumulation term | Folding term | In this chapter |
|---|---|---|
| Running instance | ||
| Running witness | ||
| Fresh instances | The claims about | |
| and | Folding prover and verifier | The two sides of Section 5 |
| Folding proof | and the values at | |
| Checking the final instance against its witness | The MSM and the evaluation |
So our scheme is a folding scheme for evaluation claims, and the book's phrase "without the use of any (S)NARK verifier" describes the same thing as a verifier that reads nothing of a proof beyond its instances. What differs is mainly the point of view. Accumulation starts from a proof system and asks what can be postponed, whereas folding starts from a relation and asks how to combine instances of it.
Not every relation folds as cleanly as this one, and the reason explains why can take different forms. The book says that an accumulation proof contains the cross terms the verifier needs. Evaluation claims at one point combine linearly and need no such term, which is why our only has to bring the claims to a common point. A relation with a product does not combine linearly. Suppose the claim is , and we fold two instances with a challenge . Multiplying out gives
where the middle term is the cross term. The verifier cannot compute it from instances, so the prover has to supply it.
Take , with , and , with . At the folded vectors are and , and their inner product is . The two old values give only . The prover supplies the cross term before it learns , and matches.
Nova's folding of R1CS is commonly described with a term of this kind, although its abstract does not mention one and we have not checked this against the paper. Ragu's revdot claims have the same structure, so chapter 14 develops this example into a complete protocol.
10. Why cheating fails
A prover in this scheme can lie in more places than in chapter 08, because the verifier no longer sees any polynomial. We go through what it can try. The toy curve permits forgeries, since every discrete log is known, so the counts below model a prover who holds real polynomials and does not exploit those relations, except in the last example, which shows what happens if it does.
Altering the output
The verifier recomputes the new instance from the inputs, so the prover has little freedom in stating it:
At the second fold, we replaced with each of the 42 other group elements, replaced with each of the 42 other values, and separately replaced with each of the 42 other group elements while keeping the output. We also shifted each of the five values at by each of the 42 nonzero amounts while keeping the output, which makes 210 more cases. The accumulation verifier rejected of the altered runs. The other are shifts of the value for . At these particular challenges the effect on the derived and the effect on that polynomial's own term happen to cancel, so the output stays the same true claim and the prover gains nothing.
The instance is therefore a function of the inputs and of the prover's messages. The prover keeps the freedom to change those messages consistently, and the verifier cannot detect that:
For example, a prover can send and output the matching point . The accumulation verifier recomputes that same point and accepts. This happens for all 42 false values of , because the verifier has no way to see what commits to. With the honest witness, the decider rejects all 42.
This shows the limit of what does. It confirms the arithmetic of the update and says nothing about whether the new claim is true. The decider has to confirm that, and for a false the decider can reject because it recomputes the commitment from the vector.
A false claim travels to the decider
Now suppose an input is false. Say the prover states the old accumulator's value as , where is the true value, and it otherwise follows the protocol, including honest division, which ignores claimed values. The polynomials and stay honest, so commits to the true . The error enters at one place, which is the first term of the formula for :
The derived is therefore off by the last term, and its weight in is . That gives the gap between the stated value and the true value of at :
Every factor is nonzero as long as and are nonzero, so a false input produces a false output. Each later fold repeats this calculation, with the previous gap in place of :
Take the run of Section 6, but let the prover state where the true value is . Every later step is honest, with the same challenges.
| Accumulator | Stated | True | Gap | ||
|---|---|---|---|---|---|
| 17 | 24 | 23 | 1 | ||
| 30 | 20 | 31 | 32 | ||
| 26 | 9 | 20 | 32 |
The accumulation verifier accepts both folds, because the output instance is what it recomputes. The decider rejects the last accumulator, since its value differs from the polynomial's.
For the fold above, the formula gives , which matches the table. We also ran all choices of nonzero , nonzero and an allowed out of 39 values, with the gap computed directly and compared with the formula. The gap is zero in none of them.
The gap therefore survives every fold and reaches the decider. A chain that never runs the decider has established nothing about its openings, which was also the conclusion of chapter 11.
A prover can do better than stay honest after the lie, for example by altering the values at or by committing to something other than the true quotients. Chapter 08 counted these options in full, and the same bounds apply to each fold, because the fold is that protocol with the accumulator as one more claim. For a real field each fold's chance of hiding a false claim is negligible, and the chances add across folds and grow with private retries under Fiat–Shamir.
Dropping the accumulator
A prover with a false accumulator might try to avoid carrying it at all, by folding some other accumulator in its place. Nothing in the fold's arithmetic forbids this:
Suppose the prover holds the false from above and wants to be rid of it. It folds an unrelated true accumulator in its place, and gets the output . If the circuit reads the swapped instance, the accumulation verifier accepts and the decider accepts. Run against the instance of the false , the same output fails.
The fold cannot detect this by itself, so the protection has to come from the circuit. The old accumulator's instance has to be part of the public statement of the previous proof, which ties it to that proof through . This is the same shared-wire requirement that chapter 10 met for the state , where the inner proof's public input is computed from the wire the step reads. Here the wires for in the next circuit must feed both and that computation.
The order of the messages
Chapter 08 showed that each challenge must follow the message it tests, and in a non-interactive proof this means the transcript has to absorb everything the challenges depend on. The accumulator's instance belongs on that list. It is the one input that chapter 08 did not have, so it is the easiest to forget:
Suppose the transcript leaves out the accumulator, so that the prover knows , and before it fixes . It states the false value , an error of , and it sends in place of the true , a shift of that solves one linear equation. The two errors cancel in , so the output is the true claim . The accumulation verifier accepts and the decider accepts, although was false. If instead the prover must fix these messages before arrives, then trying all 43 values of finds 2 that pass, namely .
The pass at is the case chapter 08 described, in which removes the error along with almost everything else, and a random avoids it.
Binding at the decider
The decider's check means something only because can be opened in one way. The argument above assumed this throughout:
Using the known discrete logs of the toy generators, a prover can state the false and present the witness . This vector commits to the same , and it evaluates to at , so the decider accepts it.
On a real curve, such a witness would give a discrete log relation among the generators.
Assumptions
This reasoning is informal and is not a security proof. It relies on the discrete log relation assumption for the generators, and it treats the transcript hash as a random oracle, with each challenge drawn after the data it tests. It assumes that the circuit ties each input instance to the previous proof, and that the decider runs honestly on the final accumulator. The paper's abstract says its construction is proved secure in the random oracle model under the hardness of discrete logarithms. The recursion adds the further concerns that chapter 10 listed, and we do not analyse Ragu's scheme here.
11. Split accumulation in Ragu
The code at commit 3219e08 has a proof type that contains this accumulator, and its fuse folds it in the way Section 5 describes, with the claims about the children's accumulators at the head of the list. In the first excerpt below, from internal/native/circuits/compute_v.rs, the three entries are the value at , the child's stored , and the inverse of . The second, from fuse/_10_p.rs, adds the child's polynomial and commitment to the running combination.
StaticFQuery::LeftP => (&eval.left.p_poly, &preamble.left.unified.v, &d.left.u),
StaticFQuery::RightP => (&eval.right.p_poly, &preamble.right.unified.v, &d.right.u),
acc.acc(proof.native_p_poly(), proof.native_p_commitment());
Reconstructed from code at commit 3219e08, not confirmed by the authors
- Where the witness lives. The code has no separate accumulator object for this claim. The
Proofstruct keeps the polynomial as a field, andProof::vcomputes by evaluating it at , so instance and witness travel together as one value. - Which claims. The static query list has 20 entries, and
compute_fthen adds more for each stage polynomial of each child, so a fuse folds far more than our five claims. The children's take the first two places in that list and therefore the highest powers of , as in our run. In the combination they come after each child's other polynomials, which only relabels the weights. - The accumulation proof. The polynomial is marked as ephemeral, used only during the fuse step, which matches the book's description of as internal. The values at go into a committed stage that the proof keeps, which chapter 17 explains.
- The tie to the previous proof. A child's is a slot of the unified instance, whose fields are written in order, and the computation covers that instance. We read this as the protection that Section 10 asked for.
- The decider. The documentation of
verify_uncompressedsays that this verifier is the decider, and calls it a test oracle rather than a production path. It checks commitments against polynomials in one batch per curve, including against . In production, compression restates those checks over commitments and openings, among them an opening of at to , and finishes with one IPA per curve. The inner product argument of chapter 07 therefore comes back once, at the point where a proof leaves the tree. As chapter 11 found, the IPA verifier at this commit computes its MSM in full.
The Ragu Book and the code differ here
Blinding. The book's accumulator has a blinding factor . The code's proof stores with its commitment and no such factor, in line with chapter 08's note on . Our run includes so that its numbers match chapter 09.
Claim list. The book's list has claims about , , and . The code's list has claims about the folded and , about registry polynomials in place of , and about stage polynomials. We found no commitment to a polynomial among its inputs, and circuits compute directly.
What the accumulator holds. The book gives the accumulator on one curve as . The code's unified instance has no field named , and it also holds bridge commitments and every challenge of the step.
Number of circuits. The book's accumulation chapter has one fuse circuit per curve, while the code has many internal circuits, and the circuit that recomputes is only one of them.
This site follows the code. The simplified single-curve scheme remains the book's own way of conveying the core idea, and this chapter uses it in that spirit.
The fold itself differs from Section 5 in two further ways, which we leave to later chapters. A circuit cannot compute cheaply, so Ragu divides the fold between two circuits on a curve cycle, as the next chapter describes. Those circuits have to agree on their challenges, which the endoscalars chapter covers.
The witness also raises a question about privacy, because a proof that carries polynomials in the clear reveals what they contain. Neither the book nor the code claims otherwise at this commit. The book states that the current construction does not yet establish zero knowledge, in part because it lacks a randomizer at the level of the fold, which is the operation of this chapter. Chapter 02 records the same status. Tachyon, which has not activated on mainnet and whose design is still changing, depends on fusing proofs of this kind through a different Ragu revision.
12. Where this chapter leaves us
This chapter took the following steps:
- Atomic accumulation forces an inner product argument at every step, because its verifier reads the whole of what it is given.
- Sorting the verifier's opening and revdot steps shows that every linear one reads a witness vector and every cheap one reads only the instance.
- An evaluation claim divides into an instance and a witness , and so does an accumulator, which is a claim of the same form.
- runs chapter 08's reduction on the old accumulator and the new proof's claims, recomputes the new instance from instances and the accumulation proof, and runs one MSM and one evaluation.
- The witness keeps a fixed length across any number of folds, and the circuit's work on the instance is constant in , while the data handed between provers grows to the size of the polynomials.
- Since the witness never enters a circuit, each step can use a NARK, and the opening claims of a whole history rest on one decider.
- Written as a reduction between instances of one relation, this scheme is a folding scheme. Relations with products also need cross terms in the accumulation proof.
- A false input leads to a false output at all but a few challenges, so it reaches the decider. This depends on the circuit tying each input instance to the previous proof and on the transcript absorbing the accumulator.
We set aside one problem throughout, which is that performs group operations on points whose coordinates live in a different field from the circuit's wires. The next chapter introduces a pair of curves that removes that mismatch, and it shows which circuit folds what.