Gravitational plate of three masses and a slashed discABC0Static engraved plate. Three-dimensional view is unavailable or reduced motion is requested.

← back to fieldarticle

articleJul 23, 2025

Exploring KZG polynomial commitments

Why constant-size polynomial commitments beat per-coefficient Pedersen commits, how pairings and t-SDH/t-BSDH underwrite KZG, and the Setup / Commit / CreateWitness / VerifyEval flow.

Exploring KZG polynomial commitments

Review: Constant-Size Commitments to Polynomials and Their Applications

This note answers a basic question: why should we use polynomial commitment schemes instead of existing commitment schemes like Pedersen commitments? While Pedersen commitments are well-suited for committing to message strings, they prove inefficient when we need to hide an entire polynomial while revealing only specific evaluation values. Moreover, if we commit to polynomial coefficients individually, the commitment size grows proportionally to the polynomial degree—a significant drawback. In essence, polynomial commitments address a crucial need in cryptographic protocols: hiding not just single values but entire collections of data or functions themselves while still proving their properties. Before examining polynomial commitment schemes, we need to understand Pedersen commitments.

1. Pedersen Commitment Scheme

"Individually..." Essentially, this is a commitment for single values—to commit to n values, you must create n independent commitments.

Assuming we have n messages m₁, m₂, ..., mₙ, we can express this as follows:

\begin{align} C_1 &= g^{m_1}h^{r_1} \ C_2 &= g^{m_2}h^{r_2} \ &\vdots \ C_n &= g^{m_n}h^{r_n} \end{align}

This generates n commitments (C₁, C₂, ..., Cₙ). To prove that mᵢ is correct, one must reveal rᵢ and verify that it matches Cᵢ.

Security Properties

Each Pedersen commitment fundamentally possesses hiding and binding properties:

  • Hiding

    • From commitment CiC_i alone, no information about message mim_i can be obtained.
    • Since one can select a different random value rir'_i to create gmihri=Cig^{m'_i}h^{r'_i} = C_i for mim'_i, it's impossible to infer what mim_i is.
  • Binding

    • The committed message mim_i is fixed based on the DLP. That is, changing mim_i to mim'_i while maintaining the same commitment CiC_i is considered computationally infeasible.
  • Opening and Verifying

    • To prove that mim_i is correct, the committer reveals the random value rir_i used along with the message mim_i
    • The verifier checks whether Ci=gmihriC_i = g^{m_i}h^{r_i} holds
    • Since each commitment is independent, opening or verifying one commitment has no effect on the commitments of other messages.

Limitations

This becomes particularly problematic when committing to polynomial coefficients. For example, if we individually commit to the coefficients φ0,,φt\varphi_0, \dots, \varphi_t of a polynomial φ(x)\varphi(x) of degree tt, the total commitment size grows to t+1t+1 group elements—increasing proportionally to the polynomial degree. This results in inefficient performance for certain cryptographic applications that require constant-size commitments (such as when revealing only polynomial evaluations while keeping the entire polynomial hidden). These limitations led to the emergence of new polynomial commitment schemes (PolyCommit_DL, PolyCommit_Ped).

2. Understanding the Concept

Why Are Pairings Necessary?

Without Pairings

Consider a typical ECC group GG with generator gg. We can easily compute values like ga,gbg^a, g^b.

  1. What we can do: Verify addition/subtraction relationships in the exponent

    • We can check if gcg^c equals gagbg^a \cdot g^b → This verifies the relationship c=a+bc = a + b
  2. What we cannot do: Verify multiplication/division relationships in the exponent

    • There's no direct way to verify if gcg^c equals gabg^{ab}
    • Computing gabg^{ab} from only ga,gbg^a, g^b without knowing a,ba, b is called the Computational Diffie-Hellman (CDH) problem—a very hard problem

In other words, we have no way to verify non-linear relationships like multiplication/division between values hidden in exponents.

With Pairings

e(ga,gb)=e(g,g)abe(g^a, g^b) = e(g, g)^{ab} → The pairing of gag^a and gbg^b equals the abab-th power of the pairing of gg with itself.

Verifying Multiplication Relationships in Exponents

Suppose someone claims "I know a,b,ca, b, c and these three numbers satisfy c=abc = ab." They give the verifier ga,gb,gcg^a, g^b, g^c.

  • Without pairings → We can only trust this claim
  • With pairings → We can verify:
    • Compute e(ga,gb)e(g^a, g^b) (result is e(g,g)abe(g,g)^{ab})
    • Compute e(g,gc)e(g, g^c) (result is e(g,g)ce(g,g)^c)
    • Compare the two results

If they're equal, then e(g,g)ab=e(g,g)ce(g,g)^{ab} = e(g,g)^c, so we can be confident that ab=cab = c holds.

Bilinear Pairings

Next, let's examine bilinear pairings. The choice of pairing affects not only theoretical distinctions but also implementation efficiency and security models.

The notation we'll use:

  • G (Source Group): The source group. Elements are typically represented as points on an elliptic curve
  • GTG_T (Target Group): The target group
  • g: Generator of group G, meaning all elements of G can be created by repeated operations on g (e.g., g, g², g³, ...)
  • e: A function that takes two elements from group G and outputs one element in group GTG_T

Bilinear pairings are broadly classified into three types.

Type 1: Symmetric Pairing

e:G×GGTe: G × G → G_T (e is a function that takes two elements from G and outputs one element in G_T)

Both input values (P,Q)(P, Q) of the pairing function ee come from the same group G. That is, PGP \in G and QGQ \in G. This is sometimes expressed as G1=G2=GG_1 = G_2 = G.

Conceptually, the function e:G×GGTe: G × G → G_T must satisfy three properties:

Bilinearity

  • For arbitrary integers a,ba, b: e(Pa,Qb)=e(P,Q)abe(P^a, Q^b) = e(P, Q)^{ab} for all P,QGP, Q \in G
  • Specifically with generator gg: e(ga,gb)=e(g,g)abe(g^a, g^b) = e(g, g)^{ab}
  • This property enables verification of multiplication relationships between values in exponents.

Non-degeneracy

  • e(g,g)e(g, g) is not the identity element of GTG_T. That is, e(g,g)1e(g, g) \neq 1.
  • Ensures pairing results don't always produce meaningless values
  • Non-degeneracy guarantees that operation results aren't fixed to a meaningless 1, ensuring cryptographically significant values can be generated

Computability

  • For given P,QGP, Q \in G, we can compute e(P,Q)e(P, Q) in polynomial time.

Type 2: Asymmetric Pairing

Type 1 can have inferior performance (element size, operation speed) compared to asymmetric pairings. Type 2 addresses these limitations.

e:G1×G2GTe: G₁ × G₂ → G_T (where G1G2G₁ ≠ G₂). This function takes one element from group G₁ and one element from group G₂ as inputs.

Type 2's special feature is the existence of an isomorphism ψ:G2G1ψ: G₂ → G₁ (psi takes an element from group G2G₂ and maps it to the corresponding element in G₁). This means elements from G₂ can be easily converted to elements in G1G₁.

The notation we'll use:

  • G1,G2G₁, G₂ (source groups): Two different groups
  • GTG_T (target group): The group containing pairing results
  • ee (pairing function): e(P,Q)e(P, Q) where PG1,QG2P \in G_1, Q \in G_2
  • ψψ (isomorphism function)
    • ψ:G2G1ψ: G₂ → G₁
    • ψψ takes an element from G₂ and converts it to an element in G₁
    • ψψ preserves group structure: ψ(Q1Q2)=ψ(Q1)ψ(Q2)ψ(Q_1 * Q_2) = ψ(Q_1) * ψ(Q_2)

The existence of isomorphism ψψ is the most important distinction between Type 2 and Type 3.

The function e:G1×G2GTe: G_1 × G_2 → G_T still includes three properties, with the isomorphism affecting bilinearity:

Bilinearity

  • With g1g_1 as generator of G1G_1 and g2g_2 as generator of G2G_2: e(g1a,g2b)=e(g1,g2)abe(g_1^a, g_2^b) = e(g_1, g_2)^{ab}
  • Due to isomorphism ψψ, relationships like ψ(g2)=g1ψ(g_2) = g_1 (or a power of g1g_1) hold

Vulnerability Due to ψψ Property

The existence of ψψ can create vulnerabilities to specific attacks, limiting its use in certain security models. Consider the following attack scenario:

Attack Scenario: ψψ Attack

  • Assumption: The attacker knows ψψ

  • Goal: Break hash function HG2H_{G_2}. For example, given Q=HG2(m)Q = H_{G_2}(m), the attacker wants to find QQ's discrete log—i.e., find xx where Q=g2xQ = g_2^x

  • Scenario:

    1. First use a secure hash function HG1H_{G_1} that hashes to group G₁. The attacker computes P=HG1(m)P = H_{G_1}(m). P is an element of G₁.
    2. Attempt to find P's discrete log xx—i.e., find xx where P=g1xP = g_1^x. This is the discrete logarithm problem (DLP), which is very hard. But what if the attacker somehow learns this x? (e.g., if the protocol is designed to reveal x for certain messages)
    3. (Attack): The attacker now directly computes Q=g2xQ' = g_2^x. This QQ' is an element of G₂.
    4. Apply isomorphism ψψ to QQ' to compute ψ(Q)ψ(Q'). Since ψψ preserves group structure, ψ(Q)=ψ(g2x)=(ψ(g2))xψ(Q') = ψ(g_2^x) = (ψ(g_2))^x. If ψ(g2)=g1ψ(g_2) = g_1, then ψ(Q)=g1x=Pψ(Q') = g_1^x = P.
    5. The attacker can establish the relationship ψ(g2x)=HG1(m)ψ(g_2^x) = H_{G_1}(m). This means g2xg_2^x becomes a (preimage) by transferring the relationship of HG1(m)H_{G_1}(m) in G₁ to G₂, breaking the independence between the two groups.
  • G₁ and G₂ should originally be separate groups. What happens in G₁ shouldn't affect G₂, and vice versa

  • But due to ψ's existence, relationships in G₁ (e.g., P=g1xP = g_1^x) can be easily transferred to relationships in G₂ (e.g., ψ(g2x)=Pψ(g_2^x) = P)

  • This means the discrete logarithm problems in groups G₁ and G₂ are not independent, and information from one side can leak to the other

