Skip to main content

KZG Polynomial Commitment Scheme

KZG polynomial commitment scheme KZG10 plays an important role in making the polynomial constraints of PlonK's arithmetization become a zkSNARK GWC19.

In this section, we provide the syntax and security requirements of a polynomial commitment scheme (PCS) in Polynomial Commitment Scheme - Definition. Then, we show some instantiations of the scheme by discussing its technical overview in Technical Overview.

Author(s): khaihanhtang

Polynomial Commitment Scheme - Definition

In this section, we provide the definition of polynomial commitment scheme including syntax and security requirements. Syntax describes how the scheme works through algorithms while security requirements enforce the scheme to satisfy in order to make it secure.

Syntax is presented in Syntax and security requirements are presented in Security Requirements.

Syntax

A polynomial commitment scheme, for polynomials over a field F\mathbb{F}, is a tuple of 55 algorithms (Setup,Commit,VerifyPoly,CreateWitness,VerifyEval)(\mathsf{Setup}, \mathsf{Commit}, \mathsf{VerifyPoly}, \mathsf{CreateWitness}, \mathsf{VerifyEval}) working as follows:

  • Setup(1κ,t):\mathsf{Setup}(1^\kappa, t): On inputs security parameter 1κ1^\kappa and a degree bound tt, this algorithm returns a commitment key ckck. The key ckck allows to commit any polynomial in F[X]\mathbb{F}[X] whose degree is at most tt.

Above we use the notation F[X]\mathbb{F}[X] to denote the field extension of F\mathbb{F}. For intuition, this field extension contains every polynomial of the form f(X)=j=0deg(f)cjXjf(X) = \sum_{j = 0}^{\deg(f)} c_j \cdot X^j where deg(f)\deg(f) is the degree of f(X)f(X) and cjFc_j \in \mathbb{F} for all j0,,deg(f)j \in \\{0, \dots, \deg(f)\\}. Hence, with the algorithm Setup\mathsf{Setup} on input tt, we can assume that it allows to commit to any polynomial ff satisfying deg(f)t\deg(f) \leq t.

We may have a question about what will happen if we try to use ckck to commit to a polynomial whose degree is larger than tt. In this case, the execution and correctness of the algorithms below or the security of the scheme are not guaranteed.

  • Commit(ck,f(X)):\mathsf{Commit}\left(ck, f(X)\right): On inputs commitment key ckck and polynomial f(X)F[X]f(X) \in \mathbb{F}[X], this algorithm returns a commitment cc and an opening (or decommitment) dd. We note that f(X)f(X) here is recommended to have degree at most tt with respect to ckck output by Setup(1κ,t)\mathsf{Setup}(1^\kappa, t).

  • VerifyPoly(ck,f(X),c,d):\mathsf{VerifyPoly}(ck, f(X), c, d): On inputs commitment key ckck, polynomial f(X)F[X]f(X) \in \mathbb{F}[X], commitment cc and opening dd, this algorithm deterministically returns a bit b0,1b \in \\{0, 1\\} to specify whether cc is a correct commitment to f(X)f(X). If cc is such a correct commitment, then b=1b = 1. Otherwise, b=0b = 0.

At this moment, we may wonder why Commit\mathsf{Commit} does output both c,dc, d and VerifyPoly\mathsf{VerifyPoly} does use both c,dc, d. In fact, when participating in an interactive protocol, one party may commit to some secret by exposing commitment cc to other parties. This commitment cc guarantees that the secret behind, namely, polynomial f(X)f(X) in this case, is still secret, guaranteed the hiding property to be discussed later.

On the other hand, since we abuse the word commit, it means that the party publishing cc has only one opening, namely, dd, to show that cc is a correct commitment to f(X)f(X). It is extremely hard for this party to show that cc is correct commitment to some other polynomial f(X)f(X)f'(X) \not= f(X). This is guaranteed by the binding property of the polynomial commitment scheme, to be discussed later.

  • CreateWitness(ck,f(X),i,d):\mathsf{CreateWitness}(ck, f(X), i, d): On inputs commitment key ckck, polynomial f(X)f(X), index ii and opening dd, this algorithm returns a witness wiw_i to ensure that cc, related to opening dd, is commitment to f(X)f(X) whose evaluation at index ii is equal to f(i)f(i).

