Curve Cycles
The recursive proofs chapter set a problem aside. A circuit that verifies a proof has to add and scale commitments, and the coordinates of those commitments live in a different field from the circuit's wires. The accumulation chapter ignored the same problem, and the split accumulation chapter worked on one curve as if it did not exist. This chapter deals with it.
We first measure what it costs to compute in the wrong field, and the cost turns out to rule that route out. We then introduce a second curve whose coordinates match the first curve's scalars, divide each fold between two circuits so that each one does only native arithmetic, and handle the two problems this division creates. The two circuits have to see the same data, and they have to use the same challenges. The chapters on staging and endoscalars later give the full mechanisms for these two problems, so here we only explain why each is needed and show the idea on the toy cycle.
Reconstructed from code at commit 3219e08, not confirmed by the authors
The split fold in Sections 6 to 10 is our own small assembly of what the Ragu Book describes, checked by the script behind this page. Its circuits are short lists of gates that we run and do not prove, because the toy curves have too few points to serve as generators for a full circuit.
Terminology
For the general construction we follow the book and say primary for the circuit over the first field and secondary for the circuit over the second. Section 12 gives the code's names, which are native and nested. The book's accumulation chapters use both "fuse" and "merge" for the circuit that folds, and this site says fuse for the operation on a node, as chapter 02 does.
1. Two fields in one commitment
Here is the fold from chapter 08, which a recursive step has to check:
These two lines look alike, but they ask for different arithmetic. The polynomials have coefficients in , the scalar field of the toy curve . The second line is therefore a computation in , and a circuit over can do it with one gate per multiplication. A circuit has to be over this field because its own trace is a polynomial that gets committed on , and commitments on take scalars in .
The first line adds and scales points of , and the addition formula from the recursive proofs chapter works on coordinates, which lie in . We can see what happens if we run that formula on the wrong wires:
Take the commitments and from chapter 08. Modulo 31 the slope is and the sum is , a point on . Run the same three formulas on wires that reduce modulo 43 and the slope becomes , and the result is , which lies on neither curve of the toy cycle.
The formula fails because each of its multiplications needs a remainder modulo 31, and the wires produce a remainder modulo 43:
The first gate of that addition checks , which here reads modulo 31. As integers, , and leaves remainder modulo 31. A wire in holds , because that is the remainder modulo 43, and the remainder modulo 43 says nothing about the remainder modulo 31.
So a circuit over handles the value directly but has no direct way to handle the point . On real curves the same mismatch holds, and the two fields have no useful relation between their remainders.
2. Emulating the other field
A circuit can still check a multiplication modulo 31 if it treats the numbers as integers. The prover supplies a remainder and a multiple , and the circuit checks the integer equation
If this holds over the integers and is small, then is the product modulo 31. The difficulty is that a gate can only check equations modulo 43, and the two sides of this equation are often larger than 43, so a false witness can match:
The honest witness for is and , since . A single gate can only check this equation modulo 43. Of the pairs with below 31 and below 32, satisfy it, and of those have the wrong remainder. One of them is and , because , which equals modulo 43.
The way out is to make every equation the circuit checks so small that it cannot wrap around modulo 43, because an equation between small numbers modulo 43 is also an equation between integers. We split , , and into pieces called limbs. On the toy field each limb is one bit, so with five bits, and similarly for the others. We also write , which keeps the terms small. Expanding and collecting by powers of 2 gives one column per power:
This sum has to be zero, but each column does not have to be zero, since a column can carry into the next one as in ordinary addition. So the circuit takes a witness carry for each column and checks
with and the last carry equal to 0. Here is the first gate of our addition, written in columns:
| Column | Sum of | Carry in | Carry out | |||
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 1 | 0 | 0 | 1 |
| 2 | 0 | 0 | 1 | 0 | 1 | 1 |
| 3 | 2 | 1 | 0 | 0 | 1 | 1 |
| 4 | 0 | 1 | 0 | 0 | 1 | 0 |
| 5 | 2 | 0 | 0 | 0 | 0 | 1 |
| 6 | 0 | 0 | 0 | 1 | 1 | 0 |
| 7 | 1 | 0 | 0 | 1 | 0 | 0 |
| 8 | 0 | 0 | 0 | 0 | 0 | 0 |
| 9 | 0 | 0 | 0 | 0 | 0 | 0 |
Here and . Each row satisfies its equation and the last carry is 0. The gates are for the products , to show that the bits of and are bits, and for the carries at bits each, since an honest carry always lies between and . That is gates for one multiplication in . We ran the check on all pairs against all pairs . It accepted inputs, one for each pair , and each of them had the true remainder.
One native multiplication has become dozens of gates. The cost multiplies through every point operation, since the formulas are built from these multiplications:
A 6-bit scalar multiplication on does 5 doublings and 5 additions, or multiplications in at gates each. With its selections and scalar bits, it costs gates, where the same operation on costs gates in the recursive proofs chapter. That leaves out the extra work to reduce the sums and differences in each formula back into range.
A real field has room for larger limbs, which lowers the count per bit. The next estimate is our own plain design and not a gadget that Ragu contains, and better gadgets exist that cut these numbers by some factor:
Take the same plain design with 4 limbs of 64 bits. One multiplication then uses limb products, bits for and , and carries of about bits, for about gates. A point addition needs three of these, or about gates, which already exceeds the gates that Ragu allows in one circuit. A 255-bit scalar multiplication needs multiplications, or about gates, where the native version costs . Apart from the MSM for , the verifier of Chapter 09 has such multiplications, which comes to about gates.
The book calls non-native arithmetic prohibitively expensive, and these counts show why. The accumulator's whole purpose was to keep the verifier small, and this one requirement would undo it. We need a way to avoid computing in the wrong field at all.
3. A curve for each field
The recursive proofs chapter already used the way out, when it counted gates on the partner curve , since the coordinates of that curve lie in :
Take the points and on . Their slope and sum are computed modulo 43, so every gate works in the circuit's own field. The addition takes gates and gives , which we confirmed lies on .
It may look as if we could move everything to , but has 31 points, so its scalars lie in . A commitment on holds a vector over , and it cannot hold the polynomials of a circuit over . Those polynomials need , and the points of need wires in . A circuit over would then have its own polynomials, which can commit to, and those points need wires in . The two curves fit together in this way because of how their numbers of points were chosen:
| Curve | Coordinates in | Scalars in | Polynomials it commits to | Circuit that can do its point arithmetic |
|---|---|---|---|---|
| Over | Wires in | |||
| Over | Wires in |
We call this a 2-cycle of curves. It is a pair of prime fields and , with a curve over that has points and a curve over that has points. Each circuit can do the point arithmetic for the polynomials of the other. Ben-Sasson, Chiesa, Tromer and Virza introduced the use of such cycles for recursive proofs.
A single curve whose number of points equals the size of its field would avoid the need for a partner, but such a curve is called anomalous, and discrete log on anomalous curves is easy by a known attack due to Smart, Semaev, and Satoh and Araki. So two curves are the smallest arrangement that works.
The Hasse bound says that a curve over has points with , which means the two primes of a cycle must be close together:
For we have , and is about . For we have , and is about . Both differences fit within the bound.
Pairs of curves with this property are uncommon, even among small primes:
We counted the points on every curve over each of the primes below 200 that are congruent to 1 modulo 3. Among the pairs of these primes, form a cycle, and the pair is one of them. The same count finds primes with a curve whose number of points equals its field size, starting with .
4. The Pasta cycle
Ragu uses the Pasta curves, which Chapter 01 explained are already deployed in Orchard and in hardware wallets. Pallas is the curve over with points, and Vesta is the curve over with points, where
Both are primes of 255 bits, and has only 87 bits, which is below the size that allows. We tested the cycle property directly. A point found on over goes to the identity when multiplied by , a point over goes to the identity when multiplied by , and only one multiple of each prime lies within the Hasse range, so the two orders must be and .
The next table lines up the names we will use. The field of the main circuit is , and the code commits that circuit's polynomials on Vesta, whose scalars are and whose coordinates are . The toy cycle plays the same roles, with one difference in size. In the toy cycle the main circuit has the larger field, while in Pasta it has the smaller one, and this does not affect the construction.
| Role | Toy cycle | Pasta | Book | Code at 3219e08 |
|---|---|---|---|---|
| Field of the main circuit's wires | , | CircuitField | ||
| Curve for that circuit's polynomials | Vesta | , | HostCurve | |
| Field of the other circuit's wires | , | ScalarField | ||
| Curve for that circuit's polynomials | Pallas | , | NestedCurve |
The two fields are close in size, but their elements are not interchangeable, because a value can be in range for one and out of range for the other:
In the toy cycle, of the 43 values of are 31 or larger, so more than a quarter of them have no equal in . In the Pasta cycle the fraction is near , so a random value of almost always fits in . A protocol still cannot rely on that for values a prover can choose.
Section 9 returns to this when challenges have to cross between the circuits.
5. Recursion on a cycle
With two curves there are two kinds of circuit, and every recursive step now uses both. The book calls this a ping-pong pattern. There is a primary circuit over and a secondary circuit over . Each has its own polynomials, committed on its own curve, so each has its own accumulator. Where the split accumulation chapter had one , we now have a pair .
Each accumulator contains both field elements and points, and the rule for dividing the work follows from Section 1. Field elements are native to the circuit that made the polynomial, and points are native to the other circuit. The book states the split for the whole accumulator, including the , and that the revdot folding chapter introduces. For the batched claim it gives:
| Accumulator | Polynomials over | Commitment lies on | folded by | folded by |
|---|---|---|---|---|
| , or | , or Vesta | Primary | Secondary | |
| , or | , or Pallas | Secondary | Primary |
So the update of each accumulator is split between the two circuits, and each circuit updates half of each accumulator.
Timing matters as well. A circuit's commitments do not exist until its trace is complete, so a step cannot fold its own trace. The book's rule is that the instances produced in step are folded only in step . The trace of the primary circuit in step becomes a commitment on , whose coordinates the secondary circuit can read, so the secondary circuit folds that point in step . The same holds in the other direction:

