通过一天的交流学习大概弄清了KZG10 与 Pairing 的勾迹关系,对PCS也有了更进一步认识,这里详细梳理了一下它们之间的逻辑关系。
Thanks
Takeaways
- commit 的本质是把一个多项式或者一串多项式系数通过椭圆曲线group上大量的加法操作给封印在某个点上,基于DL 是一个困难问题,由这个点无法倒推出相应的多项式,但又能保证bind 特性,因而起到加密的作用
[a]=Ga=ba⟸HardlogG(b)
- 如果想把两个多项式的乘积封印在某个点上,又想保留这两个多项式的bind 特性,这是一个困难问题,pairing 提供了一个思路,它的特性保证了两个多项式的bind 特性
[a∗b]=e([a],[b])=c
简单地说就是,pairing 能够保证c是由a∗b得来的,而不是e∗f得来的。例如:
x4∗x2=x6
给定x6我们可以有多个两两相乘的组合,但pairing 可以把x6 的由来x4 和x2 封印在一个点上
- pairing 的特性拟合出了两个多项式乘积的commit
e([a],[b])=e(Ga,Hb)=e(G,H)ab
大家都在说
【因为椭圆曲线没有乘法定义,所以才引入pairing】但不一定都能把这里面的逻辑理清楚。
了解KZG10 协议的可能真看不出来其中“椭圆曲线乘法”说法的由来,那这个由头是否还站得住脚?是否有更充足或者直观的由头来勾出Pairing?
KZG10 的目标
KZG10 要证明的等式
opening:f(u)=v⟹f(u)−v=0∃q(x) s.t.f(x)−v=q(x)(x−u),if x=u
Prover 需要做一些工作,来证明上面的scalar 等式成立,由scalar 等式转换到 commit 等式
f(x)−v⇕[f(x)−v]=q(x)(x−u)=[q(x)(x−u)]
commit 等式左边好拆解
[f(x)−v]=[f(x)]−[v]
但等式右边有两个多项式因子q(x) 和 (x−u),对它们乘积做commit 其实是件比较困难的事情
gz=Hardga∗b
First Try
比如,如果按照正常逻辑,即椭圆曲线群上的标量乘法,来拆解的话就是:
[q(x)(x−u)]=[q(x)](x−u)
最终拆解得到的是一个scalar mul,但Verifier 又拿不到scalar 部分 (x−u) 的值,所以这么拆解是徒劳无功的。
Second Try
但Verifier 可以拿到[x]、[q(x)],那么是不是可以拆解成下面这个样子:
[q(x)(x−u)]=[x∗q(x)−u∗q(x)]=[x∗q(x)]−[u∗q(x)]=[x∗q(x)]−u∗[q(x)]=?[x]∗[q(x)]−u∗[q(x)]
因为[q(x)]可以轻松拿到,也就是说u∗[q(x)]也完全没问题。但是,需要重点关注[x∗q(x)]=?[q(x)]∗[x],这是一个假想中的“椭圆曲线群上的元素乘法”(也就是点的乘法)的拆解结果,也就是说假定在拿到[x]、[q(x)] 的情况下可以证明原等式成立?
[f(x)]−[v]=[x]∗[q(x)]−u∗[q(x)]⇓?f(x)−v=q(x)(x−u)⇕f(x)−v+u∗q(x)=q(x)∗x
即使这个假设成立,但是椭圆曲线没有点的乘法,也是说算不出来 [x]∗[q(x)],所以此路仍然行不通。
Another Try
基于Verifier 可以拿到的[x]、[q(x)] ,引入bilinear mapping,把两个polynomial 乘积q(x)∗x 的commit 通过pairing 的形式给拟合出来:
[q(x)∗x]T=e([q(x)],[x])=e(Gq(τ),Hτ)=e(G,H)q(τ)∗τ
Gq(τ)和Hτ分别为两个polynomial 分别在椭圆曲线EG和 ET上的commit,那么e(Gq(τ),Hτ) 就表示这两个commit 点映射到目标椭圆曲线ET后相乘得到的点。
e(G,H) 就是两个generator 映射到目标椭圆曲线ET后相乘得到的点,那么e(G,H)q(τ)∗τ 就是两个polynomial 乘积q(τ)∗τ 在目标椭圆曲线上的commit 点。
从这里能看到什么?对,椭圆曲线乘法 和 多项式乘积的commit。
整合一下就是:
f(x)−v⇕f(x)−v+u∗q(x)⇕[f(x)−v+u∗q(x)]⇕e([f(x)−v+u∗q(x)],[1])⇕e(G(f(τ)−v+u∗q(τ)),H1)⇕e(Gf(τ)+u∗q(τ)−v,H1)⇕e(GvGf(τ)∗(Gq(τ))u,H1)=q(x)∗(x−u)=q(x)∗x=[q(x)∗x]=e([q(x)],[x])=e(Gq(τ),Hτ)=e(Gq(τ),Hτ)=e(Gq(τ),Hτ)
其中 H1 和 Hτ 在setup 阶段就拿到了,Gf(τ)、Gq(τ)、(Gq(τ))u、Gv都是需要prover 在收到opening 请求u 后计算的。
Suboptimal Try
对于两个多项式乘法的commitment [q(x)∗x] 有没有不用binlinear mapping的方案呢?有,但proof size会更长,验证的成本也会更大,细节部分就不再展开了

最后
所以更intuitive 的解释是:Verifier 拿不到 τ ,算不出τ∗q(τ) 的commit [τ∗q(τ)],通过bilinear maping 的形式实现了[τ∗q(τ)],且满足binding 特性。