KZG Polynomial Commitment

Table of Contents

1. 多项式承诺

2010 年,Aniket Kate, Gregory M. Zaverucha, Ian Goldberg 在论文 Constant-Size Commitments to Polynomials and Their Applications 中提出了多项式承诺,一般称为 KZG 多项式承诺,或称为 KZG10,有时也称为 Vector Commitment,本文将介绍它。

1.1. Motivation

在 KZG10 多项式承诺提出之前,已经有了其它的承诺方案,比如哈希承诺,Pedersen 承诺等等。为什么还需要多项式承诺呢?论文作者以 Verifiable Secret Sharing 为例介绍了引入多项式承诺的动机。

下面简单地回顾一下 Feldman's Verifiable Secret Sharing (VSS):Dealer 随机选择一个 t 次多项式 p(x)=s+a1x+a2x2++atxt 后,向所有人公开下面信息(Commitment): c0=gsc1=ga1ct=gat 然后把 p(i),1in 通过加密通道分别发送给第 i 个参与者 Pi 。第 i 个参与者验证 gp(i)=c0c1ic2i2ctit 是否成立,成立就通过协议。

上面的 VSS 有个缺点:Commitment 有 t+1 个值( c0,c1,,ct ), Commitment 数据量太大。 有办法让这个 Commitment 数据量变小吗?比如,我们可以尝试这样改进:把多项式系数 s,a1,,at 拼在一起计算一个哈希,即把 Hash(s||a1||||at) 作为 Commitment,这样 Commitment 数据量是变小了。但是,在 Commitment 的 Open 阶段 Dealer 需要公开多项式的所有系数 s,a1,,at 。这在 VSS 协议中是不可接受的,因为系数 s 是 VSS 协议的关键秘密,不能让任何单个参与者知道。注:Feldman's Verifiable Secret Sharing 向参与者 Pi 公开的数据是 p(i),1in ,也就是说 Dealer 只向 Pi 公开了多项式 p(x) 在点 i 处的值,并没有公开整个多项式。

多项式承诺可以解决上面问题:

  1. 在承诺的 Commit 阶段, 生成的 Commitment 比较小;
  2. 在承诺的 Open 阶段, 不需要公开整个多项式,支持 Partial Open。

注:对于 KZG10 多项式承诺的这两个优点,Merkle Tree 都有,也就是说 Merkle Tree 的 Commitment 也比较小,也支持 Partial Open。和 Merkle Tree 相比,KZG10 多项式承诺的优点是 Proof Size 比较小,如表 1 所示。

Table 1: Merkle Tree VS. KZG
  Commitment Size Proof Size
Merkle Tree O(1) O(log(n))
KZG10 O(1) O(1)

2. KZG10 多项式承诺

下面按 Setup/Commit/Open/Verify 四个阶段来介绍 KZG10 多项式承诺。注:本文采用椭圆曲线的记号来描述,而 KZG10 原始论文是采用离散对数记号来描述的。

2.1. Setup

KZG10 多项式承诺依赖于 Pairinge:G1×G2GTG1,G2 分别是群 G1,G2 的 Generator。设 s 是一个秘密值,计算 siG1,sG2 (其中 i=1,2, )并把它们公开给所有人。在 Setup 结束后, s 会被销毁,没人再知道 s 值。 s 也称为 trapdoor 值,因为它一旦销毁后,没有人能够再计算出这个值;换一种角度说,假设某人知道了 trapdoor 值,那么整个协议就不安全了。

2.2. Commit

假设 Prover 需要向别人承诺 n 个值 [x0,x1,,xn1] (也就是说不想公开这些值,但在 Open 阶段要说服 Verifier 我知道这些值)。首先, Prover 把这些值编码为满足 p(i)=xi,0in1 的多项式,记这个多项式为 p(x) 利用拉格朗日插值多项式公式可知: p(x)=i=0n1xi0j<n,jixjij 这是一个 n1 次多项式,记 pi 是这个 n1 次多项式的系数。也就是说这个 n1 次多项式还可以表示为 p(x)=i=0n1pixi

对这 n 个值 [x0,x1,,xn1] 的 Commitment 为: Cp(s)G1=i=0n1pisiG1 其中的 siG1 在 Setup 阶段已经由 Dealer 公开给所有人了。由上面的公式可知, Commitment 是椭圆曲线 G1 上的一个点,它不依赖于 n 的大小,这就是 KZG10 的 Commitment 比较小的原因。 承诺 10 个值和承诺 1000 个值它们的 Commitment 大小是一样的。

2.3. Open