Everything from the recursive proofs chapter about trees carries over. A node holds two children, each with a pair of accumulators, and it folds both into one new pair.
6. A fold split across two circuits
Here is one fold on the toy cycle. We take two claims on each curve. The first side reuses chapter 08's polynomials, and the second side uses two new polynomials over committed with four generators of .
| Claim | Coefficients | Point | Value | Commitment |
|---|---|---|---|---|
| over , on | ||||
| over , on | ||||
| over , on | ||||
| over , on |
The prover runs chapter 08's batching on each side, with the same three challenges on both:
The challenges are , and , each picked by hand and each below 16, for a reason that Section 9 gives. On the first side, the prover's quotient combination is with commitment , and the values at are and . On the second side, it is with commitment , and the values at are and .
Now we assign each output to the circuit where it is native. For a value, the circuit inverts each , multiplies by the difference , and accumulates with powers of and then of . For a point, it runs the Horner form of the first equation in Section 1, starting from the commitment to and using the plain double-and-add from the recursive proofs chapter on the 4-bit :
| Output | Computed in | Operations | Result | Gates |
|---|---|---|---|---|
| over | Circuit over | Field arithmetic | 8 | |
| on | Circuit over | Point arithmetic | 68 | |
| over | Circuit over | Field arithmetic | 8 | |
| on | Circuit over | Point arithmetic | 68 |
The prover also holds the combined polynomials and . A decider commits to them and gets on and on . Evaluating at gives in and in . All four numbers match the table.
The saving is what this arrangement is for:
The tracer that runs these gates refuses any point whose coordinates are not in its own field, and every run above passed that test. The point took gates on wires in . If the circuit over had computed it by the method of Section 2, the same steps would have cost at least gates.
The table hides two assumptions. The secondary circuit computed from the commitments on and the primary circuit computed from claims about those same polynomials, but nothing yet connects what the two circuits read. A prover could give each a different set of inputs. The two circuits also used the same , and only because we typed the same numbers. The book names these problems input consistency and challenge consistency. The next three sections address them.
7. Committing to coordinates
The primary circuit derives challenges by hashing the transcript, as the recursive proofs chapter required, and the transcript has to contain the commitments that the challenges test. For a commitment on , this means absorbing coordinates from into a sponge over . A circuit cannot do that natively, and the book also rules out hashing all the inputs on both sides and comparing the digests, since that needs either non-native arithmetic or bit decompositions of every value.
The cycle gives a neater route. The coordinates of a point on are elements of , and is exactly the scalar field of . So we can place the coordinates in a vector and make an ordinary Pedersen commitment to it on . The result is one point on , whose coordinates lie in . The book calls this a nested commitment, and it writes for the nested commitment to data involving :
Take and . Their coordinates form the vector in . Each entry is a valid scalar on , so we commit with four generators of , namely :
The coordinates of lie in , so the circuit over can hold them as wires and absorb them. The toy sponge over takes those two values and squeezes the output .
In this way, one small point can stand for any number of foreign points. The commitment binds them under the same assumption as any Pedersen commitment, now for the generators of the second curve:
Changing the first coordinate to each of the other values gives different points, and of those change the sponge's output as well. A vector of four entries from has possible values and has only 31 points, so collisions must exist. Here is one found by solving a discrete log: since , the vector gives the same point.
Both circuits need to read all of the step's data, which includes four kinds of values. The primary circuit is native to values in and to points on , and the secondary circuit is native to values in and to points on . The book's encoding for the primary circuit handles them in two layers. The values and points that it can read go directly into a part of its own trace, which gives a commitment on . Then , the points of and the values in all form one vector over , and the nested commitment to this vector is a point with coordinates in . The secondary circuit's encoding mirrors this, so that each circuit holds what it can read as wires and holds the rest behind one commitment.
The prover computes a nested commitment outside the circuit and supplies it as a witness. So at this stage the primary circuit knows that it hashed some point, and it does not yet know that the point contains the coordinates that the secondary circuit used. The next section adds that connection.
8. Deferred operations
Suppose the primary circuit's fold needs for some point on . It holds only , so it cannot compute this. The nested commitment binds the data without carrying over any operation on it. The secondary circuit has the coordinates of as wires and can do the multiplication, so the work moves there, and we call it a deferred operation.
For this to mean anything, the wires that the secondary circuit uses have to be the same values that commits to. The tool for this is a staged trace, which the staging chapter covers in full. The prover splits the secondary circuit's trace into two polynomials,
where holds the coordinates in slots reserved for it and holds everything else. It commits to each part separately, and the commitment to is the nested commitment that the transcript absorbed. The book then requires two checks. The commitments must add up to the commitment to the whole trace, and the parts must not overlap.
Here is a shortened trace that stands in for a real one, since the toy curve has too few points for more:
The circuit over adds and . Its stage holds and its later wires hold the slope, the difference of -coordinates and the output, , so the full vector is . With eight generators of , the stage commits to , the later part to , and the whole vector to . The next step's circuit over adds and in gates, gets , and compares it with .
These are points on , so the addition is native to the primary circuit and costs only a few gates. The check stops a prover who uses other coordinates:
Suppose the prover traces the circuit with a different -coordinate for while it leaves alone. We tried each of the other values. Each one changes , and all fail the comparison.
A commitment sum cannot enforce the second check, however, and the structure of our curve gives a sharp example:
Let the prover put in slot 0 of the later part, which is reserved for the stage. The stage still says , but the sum holds in that slot, so the circuit runs on in place of . That is a genuine point of , because modulo 31 and the equation of only sees . The commitment check still passes, since equals the commitment to the sum. It passes for all nonzero values in that slot, because a commitment to a sum equals the sum of the commitments however the entries overlap.
So a separate check has to show that is zero in the stage's slots. In our toy form, the verifier picks a random and asks for the combination over the reserved slots to be zero. This is a linear claim about that a circuit can fold, and Ragu expresses such a claim as a revdot product with a stage mask.
For the entry above, the combination equals at every , so all 31 values of catch it. A prover that uses two reserved slots can cancel at one , and over all pairs of nonzero entries, no pair passes at more than value of .
To summarize, each step leaves two kinds of work for the next. It has to check that the partial traces are well formed, and it has to check that the deferred group operations were computed correctly. Both are claims about a circuit that the next step folds like any other, which is why deferring them does not make them pile up.
9. Sharing one set of challenges
The two circuits must use the same challenges, because the primary circuit folds and the secondary circuit folds , and these only describe one polynomial if both use one . Running a second transcript in the secondary circuit would give different values. The book's answer is called transcript bridging. Only the primary circuit hashes, and its challenges serve both circuits. That is safe only together with the input consistency of Section 8, because the secondary circuit's inputs reach the transcript only through the nested commitments, and they have to be fixed before the challenges are.
The difficulty is that a challenge is an element of , and the secondary circuit has wires in . Section 4 showed that the two fields do not hold the same numbers:
Suppose the challenge is . On , the scalar is a value modulo 43, and . A circuit over that holds the number as one wire holds , and .
Two things fix this. First, the challenge is kept short enough that the same integer fits in both fields. In our run we used values below 16, and the code uses 143-bit values called endoscalars. Second, the circuit computes with the challenge through its bits, using the curve's endomorphism, in a way that the endoscalars chapter explains. In the code the short value maps to a scalar that is not the plain integer, and our toy run does not reproduce that map.
The secondary circuit still has to receive the right short value, and the primary circuit can check this from the outside. The prover puts the values in a stage of the secondary circuit with no blinding. The commitment to that stage is then a fixed combination of generators of , and those points are native to the primary circuit:
The stage holds the vector in , with no blinding, on the generators , and its commitment is . The circuit over knows the three challenges as wires, so it can break each into bits and compute on itself. This takes gates and gives . If the prover hands the other circuit any of the other values of , the stage commits to a different point, and the comparison fails.
A short challenge gives a prover a better chance of hitting a lucky value, since there are fewer values to try:
Take a cheater who claims and and shifts its values at by the same amounts, as in chapter 08. The error in is , so one value of out of the 43 passes, namely . Since the cheater aimed at a short value, that same one passes among the 16 short challenges, which moves its chance from in 43 to in 16.
On a real curve that chance is the degree of the error polynomial divided by , which remains negligible. The book notes that endoscalars are only for public challenges, since this shorter range would be unsafe for a secret.
10. Two steps of ping-pong
We can now run the whole pattern for two steps. In step 1, each circuit does the work of the table in Section 6. In step 2, each accumulator meets a new claim from the trace of a circuit in step 1. The toy curves cannot hold a full trace, so we use four wires of each circuit's trace as a stand-in polynomial and commit to it on that circuit's curve. The commitment made by the circuit over goes to the circuit over in the next step for its point arithmetic, and the same holds the other way around.
| Step 1 | Step 2 | |
|---|---|---|
| Accumulator on on entry | Claims , above | |
| Accumulator on on entry | Claims , above | |
| New claim on on entry | None | , from step 1's circuit over |
| New claim on on entry | None | , from step 1's circuit over |
| Challenges | ||
| Circuit over outputs | , | , |
| Circuit over outputs | , | , |
| Gates over / | 76 / 76 | 76 / 76 |
The gate counts do not change between steps, which is the fixed circuit that recursion requires. At the end, one decider handles both curves:
The decider commits to the two final polynomials and , which gives on and on , and it evaluates them at to get and . That single decision on each curve covers the two claims of step 1 and the two traces it produced. If the value in the accumulator on had been at the start of step 2, the circuit would have derived , and the decider would have rejected, since the polynomial still evaluates to .
11. Why cheating fails
The division of the fold leaves new places to cheat, so we go through them in the order of the sections above. In each case a check that the honest prover passes without effort catches the cheater, but the catch may come one step later or at the decider.
A wrong result from a circuit. A prover cannot report a wrong point, because the gates determine it:
We tried every wrong output for the addition of and with every possible slope witness, which makes attempts on the circuit over , and none satisfied the three gates. The transcript and the commitments did not enter into that count.
Different data for each circuit. Section 8 showed that the sum check catches a prover who uses other coordinates in a trace, and that the overlap check catches a prover who hides a change in a reserved slot. Changing itself to match would change the transcript and therefore every later challenge. So the prover has to commit to the secondary circuit's inputs before it learns the challenges, as in chapter 03's discussion of omitted data.
Different challenges for each circuit. Section 9 showed that the primary circuit recomputes the challenge stage's commitment on from its own transcript, so the secondary circuit cannot use any other values without a commitment mismatch.
Skipping the deferred work. Each check above happens in the next step, so the last step's checks have no later step to run them. This is why the decider has to examine both accumulators and the root proof's stages. If a false point or a false stage survives to the end, then one of the claims on or is false, and the decider rejects it by the argument of the accumulation chapter. A verifier that checks only one curve leaves half of every fold unconfirmed, since that half happened on the other side.
The argument rests on these assumptions, and it is informal. The discrete log relation assumption has to hold for the generators of both curves, so both curves have to be secure, which is one more reason an anomalous curve cannot serve. The transcript hash over has to behave as a random oracle. Challenges have to come after the data they test, and short challenges have to be long enough for the degree of the claims. The decider has to run on both sides.
12. Cycles in Ragu
The book describes the design as inspired by CycleFold. We could read only the abstract of CycleFold, which says that the second curve merely represents a single scalar multiplication in a tiny circuit, and that the first curve folds invocations of that circuit. Ragu's code shares the main feature of that picture, because its application lives on one side only. It differs in having several internal circuits on the other side and not one tiny circuit, and this comparison is our own.
Reconstructed from code at commit 3219e08, not confirmed by the authors
- Names. The code's native side is the primary circuit, over
CircuitField, with commitments onHostCurve. Its nested side is the secondary circuit, overScalarField, with commitments onNestedCurve. Polynomials on the nested side that hold native commitments are called bridge stages. AProoflists these three groups of polynomials, and one call tofuseproduces all of them. - Nested commitments.
compute_bridge_preambleplaces the children's Vesta commitments in a stage over and commits to it on Pallas. Thenfuseabsorbs that point and squeezes the first challenge, and thehashes_1circuit repeats this with gates. The transcript absorbs only such bridge commitments. Pallas commitments go into native points stages, whose Vesta commitments in turn ride in the bridge stages, so they too are fixed before the challenges that test them. - Folding the points. Each side has a walk that performs the Horner sum for the other side's . The nested walk folds points on Vesta over , and the native walk folds points on Pallas over . A walk does not fit in one circuit of at most gates, so the native one spreads across 23 circuits, each doing 4 endoscalings.
- Challenges. The nested side squeezes nothing, and it reads each challenge as a lift of a native one. Its challenge stage is committed without blinding, and the
bind_challengescircuits, finished by a parent'sbind_beta, recompute its commitment on Pallas. This is the check of Section 9. - The decider. The uncompressed verifier checks claims on both sides. It also rederives the root's challenge stage, because the root has no parent to bind it, which is the point about the last step in Section 11.
The book and the code differ in several places. We give each difference next to the book's text.
Application circuits on the secondary side
Book: each side has an application circuit, and the application state is a pair .
Code at 3219e08: every nested circuit is internal, and a step's headers are over CircuitField alone. The application lives only on the native side.
This site follows the code. It is also the closer match to the book's own description of the design as CycleFold-inspired.
Adding the stage commitments
Book: the commitments to the partial traces add up to the trace commitment, and the next circuit checks that in-circuit.
Code at 3219e08: we found no such addition. The only point additions in the internal circuits are in the two walks and the challenge bindings (bind_challenges, bind_beta). A proof keeps a commitment for each stage and no commitment to the whole trace, each stage's commitment goes into the batch on its own, and a circuit's claim uses the sum of its stage polynomials. So we read the code as establishing the sum through polynomial claims and not through a point addition. This reading is ours.
Section 8 teaches the book's form, because it shows the purpose of the check on small numbers. The site otherwise follows the code, and the staging chapter takes this further. The book's other description of which circuit runs the checks also differs, since it places both stage checks and staged commitment checks in the next step's secondary circuit, while the passage above places the sum in the primary circuit.
Which challenges are short
Book: the transcript bridging section sets the next verifier challenge to the endoscalar extracted from the hash output.
Code at 3219e08: on the native side, and are used as full field elements, and only is extracted to an endoscalar, because it is the one that scales points. The nested side lifts every challenge from its low bits.
This site follows the code. Our toy run uses short values on both sides to keep one set of numbers.
Earlier chapters recorded related differences. The book's base case and its root of initial states appear on each side of its cycle, and the code handles them as described there. The book's single fuse circuit per curve corresponds in the code to many internal circuits. The chapter on recursion in Ragu lists them.
All of this applies to the Ragu revision at 3219e08. Tachyon, which has not activated on mainnet and whose design is still changing, depends on this design through a different Ragu revision.
13. Where this chapter leaves us
This chapter took the following steps:
- A commitment's scalars and coordinates lie in different fields, so a circuit over the scalar field can fold values directly but cannot fold points directly.
- Emulating the other field with limbs works but multiplies each operation's cost so much that, in our plain design, one point addition already exceeds the size of a Ragu circuit.
- A 2-cycle of curves gives each field a curve whose points are native to it. Pallas and Vesta form such a cycle, and an anomalous single curve is not an option.
- Each recursive step has two circuits, and each one folds the values of its own accumulator and the points of the other, which it does for the instances of the previous step.
- A nested commitment places foreign data behind one point that the transcript's field can absorb.
- Group operations on foreign points move to the other circuit as deferred operations, and staged traces with sum and overlap checks tie that circuit's wires to the nested commitment.
- Only the primary circuit hashes. Challenges cross in a short form, and the primary circuit checks the secondary circuit's copy through a commitment on the curve that is native to it.
- Every check in a step depends on the next step, and the decider has to finish both curves' claims at the end.
So far our accumulators have folded evaluation claims, but a proof also holds the revdot claims of chapter 05. The next chapter folds those, and the split of this chapter applies to them too.