Let us explain in detail the use of CreateWitness\mathsf{CreateWitness}. Assume that a party published cc which is a commitment to f(X)f(X). It then publishes a point (i,v)(i, v) and claims that f(i)=vf(i) = v without exposing f(X)f(X). By using the algorithm VerifyEval\mathsf{VerifyEval} defined below, this claim is assured if f(i)f(i) is actually equal to vv. Moreover, for all other indices ii' satisfying iii' \not= i, if f(i)f(i') has not been opened before, then f(i)f(i') is unknown to any party who does not know f(X)f(X).

We also remark that, from basic algebra, if we know evaluations at deg(f)+1\deg(f) + 1 distinct indices, we can recover the polynomial f(X)f(X). Therefore, the above claim assumes that other parties do not know up to deg(f)+1\deg(f) + 1 distinct evaluations.

  • VerifyEval(ck,c,i,v,wi):\mathsf{VerifyEval}(ck, c, i, v, w_i): On inputs commitment key ckck, commitment cc, index ii, evaluation vv and witness wiw_i, this algorithm returns 0,1\\{0, 1\\} deciding whether cc is a commitment key f(X)f(X) satisfying f(i)=vf(i) = v.

Security Requirements

In this section, we briefly discuss the security requirement for polynomial commitment schemes.

