参考文献:

  1. Petkus M. Why and how zk-snark works: Definitive explanation[J]. arXiv preprint arXiv:1906.07221, 2019.
  2. Kilian J. A note on efficient zero-knowledge proofs and arguments[C]//Proceedings of the twenty-fourth annual ACM symposium on Theory of computing. 1992: 723-732.
  3. Reitwiessner C. zkSNARKs in a nutshell[J]. Ethereum blog, 2016, 6: 1-15.
  4. Nitulescu A. zk-SNARKs: A Gentle Introduction[R]. Technical report, 2020.

文章目录

  • zkSNARKs
  • Schwartz-Zippel lemma
    • 描述
    • 应用
  • 多项式知识的证明
    • 简洁的证明
    • 同态承诺
    • 限制多项式
    • 添加零知识
    • 实现非交互性
    • CRS
  • 总结

zkSNARKs

SNARK 是 succinct non-interactive arguments of knowledge 的简写。它是一个知识的证明系统,除了完备性completeness)和可靠性soundness),额外拥有:

  • 简洁性Succinct):相较于证明的内容,消息的长度很小
  • 非交互性Non-interactive):消息的发送方只有 Prover
  • 论证ARguments):Verifier 仅可以抵御多项式有界敌手,又称 “computational soundness”
  • 关于知识的of Knowledge):如果 Prover 不知道 witness,那么它不能构造出 proof / argument

而 zkSNARK,它额外再拥有零知识性zero-knowledge)。事实上,零知识很容易达成(加入随机偏移即可),最重要的特性其实是 “简洁、无交互”。

Schwartz-Zippel lemma

描述

对于nnn个变元,定义项的总度数(total degree)为
deg⁡(∏i=1nxisi)=∑i=1nsi\deg(\prod_{i=1}^n x_i^{s_i}) = \sum_{i=1}^n s_i deg(i=1∏n​xisi​​)=i=1∑n​si​

(有限 / 无限)域F\mathbb FF上的nnn元ddd次多项式,
P(x1,⋯,xn)∈F[x1,⋯,xn]P(x_1,\cdots,x_n) \in \mathbb F[x_1,\cdots,x_n] P(x1​,⋯,xn​)∈F[x1​,⋯,xn​]

令S⊆FS \subseteq \mathbb FS⊆F是有限子集,那么独立均匀地选取随机点(r1,⋯,rn)∈Sn(r_1,\cdots,r_n) \in S^n(r1​,⋯,rn​)∈Sn,有
Pr[P(r1,⋯,rn)=0]≤d∣S∣Pr[P(r_1,\cdots,r_n)=0] \le \dfrac{d}{|S|} Pr[P(r1​,⋯,rn​)=0]≤∣S∣d​

等价地,令Z(f)Z(f)Z(f)是fff的零点集,那么有
∣Z(f)∩Sn∣≤d⋅∣S∣n−1|Z(f) \cap S^n| \le d \cdot |S|^{n-1} ∣Z(f)∩Sn∣≤d⋅∣S∣n−1

应用

我们可以高效地检查若干(大规模)多项式之间的等式关系。例如:
f(x)=g(x)h(x)⟺f(x)−g(x)h(x)=0f(x) = g(x)h(x) \iff f(x)-g(x)h(x) = 0 f(x)=g(x)h(x)⟺f(x)−g(x)h(x)=0

已知f,g,hf,g,hf,g,h的度数最高为ddd,那么我们圈定一个范围SSS,满足d≪∣S∣d \ll |S|d≪∣S∣,那么我们随机选取r∈Sr \in Sr∈S,检查下述等式是否成立:
f(r)−g(r)h(r)=0f(r) - g(r)h(r) = 0 f(r)−g(r)h(r)=0

  1. 如果f(x)−g(x)h(x)=0f(x)-g(x)h(x) = 0f(x)−g(x)h(x)=0,那么对于任意的rrr,有
    Pr[f(r)−g(r)h(r)=0]=1Pr[f(r) - g(r)h(r) = 0] =1 Pr[f(r)−g(r)h(r)=0]=1

  2. 如果f(x)−g(x)h(x)≠0f(x)-g(x)h(x) \neq 0f(x)−g(x)h(x)=0,那么对于任意的rrr,上述检查通过的概率为
    Pr[f(r)−g(r)h(r)=0]≤d∣S∣Pr[f(r) - g(r)h(r) = 0] \le \frac{d}{|S|} Pr[f(r)−g(r)h(r)=0]≤∣S∣d​

