A. Optimizations

This contains all the optimizations made from the methods of BDFG21 and why they are correct. Please read the paper first 😘.

Method 1

This method is the fastest method for opening, and slightly slower for verification than Method 2. But, as written in the paper, verification is impractically slow for any appreciable number of polynomials/points. So here, we make an assumption to make the computation reasonable: each polynomial in is opened at all the same points, that is (using the notation from the paper) . We also assume each polynomial is the same degree, .

Method 1, Opening

Let . For brevity, assume sums over are done as

The prover has to compute, , which means they must compute the coefficients of and then do scalar multiplications and some addition. is defined as Here, is the unique degree polynomial such that . Note that polynomial fraction divides cleanly, because for all , meaning it has factors of , and so does .

The term is just the unique minimal degree polynomial you need to subtract from to allow to cleanly divide it. But, this also means that is simply the remainder of dividing and . And the same applies for : is just the remainder you get when you divide the sum of s by ! So all they need to do in order to compute is to

  1. Compute
  2. Use a polynomial division algorithm to divide by
  3. Take the result and throw away the remainder

This makes opening very fast, because no interpolation is needed.

Method 1, Verification

For verification, the verifier needs to do a little more legwork than the prover. Let the commitment to the -th polynomial be

First, the verifier needs to compute That's simple enough, now they have to compute Constraining the points lets them compute a single pairing instead of ! Now let's look at each side of pairing. To compute the LHS, they need to compute . Sadly, there's no nice way around this here, it must be interpolated, but they can interpolate once rather than interpolate each . That leaves us with

  • scalar mults

  • scalar mults

Then all they're left with is the single pairing. Next they have to compute . Computing is pretty straightforward, and all they are left to do is the scalar multiplications. If you already know your ahead of time, the term can be cached.

This leaves us with the following amount of operations (other operations impact runtime fairly little)

OperationOpen quantityVerify quantity
Polynomial Interpolation01
G1 Scalar Multiplication
G2 Scalar Multipcication0 (can be cached)
Pairing02

Interestingly, the opening time gets smaller as the size of grows, due to the growing degree of the vanishing polynomial.

Method 2

Method 2 is an equally secure way to generate blocked openings, which biases computation slightly more to the opener than the verifer. They use the same assumptions as in Method 1.

Method2, Opening

The prover computes for since so . This looks very familiar from method 1! Here they just compute then compute the quotient and for now, ignore the remainder. Then they compute . This is scalar multiplications.

This method has additional challenge other than , called which must take into account . After seeing , the verifier sends a . In reality this should be abstracted away using a Fiat-Shamir transform.

The prover then computes for

Here we notice that we have already computed when we computed the remainder of . All they have to do is take this remainder, evaluate it at , and then subtract it from . They then evaluate , compute , then compute the polynomial and evaluate .

Here, is of degree , so computing involves scalar multiplications.

The proof then consists of .

Method 2, Verification

The verifier receives , the commitments , the evaluations of the at each and computes To do this, they do lagrange interpolation of , evaluate it at , then do the single scalar multiplication. Computing is scalar multiplications, and one more for computing . Next the verifier checks Which involves 2 pairings, and 2 scalar multiplications, yielding

OperationOpen quantityVerify quantity
Polynomial Interpolation0
G1 Scalar Multiplication
G2 Scalar Multipcication0
Pairing0

Comparing the two methods, we get

OperationMethod 1 OpenMethod 2 OpenMethod 1 VerifyMethod 2 Verify
Polynomial Interpolation001
G1 Scalar Multiplication
G2 Scalar Multipcication00 (can be cached)
Pairing002