A polynomial commitment scheme is said to be secure if it satisfies the following properties:

  • Correctness. The correctness property says that if the scheme is executed honestly then the verification algorithms, namely, VerifyPoly\mathsf{VerifyPoly} and VerifyEval\mathsf{VerifyEval}, always returns 11. In particular, assume that ckSetup(1κ,t)ck \leftarrow \mathsf{Setup}(1^\kappa, t) and (c,d)Commit(ck,f(X))(c, d) \leftarrow \mathsf{Commit}(ck, f(X)). Then, VerifyPoly(ck,f(X),c,d)\mathsf{VerifyPoly}(ck, f(X), c, d) always returns 11. And, for any wiw_i output by CreateWitness(ck,f(i),i,d)\mathsf{CreateWitness}(ck, f(i), i, d), algorithm VerifyEval(ck,c,i,f(i),wi)\mathsf{VerifyEval}(ck, c, i, f(i), w_i) always returns 11.

  • Polynomial Binding. For a given commitment key ckck output by Setup(1λ,t)\mathsf{Setup}(1^\lambda, t), this property says that it is hard to output commitment cc and two tuples (f(X),d)(f(X), d) and (f(X),d)(f'(X), d') such that f(X)f(X) and f(X)f'(X) are distinct and have degrees at most tt, and cc is commitment to both f(X)f(X) and f(X)f'(X) with respect to openings dd and dd', respectively. More precisely, it is hard to make VerifyPoly(ck,f(X),c,d)=1\mathsf{VerifyPoly}(ck, f(X), c, d) = 1 and VerifyPoly(ck,f(X),c,d)=1\mathsf{VerifyPoly}(ck, f'(X), c, d') = 1 if f(X)f(X)f(X) \not= f'(X), deg(f)t\deg(f) \leq t and deg(f)t\deg(f') \leq t.

  • Evaluation Binding. The evaluation binding property says that a committed polynomial evaluating on an index ii cannot produce two different outcomes vv and vv'. More precisely, an adversary cannot provide an index ii and 22 tuples (v,wi)(v, w_i) and (v,wi)(v', w'_i) satisfying vvv \not= v' such that VerifyEval(ck,c,i,v,wi)=1\mathsf{VerifyEval}(ck, c, i, v, w_i) = 1 and VerifyEval(ck,c,i,v,wi)=1\mathsf{VerifyEval}(ck, c, i, v', w'_i) = 1.

  • Hiding. An adversary A\mathcal{A} who knows at most deg(f)\deg(f) evaluations of a committed polynomial f(X)f(X) cannot determine any evaluation that it does not know before.

We remind that knowing deg(f)+1\deg(f) + 1 different evaluations helps to determine polynomial, and hence all other evaluations. Therefore, we use the bound deg(f)\deg(f) here as a maxmimum number of evaluations that the adversary is allowed to know in order not to correctly obtain the evaluations of all other indices.

Technical Overview

From the syntax of polynomial commitment scheme presented in Polynomial Commitment Scheme - Syntax, a realization, or equivalently, a construction, can be separated into 22 components:

  • Commiting polynomial includes the algorithms Commit\mathsf{Commit} and VerifyPoly\mathsf{VerifyPoly}.
  • Evaluating polynomial includes the algorithms CreateWitness\mathsf{CreateWitness} and VerifyEval\mathsf{VerifyEval}.

Based on those components, we present the high level idea of 22 constructions, namely, conditional and unconditional, of polynomial commitment scheme separated into 33 little parts. The first and second parts, to be presented in Commitment to Polynomial Without Hiding Property and Correct Evaluation from the Commitment, respectively, focus on constructing the realization of conditional version. And, in the third part, to be presented in Dealing with Hiding, regarding condition and unconditional hidings, we discuss the modification of conditional version to achieve the unconditional one.

Commitment to Polynomial Without Hiding Property

In the construction of KZG10, the main idea to commit a polynomial is to evaluate it on a secret index. For example, assume that f(X)=a0+a1X++adXdF[X]f(X) = a_0 + a_1 X + \dots + a_d X^d \in \mathbb{F}[X]. The secret index can be thought of as some value xx that the committer does not know. So, how can committer evaluate f(x)f(x) on that secret index without any knowledge about it? In fact, cryptography can magically help you do that. For instance, by putting 1,x,x2,,xn1, x, x^2, \dots, x^n into the form of powers to some base element gg, e.g., g1,gx,gx2,,gdg^1, g^x, g^{x^2}, \dots, g^d, it helps to hide those values 1,x,x2,,xd1, x, x^2, \dots, x^d. Moreover, it alows you to evaluate gf(x)g^{f(x)} as desired by computing (g1)a0(gx)a1(gx2)a2(gxd)ad=ga0+a1x+adxd=gf(x). (g^1)^{a_0} \cdot (g^x)^{a_1} \cdot (g^{x^2})^{a_2} \cdot \dots \cdot (g^{x^d})^{a_d} = g^{a_0 + a_1x + \dots a_d x^d} = g^{f(x)}. Thus, gf(x)g^{f(x)} is computed without any knowledge about xx. Hence, that is whatever the committer needs to do in the commit step, namely, executing the algorithm Commit\textsf{Commit} to output the commitment gf(x)g^{f(x)}. So the commitment key ckck for this algorithm is the hidden indices wrapped under powers of gg, namely, the set sequence (g1,gx,gx2,,gxd)(g^1, g^{x}, g^{x^2}, \dots, g^{x^d}). And, therefore, (g1,gx,gx2,,gxd)(g^1, g^{x}, g^{x^2}, \dots, g^{x^d}) is also the output of the algorithm Setup\textsf{Setup}. At this point, we might think about a few things:

  1. How to verify the commitment c=gf(x)c = g^{f(x)} by executing VerifyPoly\textsf{VerifyPoly}.
  2. How to guarantee that the commitment satisfies the polynomial binding property.

For the first question, to verify cc, the decommitment of the construction is f(X)f(X) itself. Committer simply send the entire polynomial f(X)f(X) to verifier, namely, by sending coefficients a0,,ada_0, \dots, a_d. Having the polynomial and the commitment key ckck, the verifier can check easily by repeating steps similar to the algorithm Commit\textsf{Commit}.

For the second question, to show the satisfaction of binding property, we can assume that the committer is able to break the binding property by introducing another polynomial f(X)=a0+a1X++adXdf'(X) = a'_0 + a'_1X + \dots + a'_dX^d where f(X)f(X)f'(X) \not= f(X). So we have gf(x)=c=gf(x)g^{f(x)} = c = g^{f'(x)}.

Correct Evaluation from the Commitment

Warning. This part explains by the use of algebra. You may skip if you feel it is complicated.

For an index ii given to the committer, since committer knows f(X)f(X), he can compute f(i)f(i) definitely. The CreateWitness\mathsf{CreateWitness} algorithm is constructed based on the fact that XiX - i divides f(X)f(i)f(X) - f(i). At this point, there is something difficult to realize here since it regards to the use of algebra. However, we know that f(i)f(i) is the output of f(X)f(X) on input ii. Therefore, we see that ii is among the roots of g(X)=f(X)f(i)g(X) = f(X) - f(i), i.e., g(i)=0g(i) = 0 which says that ii is a root of g(X)g(X). Therefore, XiX - i divides f(X)f(i)f(X) - f(i). Hence, to guarantee the evaluation binding property, committer needs to show that f(X)f(i)f(X) - f(i) is divisible by XiX - i.