无论每个多项式有多大,我们仅仅检查一个随机点上的等式即可!没必要计算多项式乘法,然后再检查每个系数是否相等。

多项式知识的证明

可以证明的多项式的性质有很多,我们关注对多项式因子的知识证明。确切地说:

  1. Prover(简记PPP)宣称自己拥有的多项式p(x)p(x)p(x),它有一个因子t(x)t(x)t(x)
  2. Verifier(简记VVV)要求 Prover 证明存在一个h(x)h(x)h(x),满足p(x)=t(x)h(x)p(x)=t(x)h(x)p(x)=t(x)h(x)

简洁的证明

我们利用 Schwartz-Zippel lemma 来设计简洁的证明:

  1. VVV随机采样rrr,发送rrr给PPP
  2. PPP计算h(x)=p(x)/t(x)h(x) = p(x)/t(x)h(x)=p(x)/t(x),再计算p=p(r),h=h(r)p=p(r),h=h(r)p=p(r),h=h(r),然后发送p,hp,hp,h给VVV
  3. VVV本地计算t=t(r)t=t(r)t=t(r),验证p=t⋅hp=t \cdot hp=t⋅h

上述协议的问题:

  • PPP如果持有p(x)=t(x)h(x)+s(x)p(x)=t(x)h(x)+s(x)p(x)=t(x)h(x)+s(x),其中r(x)≠0r(x)\neq 0r(x)=0,它可以计算h′(r)=h(r)+s(r)/t(r)h'(r)=h(r)+s(r)/t(r)h′(r)=h(r)+s(r)/t(r),VVV检查p=t⋅h’p=t \cdot h’p=t⋅h’成立
  • PPP即使完全不知道p(x)p(x)p(x),它依然可以随机选取hhh,然后设置p=t⋅hp=t \cdot hp=t⋅h,但VVV完全无法发现PPP并没持有p(x)p(x)p(x)
  • PPP知道了rrr,因此它可以任意构造多项式p′(x)p'(x)p′(x),使它满足p′(r)=t(r)⋅h(r)p'(r)=t(r) \cdot h(r)p′(r)=t(r)⋅h(r),于是VVV获得了t(x)∣p′(x)t(x)|p'(x)t(x)∣p′(x)的证明,而不是t(x)∣p(x)t(x)|p(x)t(x)∣p(x)的证明
  • PPP知道t(x)t(x)t(x)的次数,因此它可以找一个次数特别高的多项式p(x)p(x)p(x),使得它满足t(x)∣p(x)t(x) | p(x)t(x)∣p(x)

同态承诺

我们应当让PPP无法获得r,t(r)r,t(r)r,t(r),从而避免它伪造p(r)p(r)p(r)或者p(x)p(x)p(x),于是同态加密登场了。我们实际上不关心解密问题,因此我们只需要一个承诺算法。

选取合适的循环群(后续技术中要求它是存在双线性映射的椭圆曲线群),它的生成元为ggg,其上的 CDH 是困难的:
E(s)=gsE(s) = g^s E(s)=gs

明显有同态加法
E(s1)⋅E(s2)=gs1+s2=E(s1+s2)E(s_1) \cdot E(s_2) = g^{s_1+s_2} = E(s_1+s_2) E(s1​)⋅E(s2​)=gs1​+s2​=E(s1​+s2​)

以及标量乘法
E(s)c=gc⋅s=E(c⋅s)E(s)^c = g^{c \cdot s} = E(c \cdot s) E(s)c=gc⋅s=E(c⋅s)

