KZG 承诺又叫做 KZG10 承诺,是由 Kate,Zaverucha and Goldberg 三位作者共同提出。
多项式
所以对于一个多项式
可以把承诺
- Setup 阶段产生一些公共参数,用于 Commit 阶段和 Open 阶段。
- Commit 阶段:对消息
$m$ 进行承诺得到$C(m)$ 。 - Open 阶段:打开
$C(m)$ 得到$m^\prime$ ,验证$m$ 是否等于$m^\prime$ 。commit 阶段的$m$ ,在 open 阶段是会暴露的。
-
Hiding:意味着敌手获得承诺
$C(m)$ 后无法获得 m 的值 -
Binding:是指一个承诺
$C(m)$ 在 Open 阶段打开只会得到$m$ 而不会得到其他值
多项式承诺 PCS:承诺对象是单变量多项式,$f(X) \in \mathcal{F}^{(≤d)}[X]$:表示所有 degree 最多为
- Prover 运行 Commit 算法,将函数
$f$ 与随机数$r$ 作为输入,$com_f$为输出。将$com_f$ 发送给 Verifier。 - Verifier 发送一个挑战点:即一个函数域
$X$ 中的元素$x$ 。 - Prover 将
$x$ 对应的$f(x)=y$ ,以及 proof$\pi$ 发送给 Verifier。$\pi$ 表明$f(x)=y$ -
$f$ 属于$\mathcal{F}$ ,即$f$ 的$degree \leq d$
其中 Prover 需要计算如下内容:
- 多项式的承诺
$C=[p(x)]$ - 多项式在
$z$ 点的值,$p(z)=y$,这很简单 - the proof
$\pi$
PCS 有多种,比如 FRI or Dark'20 or Dory'20 .但是 KZG 仍然是目前实践中使用最为广泛的 PCS 方案.其特点如下:
- 基于 Pairing 实现
- Proof size 是常量 (一个椭圆曲线群元素)
- 验证时间是常量 (两次 pairing 操作)
其中特性 2 与 3 导致可以将其构造成一个 SNARK 方案。SNARK 的全称是 Succinct Non-interactive Argument of Knowledge:简洁非交互式知识论证。
SNARK 要求
$\text{size of proof}=\mathcal{O}(log(d))$ -
$\text{time of Verification} = \mathcal{O}(log(d))$ ,$d$ 为 degree of Polynomial。
进而可以将 KZG 应用在零知识证明系统如 ZK-SNARK 中。
在计算之前,首先介绍两个概念
这里只简单提一下椭圆曲线,更多细节可参考阅读 basic elliptic curve cryptography series。
假设
用符号
对多项式进行承诺,需要一个与多项式系数数量一样长的 structured reference string(SRS)。该字符串必须按照指定的方式生成,并提供给任何希望承诺多项式的参与方。生成过程多方会共同产生一个秘密随机值
设
目前主流是通过 Ceremony 生成 SRS,关于 Ceremony 的详细细节可参考:https://mirror.xyz/privacy-scaling-explorations.eth/naTdx-u7kyirczTLSAnWwH6ZdedfTQu1yCWQj1m_n-E
Ceremony 的思想与 MPC 类似,让 N 名参与者生成自己的秘密,并按顺序将其添加到主秘密中。只要有一个参与者不泄露秘密,那么主秘密就是安全的。主秘密的生成过程被称为 Ceremony。
可进入 https://ceremy.ethereum.org 查看以太坊社区组织的 KZG Ceremony 的相关信息,该仪式已经结束。
- Trusted Setup 阶段生成 SRS=$([s^0],[s^1],[s^2],\dots, [s^n])$,$n$ 为
$p(x)$ 的 degree。然后将$s$ 丢弃。任何人都可以访问 SRS,但是无法获得$s$ 本身。 - 通过 SRS 计算多项式
$p(x)$ 的承诺为$[P(s)]$ ,且公布$[P(s)]$ 不会暴露 s 与多项式本身:
我们需要 proof
$p(x)$ 的一个零点为$m$ ,即$p(m)=0$ 。那么$p(x)$ 一定能整除$(x-m)$ ,即存在一个商多项式$q(x)$ , 使得:
$$ p(x)=(x-m)*q(x) $$
要证明的是
也把
如果最后能够验证
但是
那能不能在椭圆曲线上的点群中验证它们呢?我们希望能证明等式
等式左边:
椭圆曲线上的点满足 加法同态,即:$[a]+[b]=[a+b]$,所以
等式右边:
在验证过程中,验证方会收到证明方发来的
但是由于椭圆曲线上不满足乘法,即 乘法同态:$[p(s)]\cdot [q(s)] \neq [p(s) \cdot q(s)]$所以等式
因为椭圆曲线上的运算是一个加法群,而不是一个乘法群,乘法没有被定义。
这里需要强调的是,单个运算结构其实并不区分加法乘法,$a \circ b$ 这个
$\circ$ 把它称作成什么都行 只是在有限域上的椭圆曲线点集构成一个加法群,把它称为加法是更符合习惯。 我们区别加法与乘法,比如两种运算的代数结构比如环,域。 因为有两种运算,需要做区分,因为涉及到分配律,谁对谁分配的问题,所以会很明确的区分加法与乘法。
Pairing is a bilinear mapping。深入学习 Pairing 可参考《Pairing for beginners》这本书,在这里只做简单介绍。
-
bilinear
- Linearity:对于某些一元函数,如果该函数服从
$f(ar_1+br_2)=af(r_1)+bf(r_2)$ - Bilinearity:对于二元函数,Linearity 存在于所有维度中,即
$f(ar_1+br_2,s)=af(r_1,s)+bf(r_2,s),f(r,as_1+bs_2) = af(r, s_1) + bf(r, s_2)$
- Linearity:对于某些一元函数,如果该函数服从
-
bilinear mapping 双线性映射是一个函数,它从两个向量空间的元素产生第三个向量空间的元素,每个参数都是线性的。
配对是⼀种抽象操作。其定义可能会有所不同。 有 Tate 配对、Weil 配对、Ate 配对等等…… 虽然每⼀个都通过不同的操作来定义配对, 但是 Input 与 output 的格式,pairing 的属性都是固定的.
$e(P, Q + R) = e(P,Q) \cdot e(P, R)$ $e(P + S, Q) = e(P,Q)\cdot e(S, Q)$ -
$e(aP, bR) = e(P,R)^{ab} = e(P, bR)^a = e(aP, R)^b = e(bP, aR)$ (bilinear) -
$e(P, Q) ≠ 1$ (non-degeneracy property)
例: 请举例在实数域中
$e(3, 4 + 5) = 2^{3 \cdot 9} = 2^{27}$ $e(3, 4) \cdot e(3, 5) = 2^{3 \cdot 4} \cdot 2^{3 \cdot 5} = 2^{12} \cdot 2^{15} = 2^{27}$ - 通过 pairing 证明知道
$x^2 - x - 42 = 0$ 的解,然而并不透露这个解的具体数值。
如果
如果存在
因此只需要提供
回到 KZG 部分
trusted Setup 阶段选择
define pairing e:
原来要验证的等式:
分布集1:
分布集2:
验证者验证等式:
$[x]_1$ 与$xG_1$ 表述形式不同,本质上没有区别。
用黑盒来理解这个等式的话,就等价于在$G_T$群中去验证下面乘法的成立
Verifier 如何进行验算:
- prover 发送
$\pi=[q(s)], v$ - Verifier 自己选择的
$z$ ,根据加法同态,Verifier 可以计算$[s -z]_2$ =$[s]_2 - [z]_2$ -
$G_1, G_2$ is public,pairing function is public。
- 通过 Trusted setup,产生 SRS:$[s^i]_1$,
$[s^i]_2$ . - Prover 使用 $[s^i]_1,对多项式
$p(x)$ 进行 commit,得到$C = [p(s)]_1$ ,发送给 Verifier。 - Verifier 选择挑战点
$z \in {0,\dots,p−1}$ 。 - Prover 发送
$\pi, v$ 给 Verifier。 - Verifier 检查等式:
$e(\pi, [s -z]_2) = e(C -[v]_1, [1]_2)$ —if the equation holds, the verifier accepts the proof —if the equation does not hold, the verifier rejects the proof
对 KZG 的 Corretness Binding hiding 分别分析
-
Corretness $$ e(π,[s-z]_2)\stackrel{?}{=} e(C-[v]_1,[1]_2) $$
-
hiding 因为椭圆曲线的离散对数难题,敌手拿到[x]无法得到 x.
-
Binding 分析 Binding 前,需要介绍 SDH 假设。
Strong Diffie-Hellman(SDH) 问题定义如下:
给定(q+1)长的元组
SDH假设就是不存在多项式时间算法可以以不可忽略概率解决 SDH 问题。下面用对称形式的 Pairing 进行分析
后续 pairing 的验证都是“g 的指数上”在进行验证,为了方便起见.省略底数 g,后续的等式都是在指数位置上进行.
反证法,即KZG不满足 binding,那么 open 承诺 C 可以得到值 v 和 v',承诺方必须确定两个不同的值 y 和 y',使得下列等式成立:
即
因为
像之前说的那样,KZG 方案的 Proof size 是常量 (一个椭圆曲线群元素),验证时间也是常量 (两次 pairing 操作),这是其优点.但是其最大缺点是需要一个 Trusted Setup 阶段.
上述过程验证了⼀个在单点上求值的多项式。但如果想证明⼀个多项式上在多点上的值,就必须⼀次⼜⼀次地重复同样的协议 (back and forth)。这显然是没有效率的。为了解决这个问题,需要 "批量 "验证多项式上的点。
假设想证明
通过使用拉格朗日多项式插值法,构造一个经过上述
**原多项式 P(x)与构造的 I(x)**都经过 k 个点对,所以多项式 P(x)-I(x)=0 在如下点上满足
即多项式能够整除
定义一个 zero polynomial:
则下式成立
定义 kate multiproof for the evaluation of these points:
验证过程如下:
- Verifier 通过 k 个 points(z,y)计算 Z(x)和 I(x)
- Verifier 计算
$[Z(s)]_2,[I(s)]_1$ - Verifier 验证等式
$e(\pi,[Z(s)]_2) =e(C-[I(s)]_1,H)$ 是否成
在 zk-rollups 的情况下,想证明发生在 L2 上的一些计算是有效的。简单来讲,发生在 L2 上的计算可通过称为“witness 生成”的过程表示为二维矩阵。然后可以用多项式列表来表示矩阵 - 每列都可以编码为其自己的一维向量。然后,计算的有效性可以表示为这些多项式之间必须保持的一组数学关系。例如,如果前三列分别由多项式 a(x)、b(x) 以及 c(x) 表示,可能需要关系 a(x)⋅b(x)−c(x)=0 保持。多项式(代表计算)是否满足这些“正确性约束”可通过在一些随机点评估多项式来确定。如果“正确性约束”在这些随机点上得到了具体的满足,则一名验证者可以非常高的概率断言计算是正确的。
很自然地看到像 KZG 这样的多项式承诺方案,是如何直接插入到这个范式中的:rollup 将 commit to 一组多项式,它们一起代表计算。 然后,验证者可要求对一些随机点进行评估,以检查正确性约束是否成立,从而验证多项式表示的计算是否有效。
最后感谢 @Kurt-Pan 的指导与建议
Understanding KZG10 Polynomial Commitments (taoa.io)
Kate Commitments: A Primer - HackMD
Dankrad Feist's kzg commitment post
https://blog.subspace.network/kzg-polynomial-commitments-cd64af8ec868
Understanding KZG10 Polynomial Commitments
book: Proof,argument and zero knowledge
KZG 原始论文