Example. Consider polynomial f(X)=6X3+25X2+16X+19f(X) = 6X^3 + 25X^2 + 16X + 19 in Z31 \mathbb{Z}_{31}. Let i=28i = 28. Then, f(28)=151779=3f(28) = 151779 = 3 in Z31\mathbb{Z} _{31}. Hence, X28=X+3X - 28 = X + 3 divides f(X)3f(X) - 3. In fact, f(X)3=6X3+25X2+16X+16=(3X+5)(2X+30)(X+3) in Z31. f(X) - 3 = 6X^3 + 25X^2 + 16X + 16 = (3X + 5)(2X + 30)(X + 3)\text{ in } \mathbb{Z} _{31}. It is obvious that X+3X + 3 is a factor of f(X)3f(X) - 3.

Equivalently, we can say that v=f(i)v = f(i) if and only if XiX - i divides f(X)f(i)f(X) - f(i).

To show such divisibility holds, we can compute ψ(X)=f(X)viXi\psi(X) = \frac{f(X) - v_i}{X - i}, where viv_i is assumed to be f(i)f(i), and define witness wi=gψ(x)w_i = g^{\psi(x)} by using g1,gx,,gxdg^1, g^x, \dots, g^{x^d} output by the algorithm Setup\textsf{Setup}.

At this point, for the verifier to verify, committer needs to show that ψ(x)(xi)+vi=f(x)\psi(x) \cdot (x - i) + v_i = f(x). Let's closely take a look at this formula. We observe the followings:

  1. No one knows xx. Hence, ψ(x)\psi(x) is not known to anyone.
  2. Committer and verifier know gψ(x)g^{\psi(x)} which is equal to the commitment cc. Moreover, they also know gx,gi,gvig^x, g^i, g^{v_i} since gxg^x belongs to commitment key ckck, ii is public and viv_i is publicly claimed by committer.
  3. Verifier can easily compute gxi=gx/gig^{x - i} = g^x / g^i.

Clearly, having gψ(x),gxi,gvig^{\psi(x)},g^{x - i}, g^{v_i} and gf(x)g^{f(x)}, we do not know any efficient way to compute gψ(x)(xi)+vig^{\psi(x)\cdot (x - i) + v_i} since computing gψ(x)(xi)g^{\psi(x)\cdot (x-i)} is hard due to Diffie-Hellman assumption.

Using Bilinear Pairing to Handle Correct Multiplications

Recall the bilinear pairing e:G×GGTe : \mathbb{G}\times \mathbb{G} \to \mathbb{G}_T where G\mathbb{G} and GT\mathbb{G}_T are some groups of the same cardinality. This bilinear pairing has 22 properties: bilinearity and non-degeneracy. However, to avoid confusion, we only care about the bilinearity and temporarily skip the notice to non-degeneracy.

  • Bilinearity. For gGg \in \mathbb{G} and gTGTg_T \in \mathbb{G}_T, e(ga,gb)=e(g,g)abe(g^a, g^b) = e(g, g)^{ab} for any a,bZpa, b \in \mathbb{Z}_p where p=Gp=|\mathbb{G}|.

The validity of the witness can be check easily by using pairing, namely, e(wi,gx/gi)e(g,g)vi=?e(c,g),e(w_i, g^x / g^i)\cdot e(g,g)^{v_i} \stackrel{?}{=}e(c, g), where cc is the commitment to f(X)f(X). If the above identity holds, with non-negligible probability, it says that vi=f(i)v_i = f(i).

To show identity implies vi=f(i)v_i = f(i) with non-negligible probability, we consider wi=gψ(x)=gf(x)vixiw_i = g^{\psi(x)} = g^{\frac{f(x) - v_i}{x - i}}. Hence,