Type 3: Asymmetric Pairing

To address the ψψ vulnerability of Type 2, Type 3 is used. Like Type 2, the two input values come from different groups G₁ and G₂. However, no efficiently computable isomorphism exists between G₁ and G₂. That is, we can assume that converting an element from one group to an element in the other group is as hard as the discrete logarithm problem.

3. Cryptographic Assumptions

Before diving into the KZG polynomial commitment scheme, I'll discuss the assumptions used in the security proofs of the PolyCommit_DL and PolyCommit_Ped schemes.

Discrete Logarithm Assumption

Let me remind you of the DL assumption:

Pr[ADL(g,ga)=a]=ε(κ)\Pr[A_{DL}(g, g^a)=a] = \varepsilon(\kappa)

Given a generator gg of a cyclic group GG and a random element h=gxh = g^x (where xx is a secret exponent), the probability that an attacker using a probabilistic polynomial-time (PPT) algorithm can find xx is a negligible function ε(κ)\varepsilon(\kappa) that becomes arbitrarily small as the security parameter κ\kappa grows sufficiently large.

What is the significance of the DL assumption?

While computing gag^a given gg and aa (modular exponentiation) can be performed efficiently in polynomial time (e.g., using "repeated squaring" or "Montgomery ladder exponentiation"), computing aa in reverse given gg and gag^a (finding the discrete log) has no known efficient general algorithm that can solve it in polynomial time with current computing resources. This assumption of "computational difficulty" serves as the core foundation supporting the security of many public-key cryptosystems like the Diffie-Hellman key exchange protocol. The Hiding property of the PolyCommit_DL scheme can be proven based on the DL assumption.

t-Polynomial Diffie-Hellman (t-polyDH) Assumption

This is a cryptographic assumption stating that certain computational problems are difficult to solve efficiently in specific group settings. This assumption is a generalized form of the t-Diffie-Hellman Inversion (t-DHI) assumption, and is considered stronger than the t-DHI assumption, especially for large values of t.

To understand this, let me explain step by step how t-polyDH works. For each step, I'll explain using three aspects: "Given", "Problem to solve", and "Meaning".

Step 1: Generalization - t-Diffie-Hellman Inversion Problem (t-DHI)

This explains t-DHI, the immediate predecessor of t-polyDH.

  • Given: g,gα,gα2,...,gαtg, g^{\alpha}, g^{\alpha^2}, ..., g^{\alpha^t} (t powers of α)
  • Problem to solve: Compute g1/αg^{1/\alpha}
  • Meaning: Even knowing polynomial values up to degree tt of α\alpha in the exponent, computing the inverse (1/α)(1/\alpha) in the exponent remains difficult.

Therefore, t-DHI quantifies the "difficulty of inversion attacks" as a basic assumption that can support the binding security of pairing-based schemes like polynomial commitments.

Polynomial Commitment Binding: In PolyCommit_DL (KZG), when ensuring that an attacker cannot extract ϕ(α)\phi(\alpha) or α\alpha from a polynomial ϕ\phi's commitment value C=gϕ(α)C=g^{\phi(\alpha)} to arbitrarily modify CC, we can prove binding using the t-DHI hardness ("the fraction 1/α1/\alpha cannot be computed").

Step 2: Final - t-Polynomial Diffie-Hellman Problem (t-polyDH)

Looking at this assumption again, it extends the previous t-DHI problem to a more general polynomial form. In other words, t-polyDH is a hardened assumption that encompasses t-DHI.

  • Given: g,gα,gα2,...,gαtg, g^\alpha, g^{\alpha^2}, ..., g^{\alpha^t} (For a secret value α\alpha, this is equivalent to receiving evaluations of polynomials x,x2,...,xtx, x^2, ..., x^t in the exponent of gg)
  • Problem to solve: Find the following pair (φ(x),gφ(α))(φ(x), g^{φ(\alpha)})
    • φ(x)φ(x): A freely chosen new polynomial
    • Condition: The degree of φ(x)φ(x) must be greater than tt (restricted to t<deg(φ)<2κt < \deg(φ) < 2^\kappa)
    • gφ(α)g^{φ(\alpha)}: The value obtained by evaluating the chosen polynomial φ(x)φ(x) at the secret value α\alpha and placing it in the exponent of gg