假设现在 Prover 想证明他掌握了 [x0,x1,,xn1] 中的某个值 xz,0zn1 ,记 yxz ,也就是说 Prover 需要证明 p(z)=y 。下面引入一个新多项式: q(x)p(x)yxz KZG 证明了这个多项式存在。和记号 pi 类似,记 qi 是多项式 q(x) 的各个系数。

Prover 如果要证明在索引 z 处,多项式的值为 y ,则他需要公开的 Witness 为: πq(s)G1=i=0n1qisiG1 由上面的公式可知,Witness π 也是椭圆曲线 G1 上的一个点。

2.4. Verify

Verifier 收到 Witness π 后,验证: e(π,sG2zG2)=?e(CyG1,G2) 是否成立(式中 sG2 在 Setup 阶段就计算好了,因为 s 在 Setup 阶段结束后就销毁了,所以 sG2 需要在销毁 s 前计算),如果成立则说明 Prover 没有说谎,Commitment C 中确实包含了对 xz 的承诺。

为什么 e(π,sG2zG2)=?e(CyG1,G2) 会成立呢?这是因为: e(π,sG2zG2)=e(CyG1,G2)e(q(s)G1,sG2zG2)=e(p(s)G1yG1,G2)e(G1,G2)q(s)(sz)=e(G1,G2)p(s)yq(s)(sz)=p(s)y 显然,最后一式成立,所以第一式成立。

2.5. Batch Opening(同时打开多项式的多个点)

在节 2.3 中,只打开了多项式的一个点 (z,y) 。现在,假设要打开 t 个点,即 p(zi)=yifori{0,,t1} ,一个显而易见的办法是 Prover 分别为这 t 个点计算相应的 Witness,而 Verifier 执行 t 次 Verify 过程分别验证每个点。这种方法可行,但性能不好,下面介绍一种更快的方法。

首先,把需要打开的这 t 个点编码为满足 T(zi)=yi,0it1 的多项式,记这个多项式为 T(x) 。利用拉格朗日插值多项式公式可知: T(x)=i=0t1yi0j<t,jixzjzizj

由于前面介绍的多项式 p(x) 也经过了这些点,所以有 p(x)=T(x)forx{z0,,zt1} ,我们定义: q(x)(p(x)T(x))/Z(x)whereZ(x)=j=0t1(xzj) 多项式 q(x) 一定存在,记 qi 是多项式 q(x) 的各个系数。

Prover 计算 Witness 时,其定义不变,为: πq(s)G1=i=0n1qisiG1

Verifier 收到 π 后,验证: e(π,Z(s)G2)=?e(CT(s)G1,G2) 是否成立。

为什么 e(π,Z(s)G2)=?e(CT(s)G1,G2) 会成立呢?这是因为: e(π,Z(s)G2)=e(CT(s)G1,G2)e(q(s)G1,Z(s)G2)=e(p(s)G1T(s)G1,G2)e(G1,G2)q(s)Z(s)=e(G1,G2)p(s)T(s)q(s)Z(s)=p(s)T(s) 显然,最后一式成立,所以第一式成立。

2.6. KZG10 多项式承诺的实例

这里有个使用 BLS12-381 曲线演示 KZG10 多项式承诺的例子:https://github.com/qizhou/research/blob/main/poly_commit/bls/poly_commit.py

3. 多项式承诺的应用

KZG10 论文中介绍了 KZG10 多项式承诺的几个应用:

  1. Verifiable Secret Sharing
  2. Zero-Knowledge Sets
  3. Credentials and Content Extraction Signatures

4. 和其它多项式承诺的对比

除了 KZG10 多项式承诺外,还有其它的多项式承诺方案,如:

  1. KZG10 Commitment: based on pairing group, used in Plonk
  2. IPA (Inner Product Argument) Commitment: based on discrete log group, used in Bulletproof, Halo2
  3. FRI Commitment: based on hash function, used in zk-STARKs
  4. DARKS Commitment: based on unknown order group, used in Supersonic

KZG10, IPA, FRI, and DARKS: Analysis Of Polynomial Commitment Schemes 中对上面这些方案进行了对比。

5. 参考

  1. Aniket Kate, Gregory M. Zaverucha, Ian Goldberg. Constant-Size Commitments to Polynomials and Their Applications. 2010
  2. Aniket Kate, Gregory M. Zaverucha, Ian Goldberg. Polynomial Commitments. 2010(和上一篇论文类似,不过这篇多了一个附录,附录中有一些证明)
  3. https://en.wikipedia.org/wiki/Commitment_scheme#KZG_commitment
  4. KZG10, IPA, FRI, and DARKS: Analysis Of Polynomial Commitment Schemes

Author: cig01

Created: <2023-01-02 Mon>

Last updated: <2023-01-20 Fri>

Creator: Emacs 27.1 (Org mode 9.4)