e(wi,gx/gi)e(g,g)vi=e(gf(x)vixi,gx/gi)e(g,g)vi=e(g,g)f(x)vie(g,g)vi=e(gf(x),g)=e(c,g). \begin{align} e(w_i, g^x / g^i)\cdot e(g, g)^{v_i} &= e\left(g^{\frac{f(x) - v_i}{x - i}}, g^x / g^i\right)\cdot e(g, g)^{v_i}\\\\ &= e(g, g)^{f(x) - v_i}\cdot e(g, g)^{v_i} = e(g^{f(x)}, g) = e(c, g). \end{align}

Notice that, if the person providing wiw_i and viv_i does not know f(X)f(X), then we have the following possibilities:

  • This person correctly guesses wiw_i and viv_i. This happens with negligible probability if we assumes that field cardinality, namely, number of elements in field F\mathbb{F}, is large.
  • The person incorrectly provides wiw_i and viv_i. Specificially, either viv_i is not equal to f(i)f(i) or wiw_i is incorrect. Assume that wi=ghiw_i = g^{h_i}. This case happens when xx is the root of hi(Xi)vi=f(X)h_i\cdot (X - i) \cdot v_i = f(X). By Schwartz–Zippel lemma, this case also happens with negligible probability if the field cardinality is large and that person does not know xx, as xx at the beginning was assumed to be hidden index.

Dealing with Hiding

In the previous sections, namely, Commitment to Polynomial Without Hiding Property and Correct Evaluation from the Commitment, we discussed the high level idea of the construction of algorithms as well as the polynomial and evaluation binding properties. One remaining thing is the hiding property. In KZG10, the authors proposed 22 constructions from discrete logarithm assumption, for conditional hiding, and Pedersen commitment, for unconditional hiding.

Remark. We now make clear the 22 notions here, namely, conditional hiding and unconditional hiding.

Conditional hiding of a commitment cc to a polynomial f(X)f(X) is the property protecting the polynomial f(X)f(X) from being compromised with a condition that some assumption employed is assumed to be hard. Usually, the hardness of the assumption is against probabilistic polynomial-time adversaries. Here, probabilistic polynomial-time adversaries stand for the machines that attack the scheme with limited amount of time, and this amount of time is upper-bounded by a polynomial on input the security parameter given to the scheme. Probabilistic polynomial time is a notion in the theory of computation. If you would like to know more about the detail, we prefer to check some textbooks. For example, we prefer Sipser2012-introduction-to-theory-of-computation in this blog.

On the other hand, unconditional hiding means that we cannot extract any information about the polynomial behind. For example, if f(X)=a0+a1X++adXdf(X) = a_0 + a_1X + \dots + a_dX^d and r(X)=r0+r1X++rdXdr(X) = r_0 + r_1X + \dots + r_dX^d, given that r0,,rdr_0, \dots, r_d are independently and uniformly sampled from F\mathbb{F}, then f(X)+r(X)=(a0+r0)+(a1+r1)X++(ad+rd)Xdf(X) + r(X) = (a_0 + r_0) + (a_1 + r_1)X + \dots + (a_d + r_d)X^d completely hides f(X)f(X) since a0+r0,a1+r1,,ad+rda_0 + r_0, a_1 + r_1, \dots, a_d + r_d are uniform in F\mathbb{F}.

Conditional hiding from discrete logarithm assumption

The former, namely, discrete logarithm assumption, guarantees the hiding by its own hardness assumption. In particular, given gg and gvg^v for some secret integer vv, there is no way to extract any piece of information about vv from gg and gvg^v due to hardness of discrete logarithm problem. Therefore, the hiding here is conditional, i.e., discrete logarithm assumption is hard.

Unconditional hiding from Pedersen commitment

The latter, namely, using Pedersen commitment, exploits the use of an additional part to achieve unconditional hiding property, which is secure against powerful adversaries and not limited to PPT ones. Roughly speaking, the external part can be informally thought of as a commitment to a random polynomial with conditional hiding. To perform this, we extend the commitment key ckck to contain additional elements h1,hx,,hxdh^1, h^x, \dots, h^{x^d} where hh is another generator of G\mathbb{G} different from gg. Hence, the commitment key ckck now is the tuple (g1,,gxd,h1,,hxd)(g^1, \dots, g^{x^d}, h^1, \dots, h^{x^d}). Therefore, whenever committing to a polynomial f(X)=a0+a1X++adXdf(X) = a_0 + a_1X + \dots + a_dX^d, we additionally sample a polynomial r(X)=r0+r1X++rdXdF[X]r(X) = r_0 + r_1X + \dots + r_dX^d\in \mathbb{F}[X]. The sampling process can be conducted easily by sampling each rir_i uniformly and independently from ZF=0,,F1\mathbb{Z}_{|F|} = \\{0, \dots, |F| - 1\\}.