The conclusion is that even if an attacker freely chooses a polynomial φ(x)φ(x) of degree higher than tt, it remains difficult to produce the correct computational result gφ(α)g^{φ(\alpha)}.

Role in KZG Polynomial Commitments

This assumption ensures the Strong Correctness property of KZG commitments—that the Committer cannot lie about the polynomial's degree.

Let's think about it:

  1. The system's public key (PKPK) is (g,gα,...,gαt)(g, g^\alpha, ..., g^{\alpha^t}). This system is designed to handle polynomials up to degree tt only.
  2. Assume an attacking Committer wants to commit to a polynomial φ(x)φ'(x) of degree higher than tt (e.g., degree t+1t+1).
  3. To compute the commitment, they need to calculate C=gφ(α)C = g^{φ'(\alpha)}.
  4. However, since φ(x)φ'(x) is a degree t+1t+1 polynomial, computing gφ(α)g^{φ'(\alpha)} using its coefficients requires the term gαt+1g^{\alpha^{t+1}}, which is not in the public key.
  5. Therefore, the attacker faces the difficulty of computing gφ(α)g^{φ'(\alpha)} using only the public key (g,gα,...,gαt)(g, g^\alpha, ..., g^{\alpha^t}).
CategoryDescriptionRole
t-polyDH ProblemComputing gφ(α)g^{φ(\alpha)} for any polynomial φφ of degree higher than tt using g,gα..gαtg, g^\alpha..g^{\alpha^t}(Cryptographic hard problem)
t-polyDH AssumptionThe belief that solving the t-polyDH problem is infeasible(KZG's security foundation)
Role in KZGBecause this assumption holds, the Committer cannot commit to polynomials of degree higher than the specified degree (tt)Strong Correctness (preventing degree fraud)

t-Strong Diffie-Hellman (t-SDH) Assumption

This assumption states that certain computational problems are difficult for efficient attackers to solve. This assumption is more hardened than the t-Diffie-Hellman Inversion (t-DHI) assumption and has the characteristic that it can have "exponentially many non-trivially different solutions."

Please read the explanation from the t-SDH assumption onward with a focus on the security hardening perspective.

As a stronger assumption used to guarantee the binding property of the PolyCommit_DL/KZG scheme, it can be defined as follows:

  • Select a cyclic group GG of order pp and generator gg according to security parameter κ\kappa
  • Choose a secret trapdoor value αZp\alpha \in \mathbb{Z}_p
  • Distribute public parameters (g,gα,gα2,,gαt)(g, g^\alpha, g^{\alpha^2}, \dots, g^{\alpha^t})

The assumption that the probability of an attacker finding both an arbitrary cZpc \in \mathbb{Z}_p and g1α+cg^{\frac{1}{\alpha+c}} pair simultaneously, given only the public (g,gα,,gαt)(g, g^\alpha, \dots, g^{\alpha^t}), is negligible.

That is, Pr[AtSDH(g,gα,,gαt)=c,g1/(α+c)]=ε(κ)\Pr[\mathcal{A}_{t-SDH}(g, g^\alpha, \dots, g^{\alpha^t}) = \langle c, g^{1/(\alpha+c)} \rangle] = \varepsilon(\kappa)

  • cc: An arbitrary value that the attacker can freely choose
  • g1/(α+c)g^{1/(\alpha+c)}: A group element with the inverse of "α+c\alpha+c" as the exponent

Why is it Harder than t-DHI?

  • t-DHI assumes the difficulty of only the case where "c=0", i.e., finding only g1/αg^{1/\alpha}
  • t-SDH prevents creating g1/(α+c)g^{1/(\alpha+c)} for all values of c, thus covering a broader range where the attacker can freely choose c.

To arbitrarily forge a commitment C=gϕ(α)C=g^{\phi(\alpha)} in PolyCommit_DL (KZG)?

An attacker would need to create a form like g1/(α+c)g^{1/(\alpha+c)} by choosing c=yc=-y with a polynomial like ϕ(x)y\phi(x)-y.

If the t-SDH assumption holds, all such forgery attempts become negligibly difficult.

Ultimately, t-SDH is the core security premise that ensures arbitrarily manipulating committed polynomial opening values (or evaluation proofs) cannot go undetected.

From the Attacker's Perspective

  • Input
    • The attacker receives a (t+1)-tuple g,gα,gα2,,gαtGt+1\langle g, g^\alpha, g^{\alpha^2}, \ldots, g^{\alpha^t} \rangle \in G^{t+1} for a randomly selected αZp\alpha \in \mathbb{Z}^*_p. Here, gg is the generator of group GG.
  • Attacker's Goal
    • Based on this input, the attacker must output a pair c,g1/(α+c)\langle c, g^{1/(\alpha+c)} \rangle for an arbitrary value cZp{α}c \in \mathbb{Z}_p \setminus \{-\alpha\}. That is, they must find a specific form of inverse value without knowing α\alpha.
  • Success Probability
    • The probability that the attacker (AtSDH\mathcal{A}_{t-SDH}) solves this problem must be negligibly small (ε(κ)\varepsilon(\kappa)), where ε(κ)\varepsilon(\kappa) denotes a negligible function with respect to the security parameter κ\kappa.

What if the attacker chooses c=0?

If the attacker chooses c=0, the problem to solve becomes t-DHI itself. If t-SDH holds, then the t-DHI hardness is naturally satisfied as well.

t-Bilinear Strong Diffie-Hellman (t-BSDH) Assumption

This security assumption can be viewed as the bilinear pairing version of the previously explained t-SDH assumption. I'll explain this assumption through comparison with t-SDH.

t-SDHt-BSDH
Giveng,gα,...,gαtg, g^\alpha, ..., g^{\alpha^t}g,gα,...,gαtg, g^\alpha, ..., g^{\alpha^t} (Same)
Problem to SolveFind pair (c,g1/(α+c))(c, g^{1/(\alpha+c)})Find pair (c,e(g,g)1/(α+c))(c, e(g, g)^{1/(\alpha+c)})
DifferenceResult is in group GResult is in group G_T (power of e(g,g)e(g,g))
Note"Inverse computation problem in exponent""Inverse computation problem in paired exponent"

As you can see, only the result the attacker must produce has changed from a power of gg to a power of e(g,g)e(g, g)—the fundamental structure of the problem remains the same.

In t-BSDH, one must find the following pair (c,z)(c, z):

  • cc: A chosen number (where cαc \neq -\alpha)
  • zz: A value satisfying z=e(g,g)1/(α+c)z = e(g, g)^{1/(\alpha+c)} (This value zz is an element of group G_T)

"Given g,gα,...,gαtg, g^\alpha, ..., g^{\alpha^t}, no attacker can efficiently compute a valid pair of the form (c,e(g,g)1/(α+c))(c, e(g, g)^{1/(\alpha+c)}) (the probability is negligibly small)."

This essentially assumes that if the t-SDH problem is hard, then finding the paired value of that result would also be hard.

Role in KZG Polynomial Commitments

The t-BSDH assumption guarantees the Binding property of Batch Opening in KZG commitments.

Batch Opening: An efficient method to bundle proofs for evaluations at multiple points (i1,y1),(i2,y2),(i_1, y_1), (i_2, y_2), \dots into a single witness and verify them all at once.

Potential Attack Scenario

  1. The Committer publishes the commitment CC.
  2. Subsequently, the Committer claims through Batch Opening that "the polynomial values at the set of points BB match r(x)r(x)."
  3. If a malicious Committer attempts to deceive in this Batch Opening, it becomes a more complex attack than forging a single-value proof.
  4. The Batch Opening verification equation involves multiple pairing terms, resulting in a more intricate form.
  5. Successfully breaching this complex verification equation mathematically implies that the attacker can solve the t-BSDH problem.

Because the t-BSDH assumption holds—that is, solving the t-SDH problem in the pairing space is difficult—the attacker cannot deceive in Batch Opening. Therefore, even when opening multiple values at once, the contents remain bound.

In conclusion, t-SDH and t-BSDH can be understood as nearly identical assumptions. The key differences are as follows:

  • t-SDH → Security for single opening
  • t-BSDH → Security for batch opening

4. Polynomial Commitment Scheme

In this section, we'll explore how the six algorithms—Setup, Commit, CreateWitness, VerifyEval, and others—form the complete KZG system.

Building Blocks

The Committer generates a short commitment CC for their chosen secret polynomial ϕ(x)\phi(x) and publishes it. Later, they must prove to the Verifier that a specific evaluation y=ϕ(i)y = \phi(i) at point ii is correct using a witness ww, without revealing the secret polynomial ϕ(x)\phi(x) itself.

In polynomial commitments, the Committer and Prover can be considered the same entity.

Committer

  • Selects their secret polynomial ϕ(x)\phi(x).
  • Uses the Commit algorithm to convert it into CC and publishes it.
  • "I've set a certain polynomial inside this CC, and I won't change my story later"—this is the commitment part.

Prover

  • When the Verifier requests the evaluation at a specific point ii,
  • Computes ϕ(i)\phi(i) and generates witness wiw_i using the CreateWitness algorithm to prove its correctness.
  • Sends the tuple (i,ϕ(i),wi)(i, \phi(i), w_i) to the Verifier to prove it.

To achieve these goals, the polynomial commitment scheme consists of the following six algorithms.

Before explaining these six algorithms, I'll structure the discussion around the points of "Purpose," "Input," and "Output" for each.

1. Setup(1κ,t)Setup(1^\kappa, t)

  • Purpose: Sets up the public environment needed to use the commitment scheme; this is executed only once for the entire system.
  • Input:
    • 1κ1^\kappa: The security parameter (κ-bit), where a larger number increases the system's security level.
      • Takes the security parameter κ and the maximum polynomial degree tt as input → This generates the Structured Reference String (SRS).
    • tt: The maximum degree of polynomials the system can handle.
  • Output → PK,SK\langle PK, SK \rangle pair
    • Public Key (PK): Publicly available information needed for creating and verifying commitments ("Public Parameters") (e.g., g,gα,,gαtg, g^\alpha, \dots, g^{\alpha^t}).
    • Secret Key (SK): A secret value used only during the Setup phase (e.g., α\alpha). After Setup, this secret key is no longer needed in the scheme, so it can be discarded—this is known as a "trusted setup."
      • If the publicly agreed-upon values from the trusted setup are not discarded, it can lead to security issues, often referred to as "cryptographic toxic waste."

2. Commit(PK,ϕ(x))Commit(PK, \phi(x))

  • Purpose: The Committer generates a commitment CC for their polynomial ϕ(x)\phi(x).
  • Input:
    • PKPK: The public key generated from Setup.
    • ϕ(x)\phi(x): The polynomial to commit to (degree at most tt).
  • Output:
    • CC: The commitment to the polynomial (e.g., gϕ(α)g^{\phi(\alpha)} → a single group element).
    • dd: Additional information needed for commitment opening (not used in the basic configuration).

3. Open(PK,C,ϕ(x),d)Open(PK, C, \phi(x), d)

  • Input:
    • Public key PKPK, commitment CC, polynomial ϕ(x)\phi(x), and related decryption information dd.
  • Output:
    • The committed polynomial ϕ(x)\phi(x) → Can be implemented as a public coin protocol between the Prover (PPC) and Verifier (VPC).

4. VerifyPoly(PK,C,ϕ(x),d)VerifyPoly(PK, C, \phi(x), d)

  • Purpose: The Committer proves that commitment CC corresponds to the entire polynomial ϕ(x)\phi(x), and the Verifier confirms this. This is a stronger form of opening than revealing only specific values.
  • Input:
    • Verifies whether CC is a commitment to ϕ(x)\phi(x) along with dd.
  • Output:
    • VerifyPoly returns 1 (success) or 0 (failure) as the verification result.

5. CreateWitness(PK,ϕ(x),i,d)CreateWitness(PK, \phi(x), i, d)

  • Purpose: Generates a 'witness' to reveal and prove only the evaluation ϕ(i)\phi(i) at a specific point ii, without revealing the entire polynomial.
  • Input:
    • PKPK: Public key.
    • ϕ(x)\phi(x): The original polynomial (known only to the Committer).
    • ii: The point to evaluate (x-coordinate).
  • Output:
    • (i,ϕ(i),wi)(i, \phi(i), w_i): The tuple to reveal.
      • ii: Evaluation point.
      • ϕ(i)\phi(i): Evaluation value at ii (y-coordinate).
      • wiw_i: The witness proving that ϕ(i)\phi(i) is the correct evaluation value.

6. VerifyEval(PK,C,i,y,wi)VerifyEval(PK, C, i, y, w_i)

  • Purpose: The Verifier checks whether the evaluation value yy presented by the Committer is indeed the i-th evaluation (ϕ(i)\phi(i)) of the polynomial corresponding to commitment CC. The Verifier does this without knowing ϕ(x)\phi(x), using only CC and public information.
  • Input:
    • PKPK: Public key.
    • CC: The previously published commitment.
    • i,y,wii, y, w_i: The (evaluation point, evaluation value, witness) presented by the Committer.
  • Output: 1 (success) or 0 (failure).

Security Requirements

For the above algorithms to operate securely, they must satisfy the following three properties.

  1. Correctness
    1. Honest users following the protocol must always succeed.
    2. If the Committer honestly generates CC and wiw_i, the Verifier must always return 1 (success) when executing VerifyPoly and VerifyEval. This is the most fundamental requirement of the system.
  2. Binding
    1. Once committed, one cannot change their story later.
    2. This property prevents malicious Committers from cheating and is divided into two levels.
      • Polynomial Binding → Keeping protection
        • A malicious Committer cannot create a single commitment CC and later claim "This CC is for ϕ(x)\phi(x)" while also successfully claiming "Actually, it's for a different polynomial ϕ(x)\phi'(x)." In other words, CC must be fixed to one polynomial.
      • Evaluation Binding
        • This is more practically important: A malicious Committer cannot, for a single commitment CC and specific point ii, claim "The evaluation is yy" with a valid witness ww while also claiming "The evaluation is a different yy'" with a valid witness ww'. That is, the evaluation value for the pair (C,i)(C, i) must be unique.
  3. Hiding
    • One cannot learn the original secret information just by looking at the commitment.
    • Even if a malicious Verifier sees the commitment CC, they must not be able to extract any information about the original polynomial ϕ(x)\phi(x).
    • More specifically, even if fewer than the polynomial's degree (t) evaluation values (i,ϕ(i))(i, \phi(i)) are revealed, it must be impossible to guess the evaluation ϕ(j)\phi(j) at an unrevealed point jj.
      • Computational Hiding: Attackers with limited computational power cannot extract the information.
      • Unconditional Hiding: Even attackers with unlimited computational power cannot extract the information (similar to Pedersen commitments).

Practical Implementation: Ethereum KZG Ceremony

Etheruem KZG Ceremony
Etheruem KZG Ceremony

The trusted setup described in the Setup algorithm, where the secret α\alpha must be securely discarded to prevent cryptographic vulnerabilities, is critical for KZG commitments. In practice, generating the Structured Reference String (SRS) without relying on a single trusted party is achieved through multi-party computation (MPC). A prominent example is Ethereum KZG Ceremony (2023), which supported the Dencun upgrade (EIP-4844) for scalable data availability in Layer 2 rollups. Over 140,000 participants globally contributed randomness via a public protocol (https://ceremony.ethereum.org/), ensuring α\alpha remains unknown as long as at least one contributor deletes their secret. This decentralized approach eliminates the "trusted authority" risk, aligning with the security requirements of PolyCommit_DL and enabling efficient, secure polynomial commitments in blockchain applications.

5. PolyCommit_DL Design Rationale

In this section, we'll explore how the abstract requirements of the polynomial commitment scheme defined earlier are implemented using concrete mathematical methods. I've implemented a Proof of Concept (POC) for this scheme and analyzed its operational process, which I'll explain here.

Concept

For any polynomial ϕ(x)\phi(x) and arbitrary constant ii, xix - i always divides the new polynomial ϕ(x)ϕ(i)\phi(x) - \phi(i) exactly.

(By the factor theorem for polynomials, when x=ix = i, the value of ϕ(x)ϕ(i)\phi(x) - \phi(i) is ϕ(i)ϕ(i)=0\phi(i) - \phi(i) = 0, so (xi)(x - i) must be a factor.)

Therefore, the quotient polynomial ψi(x)=(ϕ(x)ϕ(i))/(xi)\psi_i(x) = (\phi(x) - \phi(i)) / (x - i) always exists.

PolyCommit_DL implements this property over groups where bilinear pairings are possible. That is, it is based on the algebraic attribute that (xi)(x - i) perfectly divides ϕ(x)ϕ(i)\phi(x) - \phi(i) for the polynomial ϕ(x)\phi(x).

1. Setup(1κ,t)Setup(1^\kappa, t)

  1. Select groups GG and GTG_T where a bilinear pairing e:G×GGTe: G \times G \to G_T is defined (pp is the prime order of the group).
  2. Choose a generator gg of GG.
  3. A Trusted Authority randomly selects a secret value αZp\alpha \in \mathbb{Z}_p (alpha), and this α\alpha must remain unknown to everyone.
    • Computations and Outputs:
      • SKSK (Secret Key): α\alpha (must be discarded immediately after generation).
      • PKPK (Public Key): (G,g,gα,gα2,,gαt)(G, g, g^\alpha, g^{\alpha^2}, \dots, g^{\alpha^t}).
        • This public key is a tuple of group elements where powers of α\alpha are placed in the exponent of gg.
        • α\alpha cannot be recovered from these values alone (due to the hardness of the discrete logarithm problem).
        • This public key is shared by all participants in the system and constitutes a "trusted setup."

POC Implementation Notes

  • For the initial environment, using a primitive root as the generator is preferable, but for this POC, we assume a value of 2.
    • Implements polynomial division over finite fields.
    • Uses modular arithmetic instead of actual elliptic curves.
  • Setup(1κ,t1^\kappa, t) → (PK,SK\mathit{PK}, \mathit{SK}):
    • Trusted setup: Computes powers of α\alpha and discards α\alpha.
      • Args:
        • security_param: Security parameter κ\kappa.
        • max_degree: Maximum supported polynomial degree tt.
      • Returns:
        • PK: Public key [g,gα,gα2,,gαtg, g^\alpha, g^{\alpha^2}, \dots, g^{\alpha^t}].
        • SK: Secret key α\alpha (returned for simulation purposes; in practice, discarded immediately).
    • Randomly selects secret value α\alpha (avoiding 0 and 1).
    • Generates public key: [g,gα,gα2,,gαtg, g^\alpha, g^{\alpha^2}, \dots, g^{\alpha^t}].
      • Exponents are computed modulo (p1)(p-1) using Fermat's Little Theorem.
  def __init__(self, prime: int = 2**61 - 1):
      self.p = prime
      self.g = 2
      print(f"p = {self.p}")
      print(f"g = {self.g}")
 
  def mod_inverse(self, n: int) -> int:
      return pow(n, -1, self.p)
 
  def Setup(self, security_param: int, max_degree: int) -> Tuple[List[int], int]:
      print(f"\n[Setup] max degree t = {max_degree}")
      alpha = random.randint(2, self.p - 2)
      print(f"secret vlaue α = {alpha}")
      PK = []
      for i in range(max_degree + 1):
          alpha_i = pow(alpha, i, self.p - 1)
          g_alpha_i = pow(self.g, alpha_i, self.p)
          PK.append(g_alpha_i)
      
      print(f"generated Public Key: {len(PK)}")
      return PK, alpha

2. Commit(PK,ϕ(x))Commit(PK, \phi(x))

  • Input: Public key PKPK, polynomial to commit ϕ(x)=ϕ0+ϕ1x++ϕtxt\phi(x) = \phi_0 + \phi_1 x + \dots + \phi_t x^t.
  • Computation:
    • The Committer needs to evaluate ϕ(x)\phi(x) at the secret value α\alpha to get ϕ(α)\phi(\alpha), but since they don't know α\alpha, direct computation is impossible.
    • Instead, use the public key PKPK to compute gϕ(α)g^{\phi(\alpha)}.
      • gϕ(α)=gϕ0+ϕ1α++ϕtαtg^{\phi(\alpha)} = g^{\phi_0 + \phi_1 \alpha + \dots + \phi_t \alpha^t}
      • =gϕ0gϕ1αgϕtαt= g^{\phi_0} \cdot g^{\phi_1 \alpha} \cdot \dots \cdot g^{\phi_t \alpha^t}
      • =(g)ϕ0(gα)ϕ1(gαt)ϕt= (g)^{\phi_0} \cdot (g^\alpha)^{\phi_1} \cdot \dots \cdot (g^{\alpha^t})^{\phi_t}
    • Since g,gα,,gαtg, g^\alpha, \dots, g^{\alpha^t} are all publicly available in PKPK, the Committer can take these values, raise them to the powers of their coefficients ϕ0,,ϕt\phi_0, \dots, \phi_t, and multiply them together to obtain gϕ(α)g^{\phi(\alpha)}.
  • Output:
    • Commitment C=gϕ(α)C = g^{\phi(\alpha)}.
    • No matter how large the polynomial degree tt is, the commitment CC is a single element of group GG. This achieves the "constant-size commitment."

POC Implementation Notes Commit(PK,ϕ(x)PK, \phi(x)) → CC

  • Commits to the polynomial ϕ(x)=ϕ0+ϕ1x++ϕtxt\phi(x) = \phi_0 + \phi_1 x + \dots + \phi_t x^t.
  • Args:
    • PK: Public key.
    • coeffs: Polynomial coefficients [ϕ0,ϕ1,,ϕt][\phi_0, \phi_1, \dots, \phi_t] (all less than pp).
  • Returns:
    • C: Commitment gϕ(α)g^{\phi(\alpha)}.
  • Initialize C=1, then implement C=gϕ(α)=(gαi)ϕi(modp)C = g^{\phi(\alpha)} = \prod (g^{\alpha^i})^{\phi_i} \pmod{p}.
def Commit(self, PK: List[int], coeffs: List[int]) -> int:
    degree = len(coeffs) - 1
    print(f"\n[Commit] poly degree: {degree}")
    C = 1
    for i, coeff in enumerate(coeffs):
        if i >= len(PK):
            raise ValueError("exceed")
        term = pow(PK[i], coeff, self.p)
        C = (C * term) % self.p
    print(f"Commitment C = {C}")
    return C

3. CreateWitness(PK,ϕ(x),i)CreateWitness(PK, \phi(x), i)

  • Purpose: The process of creating evidence that the evaluation y=ϕ(i)y = \phi(i) at point ii is correct.
  • Computation:
    1. The Committer first computes the quotient polynomial ψi(x)=(ϕ(x)ϕ(i))/(xi)\psi_i(x) = (\phi(x) - \phi(i)) / (x - i). Since ϕ(x)\phi(x) is represented by its coefficients, this computation can be easily performed through polynomial division.
    2. Using the exact same method as in Commit, compute wi=gψi(α)w_i = g^{\psi_i(\alpha)} for this new quotient polynomial ψi(x)\psi_i(x).
  • Output: (i,ϕ(i),wi)(i, \phi(i), w_i)
    • wiw_i is the "witness," and it too is a single element of group GG.

POC Implementation Notes: CreateWitness(PK, \phi(x), i) → (i, \phi(i), w_i)

  • Args:
    • PK: Public key.
    • coeffs: Polynomial coefficients.
    • i: Evaluation point.
  • Returns: (i, y, w_i): Evaluation point, evaluation value, witness.
  1. Compute ϕ(i)\phi(i) (polynomial evaluation over finite fields). 2. self._evaluate_poly(coeffs, i)
  2. Compute quotient polynomial ψi(x)=(ϕ(x)ϕ(i))/(xi)\psi_i(x) = (\phi(x) - \phi(i)) / (x - i), with dividend: ϕ(x)y\phi(x) - y.
phi_minus_y = list(coeffs)
phi_minus_y[0] = (phi_minus_y[0] - y + self.p) % self.p
  1. Compute divisor (xi)(x - i) as coefficients [i,1][-i, 1]:
  • x_minus_i = [(-i + self.p) % self.p, 1] to handle modular arithmetic.
  1. Compute witness wi=gψi(α)w_i = g^{\psi_i(\alpha)}:
  • w_i = self.Commit(PK, psi_coeffs) using the Commit algorithm with the coefficients of ψi(x)\psi_i(x).
def polynomial_division_field(self, dividend: List[int], divisor: List[int]) -> Tuple[List[int], List[int]]:
    rem = list(dividend)
    deg_rem = len(rem) - 1
    deg_div = len(divisor) - 1
 
    if deg_div < 0:
        raise ValueError("not zero.")
    
    quot = [0] * (deg_rem - deg_div + 1)
    lead_div_inv = self.mod_inverse(divisor[-1])
 
    for i in range(deg_rem - deg_div, -1, -1):
        if len(rem) - 1 < i + deg_div:
            continue
        
        coeff = (rem[i + deg_div] * lead_div_inv) % self.p
        quot[i] = coeff
        
        for j in range(deg_div + 1):
            rem[i + j] = (rem[i + j] - coeff * divisor[j]) % self.p
    while len(rem) > 1 and rem[-1] == 0:
        rem.pop()
    
    return quot, rem
 
def _evaluate_poly(self, coeffs: List[int], x: int) -> int:
    y = 0
    for i, coeff in enumerate(coeffs):
        y = (y + coeff * pow(x, i, self.p)) % self.p
    return y
 
def CreateWitness(self, PK: List[int], coeffs: List[int], i: int) -> Tuple[int, int, int]:
    print(f"\n[CreateWitness] evaluation point i = {i}")
 
    y = self._evaluate_poly(coeffs, i)
    print(f"φ({i}) = {y} (mod {self.p})")
 
    phi_minus_y = list(coeffs)
    phi_minus_y[0] = (phi_minus_y[0] - y + self.p) % self.p
 
    x_minus_i = [(-i + self.p) % self.p, 1]
    
    psi_coeffs, remainder = self.polynomial_division_field(phi_minus_y, x_minus_i)
 
    if not (len(remainder) == 1 and remainder[0] == 0):
         print(f"remainder is no zero : {remainder}")
    
    print(f"ψ_i(x) coeffs: {len(psi_coeffs)-1}")
 
    w_i = self.Commit(PK, psi_coeffs)
    
    print(f"Witness w_i = {w_i}")
    return i, y, w_i

4. VerifyEval(PK,C,i,y,wi)VerifyEval(PK, C, i, y, w_i)

  • Purpose: The Verifier uses the (i,y,wi)(i, y, w_i) received from the Committer along with the previously received commitment CC to confirm whether y=ϕ(i)y = \phi(i) truly holds. The Verifier does not know ϕ(x)\phi(x) itself.
  • Verification Logic:
    • The Verifier checks whether the following equation holds:

      e(C,g)=e(wi,gα/gi)e(g,g)ye(C, g) = e(w_i, g^\alpha / g^i) \cdot e(g, g)^y

  • Why Does This Equation Hold?
    1. The core idea is that evaluating ϕ(x)=ψi(x)(xi)+ϕ(i)\phi(x) = \psi_i(x) \cdot (x - i) + \phi(i) at α\alpha gives ϕ(α)=ψi(α)(αi)+ϕ(i)\phi(\alpha) = \psi_i(\alpha) \cdot (\alpha - i) + \phi(i).
    2. Raising this equation to the exponent of gg yields gϕ(α)=gψi(α)(αi)+ϕ(i)g^{\phi(\alpha)} = g^{\psi_i(\alpha) \cdot (\alpha - i) + \phi(i)}.
    3. Since C=gϕ(α)C = g^{\phi(\alpha)} and wi=gψi(α)w_i = g^{\psi_i(\alpha)}, this resembles C=wiαigyC = w_i^{\alpha - i} \cdot g^y (by exponent rules).

    We cannot verify this relationship directly, so we apply the bilinear map ee to both sides to transform it into a verifiable form. Left Side: e(C,g)=e(gϕ(α),g)=e(g,g)ϕ(α)e(C, g) = e(g^{\phi(\alpha)}, g) = e(g, g)^{\phi(\alpha)} Right Side: e(wi,gα/gi)e(g,g)ye(w_i, g^\alpha / g^i) \cdot e(g, g)^y - =e(gψi(α),gαi)e(g,g)y= e(g^{\psi_i(\alpha)}, g^{\alpha - i}) \cdot e(g, g)^y - =e(g,g)ψi(α)(αi)e(g,g)y= e(g, g)^{\psi_i(\alpha) \cdot (\alpha - i)} \cdot e(g, g)^y - =e(g,g)ψi(α)(αi)+y= e(g, g)^{\psi_i(\alpha) \cdot (\alpha - i) + y} (assuming y=ϕ(i)y = \phi(i) is correct) - =e(g,g)ψi(α)(αi)+ϕ(i)= e(g, g)^{\psi_i(\alpha) \cdot (\alpha - i) + \phi(i)} - =e(g,g)ϕ(α)= e(g, g)^{\phi(\alpha)} (by the core idea)

In conclusion, left side = right side holds. If the Committer fabricates the yy value or creates an incorrect wiw_i, this equation will fail to hold with very high probability.

POC Implementation Notes

  • For VerifyEval testing, we verify the equation directly at the exponent level instead of using pairings. This function aims to recover the secret value α\alpha for verification purposes.
  • Verification equation: e(C,g)=e(wi,gα/gi)e(g,g)ye(C, g) = e(w_i, g^\alpha / g^i) \cdot e(g, g)^y
  • Simplified → gϕ(α)==(gψi(α))(αi)gyg^{\phi(\alpha)} == (g^{\psi_i(\alpha)})^{(\alpha - i)} \cdot g^y

Final Implementation Check

  • Polynomial: ϕ(x)=3x2+2x+1\phi(x) = 3x^2 + 2x + 1
  • Secret Value: α=481184019\alpha = 481184019
  • Evaluation Point: i=4i = 4
  1. Commitment CC:
    • C=gϕ(α)=2(3α2+2α+1)(modp)C = g^{\phi(\alpha)} = 2^{(3\alpha^2 + 2\alpha + 1)} \pmod{p}
    • C=348765865C = 348765865
  2. Evaluation y=ϕ(4)y = \phi(4):
    • y=342+24+1=316+8+1=48+8+1=57y = 3 \cdot 4^2 + 2 \cdot 4 + 1 = 3 \cdot 16 + 8 + 1 = 48 + 8 + 1 = 57
    • ϕ(4)=57\phi(4) = 57
  3. Quotient Polynomial ψ(x)\psi(x):
    • ψ(x)=(ϕ(x)ϕ(4))/(x4)\psi(x) = (\phi(x) - \phi(4)) / (x - 4)
    • =(3x2+2x+157)/(x4)= (3x^2 + 2x + 1 - 57) / (x - 4)
    • =(3x2+2x56)/(x4)= (3x^2 + 2x - 56) / (x - 4)
    • =(3x+14)(x4)/(x4)=3x+14= (3x + 14)(x - 4) / (x - 4) = 3x + 14
    • The quotient polynomial ψi(x)\psi_i(x) is of degree 1, confirming the output check.
  4. Witness wiw_i:
    • wi=gψ(α)=2(3α+14)(modp)w_i = g^{\psi(\alpha)} = 2^{(3\alpha + 14)} \pmod{p}
    • Re-calling the Commit function yields wi=559735160w_i = 559735160, matching this result.
  5. Verification:
    • LHS (Left Side): C=348765865C = 348765865
    • RHS (Right Side): (wi)(αi)gy=(559735160)(α4)257(modp)(w_i)^{(\alpha - i)} \cdot g^y = (559735160)^{(\alpha - 4)} \cdot 2^{57} \pmod{p}
    • The output shows LHS and RHS values exactly match at 348765865.
    • Checked based on the equation gϕ(α)==g(ψ(α)(αi)+y)g^{\phi(\alpha)} == g^{(\psi(\alpha) \cdot (\alpha - i) + y)}.

Attack Scenario Check

  • Assume the commitment CC and witness wiw_i are generated honestly.
  • However, the Committer sends a fabricated y=58y = 58 instead of 57 to the Verifier. Verification:
    • LHS (Left Side): C=348765865C = 348765865 (unchanged).
    • RHS (Right Side): (wi)(αi)g(fake_y)=(559735160)(α4)258(modp)(w_i)^{(\alpha - i)} \cdot g^{(\textit{fake\_y})} = (559735160)^{(\alpha - 4)} \cdot 2^{58} \pmod{p}.
    • Since yy changed from 57 to 58, the gyg^y term in the right side shifts from g57g^{57} to g58g^{58}, effectively multiplying the original right side by an extra g(=2)g(=2).
      • 697531730=3487658652(mod1000000007)697531730 = 348765865 \cdot 2 \pmod{1000000007} → This relation holds.
    • As a result, LHS and RHS values differ, and the verification output is: failure. This confirms that the scheme's Binding property is functioning correctly.

In Summary

Since both the commitment and witness are constant size (O(1)), communication efficiency is very high. From a security perspective, not being able to recover ϕ(x)\phi(x) from just C=gϕ(α)C = g^{\phi(\alpha)} relies on the hardness of the discrete logarithm (DL) problem (specifically, when fewer than tt points are revealed). The inability of the Committer to use fakes relies on the hardness of the t-SDH assumption. In other words, creating two different valid evaluations (y,w)(y, w) and (y,w)(y', w') for a single CC is as difficult as solving the t-SDH problem.

The PolyCommit_DL construction is the most basic form of the KZG (or Kate) commitment used in modern zero-knowledge proof systems.

6. PolyCommit_Ped Design Rationale

As the name suggests, "Ped" indicates that this scheme draws inspiration from the Pedersen Commitment. While PolyCommit_DL provides computational hiding, PolyCommit_Ped goes a step further by offering unconditional hiding as its most prominent feature.

Why Is It Stronger...?

A commitment of the form C=gϕ(α)C = g^{\phi(\alpha)} makes it hard to compute ϕ(α)\phi(\alpha) from the pair (g,C)(g, C) alone (due to the discrete logarithm problem), but theoretically, it is fixed to a unique value ϕ(α)\phi(\alpha). The assumption is that an attacker with unlimited computational power could find this value. In contrast, the form C=gmhrC = g^m \cdot h^r uses both a secret value mm and a random value rr. Even given g,h,Cg, h, C, there are infinitely many possible (m,r)(m, r) pairs, so mm cannot be pinpointed—even by an attacker with unlimited computational power. This is unconditional hiding.

PolyCommit_Ped can be seen as applying this idea to polynomial commitments.

  1. In addition to the original polynomial ϕ(x)\phi(x) to commit to, it uses another completely randomly selected polynomial ψ(x)\psi(x).
  2. Two different generators gg and hh are used to weave these two polynomials into a single commitment.
  • Unconditional Hiding: It uses the same algebraic properties as PolyCommit_DL but achieves unconditional hiding by leveraging an additional random polynomial ϕ^(x)\hat{\phi}(x).
  • Homomorphic Utilization: Combines commitments to ϕ(x)\phi(x) and ϕ^(x)\hat{\phi}(x) by exploiting the homomorphic properties of PolyCommit_DL.
  • Commit: Computed as C=gϕ(α)hϕ^(α)C = g^{\phi(\alpha)} h^{\hat{\phi}(\alpha)}.
    • Uses PK=G,g,gα,,gαt,h,hα,,hαtPK = \langle G, g, g^\alpha, \dots, g^{\alpha^t}, h, h^\alpha, \dots, h^{\alpha^t} \rangle.
  • CreateWitness: Computes ψi(x)\psi_i(x) and ψ^i(x)\hat{\psi}_i(x) respectively, and outputs wi=gψi(α)hψ^i(α)w_i = g^{\psi_i(\alpha)} h^{\hat{\psi}_i(\alpha)} as the witness.
  • VerifyEval: Verifies via e(C,g)=?e(wi,gα/gi)e(gϕ(i)hϕ^(i),g)e(C, g) \stackrel{?}{=} e(w_i, g^\alpha / g^i) \cdot e(g^{\phi(i)} h^{\hat{\phi}(i)}, g).
  • Security: Secure under the t-SDH assumption, with unconditional hiding.

Algorithm-Specific Implementation

1. Setup(1κ,t)Setup(1^\kappa, t)

  1. Select bilinear map groups G,GTG, G_T as in PolyCommit_DL.
  2. In addition to generator gg, select another generator hh. The discrete logarithm relationship between gg and hh must remain unknown to everyone (i.e., if h=gxh = g^x, no one should know xx).
  3. A trusted authority randomly selects a secret value αZp\alpha \in \mathbb{Z}_p.
  • Computations and Outputs:
    • SKSK (Secret Key): α\alpha.
    • PKPK (Public Key): (G,g,gα,,gαt,h,hα,,hαt)(G, g, g^\alpha, \dots, g^{\alpha^t}, h, h^\alpha, \dots, h^{\alpha^t}).
      • Includes two sets: the tuple of α\alpha powers for gg and the tuple of α\alpha powers for hh.

2. Commit(PK,ϕ(x))Commit(PK, \phi(x))

  • Input: Public key PKPK, polynomial to commit ϕ(x)\phi(x).
  • Computation:
    1. The Committer secretly generates a random polynomial ψ(x)\psi(x) of degree tt. The coefficients of ψ(x)\psi(x) are chosen completely at random; this ψ(x)\psi(x) plays a role similar to the random value rr in Pedersen commitments.
    2. Commit to ϕ(x)\phi(x) using gg and to ψ(x)\psi(x) using hh, then multiply the results.
    • gϕ(α)g^{\phi(\alpha)} is computed using the gg set in PKPK.
    • hψ(α)h^{\psi(\alpha)} is computed using the hh set in PKPK.
  • Output:
    • Commitment C=gϕ(α)hψ(α)C = g^{\phi(\alpha)} \cdot h^{\psi(\alpha)}.
    • dd (decommitment information): Needed later for opening the commitment; here, the random polynomial ψ(x)\psi(x) itself serves as dd.

3. CreateWitness(PK,ϕ(x),ψ(x),i)CreateWitness(PK, \phi(x), \psi(x), i)

  • Purpose: The process of creating a witness for the evaluation y=ϕ(i)y = \phi(i) at ii.
  • Computation:
    1. The Committer computes the quotient polynomial ϕq(x)=(ϕ(x)ϕ(i))/(xi)\phi_q(x) = (\phi(x) - \phi(i)) / (x - i) for ϕ(x)\phi(x).
    2. Simultaneously, for the random polynomial ψ(x)\psi(x), compute the evaluation y=ψ(i)y' = \psi(i) at ii and the quotient polynomial ψq(x)=(ψ(x)ψ(i))/(xi)\psi_q(x) = (\psi(x) - \psi(i)) / (x - i).
    3. Combine ϕq(x)\phi_q(x) and ψq(x)\psi_q(x) into a single witness using gg and hh.
    • wi=gϕq(α)hψq(α)w_i = g^{\phi_q(\alpha)} \cdot h^{\psi_q(\alpha)}.
  • Output: (i,ϕ(i),ψ(i),wi)(i, \phi(i), \psi(i), w_i)
    • Here, not only ϕ(i)\phi(i) but also the evaluation of the random polynomial ψ(i)\psi(i) must be revealed.

4. VerifyEval(PK,C,i,y,y,wi)VerifyEval(PK, C, i, y, y', w_i)

  • Purpose: The process for the Verifier to confirm that y=ϕ(i)y = \phi(i) and y=ψ(i)y' = \psi(i).
  • Verification Logic:
    • The Verifier checks whether the following equation holds:

      e(C,g)=e(wi,gα/gi)e(gyhy,g)e(C, g) = e(w_i, g^\alpha / g^i) \cdot e(g^y \cdot h^{y'}, g)

  • Why Does This Equation Hold?
    1. C=gϕ(α)hψ(α)C = g^{\phi(\alpha)} \cdot h^{\psi(\alpha)}.
    2. ϕ(α)=ϕq(α)(αi)+ϕ(i)\phi(\alpha) = \phi_q(\alpha)(\alpha - i) + \phi(i).
    3. ψ(α)=ψq(α)(αi)+ψ(i)\psi(\alpha) = \psi_q(\alpha)(\alpha - i) + \psi(i).
    4. Substituting these relations into CC and simplifying shows that the left and right sides of the verification equation match.
    • Left Side: e(C,g)=e(gϕ(α)hψ(α),g)=e(g,g)ϕ(α)e(h,g)ψ(α)e(C, g) = e(g^{\phi(\alpha)} \cdot h^{\psi(\alpha)}, g) = e(g, g)^{\phi(\alpha)} \cdot e(h, g)^{\psi(\alpha)}.
    • Right Side: e(wi,gαi)e(gyhy,g)e(w_i, g^{\alpha - i}) \cdot e(g^y \cdot h^{y'}, g)
      • =e(gϕq(α)hψq(α),gαi)e(gy,g)e(hy,g)= e(g^{\phi_q(\alpha)} \cdot h^{\psi_q(\alpha)}, g^{\alpha - i}) \cdot e(g^y, g) \cdot e(h^{y'}, g)
      • =e(g,g)ϕq(α)(αi)e(h,g)ψq(α)(αi)e(g,g)ye(h,g)y= e(g, g)^{\phi_q(\alpha)(\alpha - i)} \cdot e(h, g)^{\psi_q(\alpha)(\alpha - i)} \cdot e(g, g)^y \cdot e(h, g)^{y'}
      • (assuming y=ϕ(i)y = \phi(i), y=ψ(i)y' = \psi(i))
      • =e(g,g)ϕq(α)(αi)+ϕ(i)e(h,g)ψq(α)(αi)+ψ(i)= e(g, g)^{\phi_q(\alpha)(\alpha - i) + \phi(i)} \cdot e(h, g)^{\psi_q(\alpha)(\alpha - i) + \psi(i)}
      • =e(g,g)ϕ(α)e(h,g)ψ(α)= e(g, g)^{\phi(\alpha)} \cdot e(h, g)^{\psi(\alpha)}.
    • In conclusion, left side = right side holds.

Conclusion

PropertyPolyCommit_DLPolyCommit_Ped
CommitmentC=gϕ(α)C = g^{\phi(\alpha)}C=gϕ(α)hψ(α)C = g^{\phi(\alpha)} \cdot h^{\psi(\alpha)}
HidingComputationalUnconditional
BindingRelies on t-SDH assumption (computational)Relies on t-SDH assumption (computational)
SetupTuple of powers for ggTuples of powers for gg and hh (twice as large)
Commitment/Witness Size1 group element1 group element
Opening Information(i,y,w)(i, y, w)(i,y,y,w)(i, y, y', w) (adds random evaluation)
ComplexityRelatively simpleSlightly more complex in Setup, computations, etc.

PolyCommit_Ped provides stronger privacy protection (unconditional hiding) but at the cost of doubling the Setup size and introducing slight overhead from handling an additional random polynomial during commitment and proof. I recommend choosing the scheme based on the security level required by the specific application protocol.

7. References

related

  1. Aug 5, 2025/articleGroth16
  2. Jul 6, 2025/articleExploring PlonK

graphfeed