它不支持同态乘法(太笨重,也没必要)。利用同态加法和标量乘法,我们完全可以对一个多项式ϕ(x)\phi(x)ϕ(x)做承诺:随机点s∈Fs \in \mathbb Fs∈F的函数值ϕ(s)\phi(s)ϕ(s)对应的单个群元素gϕ(s)g^{\phi(s)}gϕ(s)(Kate Commitment

协议修改为:

  1. VVV随机采样sss,发送承诺
    E(s0),E(s1),⋯,E(sd)E(s^0),E(s^1),\cdots,E(s^d) E(s0),E(s1),⋯,E(sd)

  2. PPP拥有
    p(x)=∑i=0dpixip(x) = \sum_{i=0}^d p_i x^i p(x)=i=0∑d​pi​xi

    然后计算
    E(p(s))=∏i=0d(gsi)pi=∏i=0dE(si)pi=gpE(p(s)) = \prod_{i=0}^d (g^{s^i})^{p_i} = \prod_{i=0}^d E(s^i)^{p_i} = g^p E(p(s))=i=0∏d​(gsi)pi​=i=0∏d​E(si)pi​=gp

    类似的计算h(x)=p(x)/t(x)h(x)=p(x)/t(x)h(x)=p(x)/t(x)对应的E(h(s))E(h(s))E(h(s)),然后发送gp,ghg^p,g^hgp,gh给VVV

  3. VVV本地计算t=t(s)t=t(s)t=t(s),然后验证gp=(gh)tg^p = (g^h)^tgp=(gh)t

上述协议的问题:

  • PPP完全可以使用任意策略,来计算两个任意的值zp,zhz_p,z_hzp​,zh​,只要满足zp=zht(s)z_p = z_h^{t(s)}zp​=zht(s)​:先计算出E(t(s))=gt(s)E(t(s)) = g^{t(s)}E(t(s))=gt(s),然后随机选取rrr,设置zh=grz_h=g^rzh​=gr,zp=(gt(s))rz_p = (g^{t(s)})^rzp​=(gt(s))r

限制多项式

我们应当限制PPP正确地使用这些承诺E(si)E(s^i)E(si)的幂次,来计算p(s)p(s)p(s)的承诺。这里,我们让VVV对承诺E(s)E(s)E(s)做随机偏移E(s)αE(s)^\alphaE(s)α,要求PPP返回的一对值a,a′a,a'a,a′满足限制aα=a′a^\alpha=a'aα=a′

那么由于 CDH 限制了PPP不知道α\alphaα,于是它只能选取某个整数ccc,并计算
a=(E(s))c,a′=(E(s)α)ca=(E(s))^c,a'=(E(s)^\alpha)^c a=(E(s))c,a′=(E(s)α)c

这是除了穷举外,唯一的使得aα=a′a^\alpha=a'aα=a′的计算方法。VVV虽然不知道ccc的值(也不应知道),但它可以确定aaa确实是E(s)E(s)E(s)的某个幂次

协议修改为:

  1. VVV随机采样s,αs,\alphas,α,发送承诺
    E(s0),E(s1),⋯,E(sd)E(s^0),E(s^1),\cdots,E(s^d) E(s0),E(s1),⋯,E(sd)

    以及偏移的承诺
    E(s0)α,E(s1)α,⋯,E(sd)αE(s^0)^\alpha,E(s^1)^\alpha,\cdots,E(s^d)^\alpha E(s0)α,E(s1)α,⋯,E(sd)α

  2. PPP拥有
    p(x)=∑i=0dpixip(x) = \sum_{i=0}^d p_i x^i p(x)=i=0∑d​pi​xi

    然后计算
    E(p(s))=∏i=0d(gsi)pi=∏i=0dE(si)pi=gpE(p(s)) = \prod_{i=0}^d (g^{s^i})^{p_i} = \prod_{i=0}^d E(s^i)^{p_i} = g^p E(p(s))=i=0∏d​(gsi)pi​=i=0∏d​E(si)pi​=gp

    以及对应的偏移
    E(p(s))α=(∏i=0d(gsi)pi)α=∏i=0d(E(si)α)pi=gα⋅p=gp′E(p(s))^\alpha = (\prod_{i=0}^d (g^{s^i})^{p_i})^\alpha = \prod_{i=0}^d (E(s^i)^\alpha)^{p_i} = g^{\alpha \cdot p} = g^{p'} E(p(s))α=(i=0∏d​(gsi)pi​)α=i=0∏d​(E(si)α)pi​=gα⋅p=gp′

    类似的计算h(x)=p(x)/t(x)h(x)=p(x)/t(x)h(x)=p(x)/t(x)对应的E(h(s))E(h(s))E(h(s)),然后发送gp,gp’,ghg^p,g^{p’},g^hgp,gp’,gh给VVV

  3. VVV本地计算t=t(s)t=t(s)t=t(s),先检查约束(gp)α=gp′(g^p)^\alpha=g^{p'}(gp)α=gp′,然后再验证gp=(gh)tg^p = (g^h)^tgp=(gh)t

上述协议的问题:

  • 理论上h(x)h(x)h(x)的系数hih_ihi​的范围是整个域F\mathbb FF,但是实际工程里的系数是有限的取值,因此VVV完全可以根据E(h(s))E(h(s))E(h(s))的信息获得h(x)h(x)h(x)的一些特性信息。p(x)=t(x)h(x)p(x)=t(x)h(x)p(x)=t(x)h(x)也一样。

添加零知识

由于VVV只能根据PPP发送的承诺值gp,gp′,gh,gh′g^p,g^{p'},g^h,g^{h'}gp,gp′,gh,gh′,来确定p(x)p(x)p(x)的信息。因此,我们让PPP也对这些承诺值做随机偏移δ\deltaδ

协议修改为:

  1. VVV随机采样s,αs,\alphas,α,发送承诺
    E(s0),E(s1),⋯,E(sd)E(s^0),E(s^1),\cdots,E(s^d) E(s0),E(s1),⋯,E(sd)

    以及偏移的承诺
    E(s0)α,E(s1)α,⋯,E(sd)αE(s^0)^\alpha,E(s^1)^\alpha,\cdots,E(s^d)^\alpha E(s0)α,E(s1)α,⋯,E(sd)α

  2. PPP拥有
    p(x)=∑i=0dpixip(x) = \sum_{i=0}^d p_i x^i p(x)=i=0∑d​pi​xi

    然后计算
    E(p(s))=∏i=0d(gsi)pi=∏i=0dE(si)pi=gpE(p(s)) = \prod_{i=0}^d (g^{s^i})^{p_i} = \prod_{i=0}^d E(s^i)^{p_i} = g^p E(p(s))=i=0∏d​(gsi)pi​=i=0∏d​E(si)pi​=gp

    以及对应的偏移
    E(p(s))α=(∏i=0d(gsi)pi)α=∏i=0d(E(si)α)pi=gα⋅p=gp′E(p(s))^\alpha = (\prod_{i=0}^d (g^{s^i})^{p_i})^\alpha = \prod_{i=0}^d (E(s^i)^\alpha)^{p_i} = g^{\alpha \cdot p} = g^{p'} E(p(s))α=(i=0∏d​(gsi)pi​)α=i=0∏d​(E(si)α)pi​=gα⋅p=gp′

    类似的计算h(x)=p(x)/t(x)h(x)=p(x)/t(x)h(x)=p(x)/t(x)对应的E(h(s))E(h(s))E(h(s))

    然后选取随机偏移δ\deltaδ,计算并发送
    (gp)δ,(gp’)δ,(gh)δ(g^p)^\delta,(g^{p’})^\delta,(g^h)^\delta (gp)δ,(gp’)δ,(gh)δ

  3. VVV本地计算t=t(s)t=t(s)t=t(s),先检查约束((gp)δ)α=(gp′)δ((g^p)^\delta)^\alpha=(g^{p'})^\delta((gp)δ)α=(gp′)δ,然后再验证
    (gp)δ=E(δ⋅p(s))=((gh)δ)t=E(δ⋅t(s)h(s))(g^p)^\delta = E(\delta \cdot p(s)) = ((g^h)^\delta)^t = E(\delta \cdot t(s)h(s)) (gp)δ=E(δ⋅p(s))=((gh)δ)t=E(δ⋅t(s)h(s))

上述协议的问题:

  • 由于上述协议是PPP,VVV交互式进行的,因此第三者V′V'V′总是可以质疑上述 proof 的正确性。

实现非交互性

观察协议,发现只要让 step 1 的随机点和随机偏移s,αs,\alphas,α成为证明系统的 secret parameters 即可。这个秘密参数应当满足以下性质: to be reusable, public, trustworthy and infeasible to abuse。它叫做 common reference stringCRS),就是天上掉馅饼 !!!∑(゚Д゚ノ)ノ

我们让可信方生成s,αs,\alphas,α,然后计算E(t(s)),{E(si),E(si)α}i=1dE(t(s)),\{E(s^i),E(s^i)^\alpha\}_{i=1}^dE(t(s)),{E(si),E(si)α}i=1d​,公开后立刻销毁s,αs,\alphas,α,防止PPP伪造信息。任意的人都可以作为P,VP,VP,V在任意的一次证明中使用它,且他们都不知道s,αs,\alphas,α的值。

由于VVV不知道t(s)t(s)t(s),那么怎么验证E(p(s))=E(t(s)⋅h(s))E(p(s))=E(t(s) \cdot h(s))E(p(s))=E(t(s)⋅h(s))是个问题,因为承诺算法E(⋅)E(\cdot)E(⋅)不支持同态乘法。于是我们引入双线性对(可在椭圆曲线群上实例化),它可以计算密文下的单次乘法。

椭圆曲线群G,GG,\textbf{G}G,G,令g,gg,\textbf{g}g,g是它们各自的生成元,存在双线性映射e:G×G→Ge:G \times G \to \textbf{G}e:G×G→G,使得e(g,g)=ge(g,g)=\textbf{g}e(g,g)=g,满足
e(ga,gb)=g(gab,g)=e(g,gab)=e(g,g)ab=gabe(g^a,g^b) = g(g^{ab},g) = e(g,g^{ab}) = e(g,g)^{ab} = \textbf{g}^{ab} e(ga,gb)=g(gab,g)=e(g,gab)=e(g,g)ab=gab

易知,
e(ga,gb)⋅e(gc,gd)=gab+cde(g^a,g^b) \cdot e(g^c,g^d) = \textbf{g}^{ab+cd} e(ga,gb)⋅e(gc,gd)=gab+cd

协议修改为:

  1. Setup:可信方随机采样s,αs,\alphas,α,计算承诺
    E(s0),E(s1),⋯,E(sd)E(s^0),E(s^1),\cdots,E(s^d) E(s0),E(s1),⋯,E(sd)

    以及偏移的承诺
    E(s0)α,E(s1)α,⋯,E(sd)αE(s^0)^\alpha,E(s^1)^\alpha,\cdots,E(s^d)^\alpha E(s0)α,E(s1)α,⋯,E(sd)α

    设置 Proving key(公开的):
    (gα,{gsi}i=1d,{gαsi}i=1d)\left( g^\alpha,\, \{g^{s^i}\}_{i=1}^d,\, \{g^{\alpha s^i}\}_{i=1}^d \right) (gα,{gsi}i=1d​,{gαsi}i=1d​)

    设置 Verification key(公开的):
    (gα,gt(s))\left( g^\alpha,\, g^{t(s)} \right) (gα,gt(s))

    上述两者就构成了 CRS

  2. Proving:PPP拥有
    p(x)=∑i=0dpixip(x) = \sum_{i=0}^d p_i x^i p(x)=i=0∑d​pi​xi

    然后计算
    E(p(s))=∏i=0d(gsi)pi=∏i=0dE(si)pi=gpE(p(s)) = \prod_{i=0}^d (g^{s^i})^{p_i} = \prod_{i=0}^d E(s^i)^{p_i} = g^p E(p(s))=i=0∏d​(gsi)pi​=i=0∏d​E(si)pi​=gp

    以及对应的偏移
    E(p(s))α=(∏i=0d(gsi)pi)α=∏i=0d(E(si)α)pi=gα⋅p=gp′E(p(s))^\alpha = (\prod_{i=0}^d (g^{s^i})^{p_i})^\alpha = \prod_{i=0}^d (E(s^i)^\alpha)^{p_i} = g^{\alpha \cdot p} = g^{p'} E(p(s))α=(i=0∏d​(gsi)pi​)α=i=0∏d​(E(si)α)pi​=gα⋅p=gp′

    类似的计算h(x)=p(x)/t(x)h(x)=p(x)/t(x)h(x)=p(x)/t(x)对应的E(h(s)),E(α⋅p(s))E(h(s)),E(\alpha \cdot p(s))E(h(s)),E(α⋅p(s))

    然后选取随机偏移δ\deltaδ,计算并发送
    π={(gp)δ,(gp’)δ,(gh)δ}\pi = \{(g^p)^\delta,(g^{p’})^\delta,(g^h)^\delta\} π={(gp)δ,(gp’)δ,(gh)δ}

  3. Verification:利用双线性对(计算乘法),VVV先检查约束,
    e((gp)δ,gα)=e((gp′)δ,g)e((g^p)^\delta,g^\alpha) = e((g^{p'})^\delta,g) e((gp)δ,gα)=e((gp′)δ,g)
    然后再验证因子
    e((gp)δ,g)=e((gh)δ,gt(s))e((g^p)^\delta,g) = e((g^h)^\delta,g^{t(s)}) e((gp)δ,g)=e((gh)δ,gt(s))

注意,应当让G≠GG \neq \textbf{G}G=G,使得e(⋅,⋅)e(\cdot,\cdot)e(⋅,⋅)类似一个Hash函数。如果G=GG = \textbf{G}G=G,那么恶意的PPP可以设置gp′=e(gp,gα)g^{p'}=e(g^p,g^\alpha)gp′=e(gp,gα),于是也可以通过检查
e(e(gp,gα),g)=e(gp,gα)e(e(g^p,g^\alpha),g) = e(g^p,g^\alpha) e(e(gp,gα),g)=e(gp,gα)

上述协议的问题:

  • s,αs,\alphas,α是由一个可信方选取的,计算了承诺后立即销毁它们。这在现实中不切实际:没有人会相信其他人确实销毁了s,αs,\alphas,α,持有它们的PPP拥有伪造 proof 的能力。

CRS

为了避免诚实方的问题,我们生成 composite CRS。假设存在nnn个参与者{Pj}j=1n\{P_j\}_{j=1}^n{Pj​}j=1n​,我们选取P1P_1P1​作为链表开头:

  1. P1P_1P1​随机选取s1,α1s_1,\alpha_1s1​,α1​,公布它的 CRS
    (gA1,{gS1i}i,{gAS1i}i):=(gα1,{gs1i}i,{gα1s1i}i)\left( g^{A_1}, \{g^{S_1^i}\}_i, \{g^{AS_1^i}\}_i \right) := \left( g^{\alpha_1},\, \{g^{s_1^i}\}_i,\, \{g^{\alpha_1 s_1^i}\}_i \right) (gA1​,{gS1i​}i​,{gAS1i​}i​):=(gα1​,{gs1i​}i​,{gα1​s1i​}i​)

  2. PjP_jPj​接收到Pj−1P_{j-1}Pj−1​的 CRS 后,随机选取sj,αjs_j,\alpha_jsj​,αj​,利用加法同态,计算新的 CRS
    (gAj,{gSji}i,{gAjSji}i):=(gAj−1⋅αj,{gSj−1i⋅sji}i,{gAj−1Sj−1i⋅αjsji}i)\left( g^{A_j}, \{g^{S_j^i}\}_i, \{g^{A_jS_j^i}\}_i \right) := \left( g^{A_{j-1} \cdot \alpha_j},\, \{g^{S_{j-1}^i \cdot s_j^i}\}_i,\, \{g^{A_{j-1}S_{j-1}^i \cdot \alpha_j s_j^i}\}_i \right) (gAj​,{gSji​}i​,{gAj​Sji​}i​):=(gAj−1​⋅αj​,{gSj−1i​⋅sji​}i​,{gAj−1​Sj−1i​⋅αj​sji​}i​)

  3. 最后,PnP_nPn​发布最终的 CRS
    (gAn,{gSni}i,{gAnSni}i)\left( g^{\Alpha_n}, \{g^{S_n^i}\}_i, \{g^{A_nS_n^i}\}_i \right) (gAn​,{gSni​}i​,{gAn​Sni​}i​)

为了防止第j∈[n]j \in [n]j∈[n]个参与者对不同的幂次iii使用不同的sss,从而破坏 CRS 令它不可用,我们需要做一致性检查consistency check):

  1. 以i=1i=1i=1的承诺E(S1)E(S^1)E(S1)为标准值(canonical value),依次检查其他的i=2,⋯,di = 2,\cdots,di=2,⋯,d的幂次的承诺,
    e(E(Si),g)=e(gS,gSi−1)=e(E(S1),gSi−1)e(E(S^i),g) = e(g^S,g^{S^{i-1}}) = e(E(S^1),g^{S^{i-1}}) e(E(Si),g)=e(gS,gSi−1)=e(E(S1),gSi−1)

  2. 然后,还要检查每个i=1,2,⋯,di=1,2,\cdots,di=1,2,⋯,d的偏移的承诺,
    e(E(ASi),g)=e(gSi,gA)=e(E(Ai),gA)e(E(A S^i),g) = e(g^{S^i},g^A) = e(E(A^i),g^A) e(E(ASi),g)=e(gSi,gA)=e(E(Ai),gA)

另外,为了防止第j≥2j \ge 2j≥2个参与者不使用前j−1j-1j−1个人的 CRS,从而移除它们的随机性,我们还需要验证它们确实是在(gAj−1,{gSj−1i}i,{gAj−1Sj−1i}i)\left( g^{A_{j-1}}, \{g^{S_{j-1}^i}\}_i, \{g^{A_{j-1}S_{j-1}^i}\}_i \right)(gAj−1​,{gSj−1i​}i​,{gAj−1​Sj−1i​}i​)的基础上计算了幂次,利用双线性对判断密文下乘积是否相等,

  1. 要求j≥2j \ge 2j≥2的参与者都公布额外的关于sj,αjs_j,\alpha_jsj​,αj​的承诺
    (gαj,{gsji}i,{gαjsji}i)\left( g^{\alpha_j}, \{g^{s_j^i}\}_i, \{g^{\alpha_j s_j^i}\}_i \right) (gαj​,{gsji​}i​,{gαj​sji​}i​)

  2. 每个参与者都可以检查
    e(E(Aji),g)=e(E(Aj−1i),gαj)e(E(A_{j}^i),g) = e(E(A_{j-1}^i),g^{\alpha_j}) e(E(Aji​),g)=e(E(Aj−1i​),gαj​)

    e(E(Sji),g)=e(E(Sj−1i),gsji)e(E(S_{j}^i),g) = e(E(S_{j-1}^i),g^{s_j^i}) e(E(Sji​),g)=e(E(Sj−1i​),gsji​)

    e(E(AjSji),g)=e(E(Aj−1Sj−1i),gαjsji)e(E(A_j S_{j}^i),g) = e(E(A_{j-1} S_{j-1}^i),g^{\alpha_j s_j^i}) e(E(Aj​Sji​),g)=e(E(Aj−1​Sj−1i​),gαj​sji​)

总结

在 CRS model 下,我们实现了对于多项式知识 t(x)∣p(x)t(x) | p(x)t(x)∣p(x) 的非交互简洁零知识证明,Prover 只需发送一个消息
π={(gp)δ,(gp’)δ,(gh)δ}\pi = \{(g^p)^\delta,(g^{p’})^\delta,(g^h)^\delta\} π={(gp)δ,(gp’)δ,(gh)δ}
给 Verifier 验证。这个 proof 仅仅包含333个承诺,无论p(x),t(x)p(x),t(x)p(x),t(x)的规模有多大。

多项式知识的 zkSNARK相关推荐

  1. 通用 zkSNARK

    文章目录 算术电路的约束 单个乘法操作 多个乘法操作 其他操作 Constant Coefficients Addition for Free Addition Subtraction and Div ...

  2. 笔记——零知识证明zkSNARK

    记录下学习零知识证明的相关资料以及协议构建过程 相关定义 Definition 1 (Quadratic Span Program) 若一个程序QQQ为QSP,则其在域FFF上存在两个集合V={vk( ...

  3. 零知识 QAP 问题的转化

    简介:本文是 Vitalik 写于 2016 年 12 月,用于介绍零知识证明的数学实现方式的论文.文章思路清晰,通俗易懂,也因此,该文成为区块链行业技术人员学习这方面知识的首选文章之一. 术语介绍 ...

  4. 零知识证明学习(三)—— 非交互式零知识证明(zkSNARKs)

    非交互式零知识证明 本节主要介绍一种新的零知识证明-zkSNARKzkSNARKzkSNARK,zkSNARK:zero−knowledgeSuccinctNon−InteractiveArgumen ...

  5. 【知识总结】多项式全家桶(一)(NTT、加减乘除和求逆)

    我这种数学一窍不通的菜鸡终于开始学多项式全家桶了-- 必须要会的前置技能:FFT(不会?戳我:[知识总结]快速傅里叶变换(FFT)) 以下无特殊说明的情况下,多项式的长度指多项式最高次项的次数加\(1 ...

  6. 【知识总结】多项式全家桶(三)(任意模数NTT)

    经过两个月的咕咕,"多项式全家桶" 系列终于迎来了第三期--(雾) 上一篇:[知识总结]多项式全家桶(二)(ln和exp) 先膜拜(伏地膜)大恐龙的博客:任意模数 NTT (在页面 ...

  7. 任意模数ntt_【知识总结】多项式全家桶(三)(任意模数NTT)

    经过两个月的咕咕,"多项式全家桶" 系列终于迎来了第三期--(雾) 先膜拜(伏地膜)大恐龙的博客:任意模数 NTT (在页面右侧面板 "您想嘴谁" 中选择 &q ...

  8. zk-snark的算法详解

    前言 了解零知识证明的读者,可能都拜读过V神的文章,整个系列由浅入深,很有条理,相对其他文章更容易理解一下.其实V神讲解的算法是PGHR13算法的整体步骤,此算法也被应用于知名项目Zcash中,现在, ...

  9. 零知识证明系列之三——入门zkSNARK

    前文回顾 回顾一下一套完善的零知识证明体系需要以下的条件: (1)完备性(Completeness)如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证 ...

最新文章

  1. Android基础教程之五大布局对象------FrameLayout,LinearLayout,AbsoluteLayout,RelativeLayout,TableLayout...
  2. Oracle常用监控SQL
  3. Crystal 语法概述[转]
  4. 常用的、现成的!正则表达式及基础知识
  5. JS判断页面是否出现滚动条
  6. python与html关系,python - jinja2模板、框架和html是什么关系?
  7. linux 系统对信号的处理,Linux下的信号处理函数总结
  8. win32 api 显示一张位图的简单代码,释疑用的。
  9. 5. Keras - CNN应用于手写数字识别
  10. 发现《后端架构师技术图谱》
  11. cocostudio html5,Cocostudio的简单使用:
  12. php源码查后门,某一次排查源码后门的过程
  13. 导出mysql某个表数据_mysql数据库导出指定表数据的方法
  14. ubuntu upgrade problem
  15. php中关于qq第三方登录
  16. Java学习笔记:SQL数据排序
  17. 移动硬盘突然在电脑上无法显示
  18. 蒲公英 · JELLY技术周刊 Vol.29: 前端智能化在阿里的那些事
  19. Adobe Photoshop CC 2019 for Mac(版本介绍)
  20. 数字经济商学院开班仪式成功举行 创新社《筱静观察》倾情支持

热门文章

  1. oninput和onchange区别
  2. Chef集中管理工具实践
  3. 用C# GDI 绘制一张精美的分享二维码图片
  4. 微信扫一扫点击下载App弹出引导页引导在外部浏览器中打开
  5. 开涛的springMVC教程读书笔记
  6. html2canvas:页面转图像和pdf
  7. SparkSteaming程序异常问题排查步骤
  8. 上线 Python 应用仅需一条命令的开源框架:Zappa(详细教程)
  9. 非功能性需求设计:常见的质量属性有哪些?
  10. Python,我们的免费直播课程可以让你成为大师中的大神