The algorithm Commit\textsf{Commit} now can be evaluated by computing

c=i=0d(gxi)aii=0d(hxi)ri=gf(x)hr(x), c = \prod_{i = 0}^d (g^{x^i})^{a_i} \cdot \prod_{i = 0}^d (h^{x^i})^{r_i} = g^{f(x)}\cdot h^{r(x)},

namely, the original conditional-hiding commitment to f(X)f(X) multiplying with the condition-hiding commitment to random polynomial r(X)r(X) becomes an unconditional commitment cc where auxiliary information aux\textsf{aux} can be set to be the tuple (f(X),r(X))(f(X), r(X)). Hence, now, the adversary knows nothing about the evaluations of any index in F\mathbb{F}. We can see clearly that the commitment cc hides f(X)f(X) unconditionally since r0r_0 is chosen uniformly from ZF\mathbb{Z}_{|\mathbb{F}|} and, hence, (hx0)r0(h^{x^0})^{r_0} is uniform in F\mathbb{F}. It also implies that cc is uniform in F\mathbb{F}.

Since c=gf(x)hr(x)c = g^{f(x)}\cdot h^{r(x)}, we can say that cc is the multiplication of two parts, namely, the message part gf(x)g^{f(x)} and the randomness part hr(x)h^{r(x)}.

We now discuss how algorithms CreateWitness\textsf{CreateWitness} and VerifyEval\textsf{VerifyEval} work with respect to introductory of the additional part, namely, hr(x)h^{r(x)}.

Creating witness in unconditional hiding mode

For a given index ii, the witness output by algorithm CreateWitness\textsf{CreateWitness} is also a multiplication of 22 parts. We simply call the message evaluation and randomness evaluation parts.

The message evaluation part is computed identically to the conditional version of the commitment scheme. That is, we compute the formula gψ(x)g^{\psi(x)} where ψ(X)=f(X)f(i)Xi\psi(X) = \frac{f(X) - f(i)}{X - i}.

The randomness evaluation part is also conducted similarly. Notice that, since we employ r(X)r(X) as a polynomial of degree dd, we can compute witness for the correct evaluation on the same index ii, namely, r(i)r(i). This randomness evaluation part is equal to hφ(x)h^{\varphi(x)} where φ(X)=r(X)r(i)Xi\varphi(X) = \frac{r(X) - r(i)}{X - i}.

Remark. As previously said, xx is unknown to committer. Therefore, the computation of gψ(x)g^{\psi(x)} and hφ(x)h^{\varphi(x)} must depend on the commitment key ckck by employing the elements g1,,gxd1,h1,,hxd1g^1, \dots, g^{x^{d - 1}}, h^1, \dots, h^{x^{d - 1}}. Notice that we do not you gxdg^{x^d} and hxdh^{x^d} since ψ(X)\psi(X) and φ(X)\varphi(X) are polynomials of degrees at most d1d - 1.

The output of algorithm CreateWitness\textsf{CreateWitness} is then equal to wi=(wi,si)w_i = (w^\star_i, s_i) where wi=gψ(x)hφ(x)w^\star_i = g^{\psi(x)} \cdot h^{\varphi(x)} is the multiplication of message evaluation and randomness evaluation parts and si=r(i)s_i = r(i). Notice that r(i)r(i) is attached to witness in order to help the evaluation verification algorithm, to be described below, work.

Verifying correct evaluation in unconditional mode

The evaluation verification algorithm VerifyEval\textsf{VerifyEval} receives as inputs the commitment key ck=(g1,,gxd,h1,,hxd)ck = (g^1, \dots, g^{x^d}, h^1, \dots, h^{x^d}), commitment cc to f(X)f(X), index ii, value viFv_i \in \mathbb{F} assumed to be equal to f(i)f(i) and wi=(wi,si)w_i = (w^\star_i, s_i). This algorithm is expected to return 11 is viv_i is equal to f(i)f(i) with the use of associated witness wiw_i.

To verify whether vi=f(i)v_i = f(i), it is worth to verify both correct computations of f(i)f(i) and r(i)r(i). More precisely, verifier needs to confirm that vi=f(i)v_i = f(i) and si=r(i)s_i = r(i). To this end, again, we imitate the verification process of the conditional hiding case. Hence, we employ again bilinear pairing e:G×GGTe : \mathbb{G}\times \mathbb{G} \to \mathbb{G}_T which maps (ga,gb)(g^a, g^b) to e(g,g)abe(g, g)^{ab}. However, there is an obstacle here. Observe that, in this pairing, we use only 11 generator gg while our commitment employs 22 different generators gg and hh both generating GG. In order to enable the bilinear pairing, we enforce h=gγh = g^\gamma for some hidden γ\gamma. This enforcement works because gg is the generator of G\mathbb{G} and hh belongs to G\mathbb{G}. Hence, our commitment cc can be alternatively written as

c=gf(x)hr(x)=gf(x)gγr(x)=gf(x)+γr(x) c = g^{f(x)}\cdot h^{r(x)} = g^{f(x)}\cdot g^{\gamma \cdot r(x)} = g^{f(x) + \gamma\cdot r(x)}

which is a conditional commitment to f(X)+γr(X)f(X) + \gamma\cdot r(X) with γ\gamma unknown to both committer and verifier.

Moreover, the witness wi=gψ(x)hφ(x)w^\star_i = g^{\psi(x)}\cdot h^{\varphi(x)} can also be interpreted as

wi=gψ(x)hφ(x)=gψ(x)gγφ(x)=gψ(x)+γφ(x) w^\star_i = g^{\psi(x)}\cdot h^{\varphi(x)}=g^{\psi(x)} \cdot g^{\gamma\cdot \varphi(x)} = g^{\psi(x) + \gamma\cdot \varphi(x)}

which is also a witness for correct evaluation at index ii with respect to polynomial f(X)+γr(X)f(X) + \gamma\cdot r(X) whose γ\gamma is not known to both parties, namely, committer and verifier.

We now observe that ψ(X)+γφ(X)=f(X)f(i)Xi+γr(X)r(i)Xi\psi(X) + \gamma\cdot \varphi(X) = \frac{f(X) - f(i)}{X - i} + \gamma\cdot \frac{r(X) - r(i)}{X - i}. Hence, it is worth to guarantee the following equation holds:

(f(X)f(i)Xi+γr(X)r(i)Xi)(Xi)(f(i)+γr(i))=f(X)+γr(X). \left(\frac{f(X) - f(i)}{X - i} + \gamma\cdot \frac{r(X) - r(i)}{X - i}\right)\cdot\left(X - i\right) - (f(i) + \gamma\cdot r(i)) = f(X) + \gamma \cdot r(X).

We now describe the process for verifying the above equation by employing the bilinear pairing function g:G×GGTg : \mathbb{G}\times \mathbb{G} \to \mathbb{G}_T. Since the above equation has a multiplication, we apply the bilinear pairing by checking

e(gf(x)vixi+γr(x)sixi,gxi)e(g(vi+γsi),g)=e(gf(x)+γr(x),g) e\left(g^{\frac{f(x) - v_i}{x - i} + \gamma\cdot \frac{r(x) - s_i}{x - i}}, g^{x - i}\right)\cdot e\left(g^{-\left(v_i + \gamma\cdot s_i\right)}, g\right) = e\left(g^{f(x) + \gamma\cdot r(x)},g\right)

where xx and γ\gamma are unknown to both parties. Since xx and γ\gamma are not known to both parties, it is inconvenient to evaluate the bilinear pairing function. However, since ck=(g1,,gxd,h1,,hxd)ck = (g^1, \dots, g^{x^d}, h^1, \dots, h^{x^d}) and h=gγh = g^\gamma are public inputs, we can replace the appearances of xx and γ\gamma in the above equation by those of ckck and hh. The above computation of bilinear pairing hence becomes

e(w,gx/gi)e(gvihsi,g)=e(c,g) e\left(w^\star, g^x / g^i\right)\cdot e\left(g^{-v_i}\cdot h^{-s_i}, g\right) = e(c, g)

since c=gf(x)hr(x)=gf(x)+γr(x)c = g^{f(x)}\cdot h^{r(x)} = g^{f(x) + \gamma\cdot r(x)}.