文章目录

  • ZK简介
    • 例子
    • 承诺协议
    • 如何证明零知识性质
    • 如何证明任意的statement
    • 证明和证明某个知识
    • 由Schnorr身份认证协议来看看ZK的性质,以及如何转为非交互式证明
      • completeness
      • Soundness
      • Zero-knowledgeness
      • 从交互式证明到非交互式
  • 三种基础ZK:SNARKS,STARKs,Bulletproofs
    • BulletProofs
    • SNARKs
  • 区块链扩容
    • 区块链扩容包括了两层
    • ZKP如何做扩容?

ZK简介

最初在1980年提出,由Shafi Goldwasser, Silvio Micali和Charles Rackoff。刚开始叫做交互式证明系统(Interactive proof system)。

Prover和Verifier之间交换信息,让Verifier相信某种statement是真的。

Completeness:诚实的Prover最后会让Verifier相信这个statement。

Soundness:只有statement是真的时候,才能让Verifier相信。

zero knowledge:Prover除了证明这个statement是真的之外,不暴露其他信息。

  • Completeness: If the Prover is honest, then she will eventually convince the Verifier.
  • Soundness: The Prover can only convince the Verifier if the statement is true.
  • Zero-knowledge(ness): The Verifier learns no information beyond the fact that the statement is true.

例子

  1. 服务器上面存储了密码的哈希值,用户相当于Prover,服务器是Verifier,用户传输哈希值来证明自己拥有对应的密码,但是服务器不知道哈希值的原像是什么。
  2. 三色图问题,可以Prover给图一个解,Verifier随机打开一条边,Prover再打乱这个解。多次交互。可以动手试试

承诺协议

在三色图问题里面,用灰色的点盖住了答案,所以Verifier无法看到答案,但Prover也不可以对答案进行更改了。

在实际中,这样的“灰点”是一个承诺协议:里面加密了一个信息,但同时绑定了这个信息。

承诺方案允许一方 "承诺 "一个给定的信息,同时对其进行保密,然后再 "打开 "所产生的承诺,以揭示里面的内容。承诺协议可以直接由加密的哈希函数构造。可以理解成一个信封✉,我将一个信息放进了信封里面,发送给别人,但之后我可以将信封撕掉,显示出里面的信息。在这个过程中其他人无法看到里面的信息,这是信息的保密性,同时我在证明过程中也无法对信封内的东西进行替换,这是绑定性。

如何证明零知识性质

最终我们得到的是以下定理。如果存在任何Verifier计算机程序,通过与一些Prover交互式地运行该协议,成功地提取某些信息,那么我们可以简单地在该程序上使用倒带技巧,重新提交一个随机的解决方案,一旦不能正确回答其挑战,就通过倒带执行来 "欺骗 "Verifier。与我们上面给出的逻辑相同:如果这样的Verifier在运行真实协议后成功地提取了信息,那么它应该能够从模拟的、基于倒带的协议中提取相同数量的信息。但是,由于没有信息进入模拟协议,所以没有信息可以提取。因此,验证人能够提取的信息必须总是零。

如果对于每一个可能的Verifier,你都能证明存在一种叫做 "Simulator "的算法,并证明这种算法对于verifier来说与现实统计上不可区分,那么一个协议就可以被证明为零知识。

从纯粹的机械角度来看,模拟器就像一种特殊的验证者。然而,与真正的验证者不同的是–它从一些特殊的知识开始,使它能够证明一个语句的真实性–模拟器根本没有得到任何特殊的知识。* 尽管如此,模拟器(或模拟器)必须能够 "欺骗 "每个验证者,使其相信该语句是真实的,同时产生一个在统计上与真正的验证者的输出相同(或不可区分)的记录。

如何证明任意的statement

Goldreich, Micali and Wigderson (GMW)协议允许我们证明一个图的三着色问题。首先三着色问题是一个NP完全问题。所以可以将任意的NP问题规约为三着色问题。

  1. 如果存在任何决策问题(即具有是/否答案的问题),其见证(解决方案)可以在多项式时间内得到验证,那么。
  2. 我们可以通过以下方式证明上述解决方案的存在:(1)将问题转化为图三色问题的实例,以及(2)运行GMW协议。

证明和证明某个知识

Statements about “facts”. For example, I might wish to prove that “a specific graph has a three coloring” or “some number N is in the set of composite numbers*“.* Each of these is a statement about some intrinsic property of the universe.

Statements about my personal knowledge. Alternatively, I might wish to prove that I know some piece information. Examples of this kind of statement include: “I know a three coloring for this graph”, or “I know the factorization of N”. These go beyond merely proving that a fact is true, and actually rely on what the Prover knows.

第一种和第二种是不一样的:第一种不需要特定的知识也能证明,比如需要证明一个数nnn是合数,并不一定说要知道他的因子是什么;但是第二种证明需要特定的知识,比如nnn的具体的因子有哪些,

由Schnorr身份认证协议来看看ZK的性质,以及如何转为非交互式证明

假设Alice公布了她的公钥pkA=gamodppk_A=g^a \bmod ppkA​=gamodp,其中a∈[1,q]a\in [1,q]a∈[1,q]是私钥,ggg是qqq的生成元,p,qp,qp,q是两个素数。

如果Alice要向Bob证明她拥有这个公钥所对应的私钥。那他们运行如下的交互协议。
AliceBobPick random k∈[1,q]→h=gk(modp)Pick random c∈[1,q]←c→s=ac+k(modq)Check gs≡pkAc⋅hmodp\begin{aligned} &\quad\quad\quad\bold{Alice} &&\quad\quad\quad\bold{Bob}\\ &\text{Pick random } k\in [1,q]&\xrightarrow{~~~~~~~~~~h=g^k \pmod p~~~~~~~~}&\quad \text{Pick random } c \in [1,q]\\ &&\xleftarrow{~~~~~~~~~~~~~~~~~~~~~~c~~~~~~~~~~~~~~~~~~~~}\\ &&\xrightarrow{~~~~~~~~s = ac+k \pmod q~~~~~}&\quad \text{Check }g^s \equiv pk_A^c \cdot h \bmod p \end{aligned} ​AlicePick random k∈[1,q]​          h=gk(modp)        ​                      c                    ​        s=ac+k(modq)     ​​BobPick random c∈[1,q]Check gs≡pkAc​⋅hmodp​

completeness

If the Prover is honest, then she will eventually convince the Verifier.

首先,我们应该问自己,该协议是否完备。这通常是最容易验证的属性:如果Alice诚实地执行协议,Bob在协议结束时应该感到满意?在这种情况下,只要做一点替换,完整性就很容易看到。
gs≡pkAc⋅hmodpgac+k≡(ga)c⋅gkmodpgac+k≡gac+kmodp\begin{aligned} g^s &\equiv pk_A^c \cdot h &\bmod p\\ g^{ac+k}&\equiv (g^{a})^c \cdot g^k &\bmod p\\ g^{ac+k}&\equiv g^{ac+k} &\bmod p \end{aligned} gsgac+kgac+k​≡pkAc​⋅h≡(ga)c⋅gk≡gac+k​modpmodpmodp​

Soundness

The Prover can only convince the Verifier if the statement is true.

说到证明知识证明的合理性,我们有一个非常好的形式化方法。就像我们上面讨论的模拟器一样,我们需要证明一种特殊算法的存在。这种算法被称为知识提取器,它所做的正是它所声称的。知识提取器(Extractor)是一种特殊的验证器,它与Prover进行交互,如果Prover成功地完成了证明,提取器应该能够提取Prover的原始秘密。
AliceExtractorPick random k∈[1,q]→h=gk(modp)Pick random c1∈[1,q]←c1→s1=ac1+k(modq)Extractor rewinds Alice to Step 2←c2→s2=ac2+k(modq)\begin{aligned} &\quad\quad\quad\bold{Alice} &&\quad\quad\quad\bold{Extractor}\\ &\text{Pick random } k\in [1,q]&\xrightarrow{~~~~~~~~~~~h=g^k \pmod p~~~~~~~~~}&\quad \text{Pick random } c_1 \in [1,q]\\ &&\xleftarrow{~~~~~~~~~~~~~~~~~~~~~~~c_1~~~~~~~~~~~~~~~~~~~~}\\ &&\xrightarrow{~~~~~~~~s_1 = ac_1+k \pmod q~~~~~}\\ &&&\text{Extractor rewinds Alice to Step 2}\\ &&\xleftarrow{~~~~~~~~~~~~~~~~~~~~~~~c_2~~~~~~~~~~~~~~~~~~~~}\\ &&\xrightarrow{~~~~~~~~s_2 = ac_2+k \pmod q~~~~~} \end{aligned} ​AlicePick random k∈[1,q]​           h=gk(modp)         ​                       c1​                    ​        s1​=ac1​+k(modq)     ​                       c2​                    ​        s2​=ac2​+k(modq)     ​​ExtractorPick random c1​∈[1,q]Extractor rewinds Alice to Step 2​
Extractor可以重置Prover的状态,就比如这里,让Prover给出了两个相同的k。

通过得到了c1,c2,s1,s2c_1,c_2,s_1,s_2c1​,c2​,s1​,s2​,Extractor可以用如下方式恢复Prover的原始秘密。
(s1−s2)/(c1−c2)modq=((ac1+k)−(ac2+k))/(c1−c2)modq=a(c1−c2)/(c1−c2)modq=a\begin{aligned} (s_1-s_2)/(c_1-c_2) \bmod q&\\ =((ac_1+k)-(ac_2+k))/(c_1-c_2) \bmod q&\\ =a(c_1-c_2)/(c_1-c_2) \bmod q&\\ =a& \end{aligned} (s1​−s2​)/(c1​−c2​)modq=((ac1​+k)−(ac2​+k))/(c1​−c2​)modq=a(c1​−c2​)/(c1​−c2​)modq=a​​

Zero-knowledgeness

The Verifier learns no information beyond the fact that the statement is true.

证明零知识性需要用到模拟器(SImulator),模拟器与Verifier交互,拥有rewind verifier的能力。标准的Schnorr协议是没有这种模拟器的。要证明零知识性,我们要基于一个假设,那就是Verifier是诚实的,也就是他的输入不会随着我们的输入而改变,也就是他会用随机发生器来生成ccc,而不是更具我们发送的值来选。只要有这个假设,就可以构造一个Simulator。

Simulator做如下事情:

  1. 首先,输出随便gk1g^{k_1}gk1​作为第一个消息。然后得到Verifier发送的ccc。
  2. 重置Verifier的状态,选一个随机数z∈[1,q]z\in[1,q]z∈[1,q]。
  3. 计算gk2=gz∗pkA−cg^{k_2}=g^{z} * pk_A^{-c}gk2​=gz∗pkA−c​,并输出gk2g^{k_2}gk2​作为Prover的初始消息。
  4. 当Verifier输出ccc作为挑战时,输出zzz。

总结来说,这里Simulator输出的gk,c,zg^k,c,zgk,c,z与原始的Prover和Verifier交互是统计上不可区分的。Simulator在不知道aaa的情况下,使得Verifier相信了他的证明,因此Verifier无法从这个证明中提取出aaa的信息。

从交互式证明到非交互式

Fiat和Shamir在1980年发现,只要用一个有效的哈希函数,就可以把一个交互式的证明变为一个非交互式的。

特别地,非交互式证明看起来如下:

  1. Prover随机选取gkmodpg^k \bmod pgkmodp。
  2. Prover计算一个挑战c=H(gk∣∣M)c=H(g^k||M)c=H(gk∣∣M),其中H()H()H()是一个哈希函数,MMM是任意消息串。
  3. 计算ac+kmodqac+k \bmod qac+kmodq。

这里一个有意思的点在于,如果MMM是作为一个消息传入的,那么这个方案就可以作为一个Signature方案使用。

三种基础ZK:SNARKS,STARKs,Bulletproofs

三种协议的开销如上,

从技术上来说:SNARKs1和STARKs2都是对某种计算的证明,f(x)=yf(x)=yf(x)=y,不暴露xxx的情况下证明yyy是由xxx计算出来的。而BulletProof是一种范围证明,用于证明某个数字在[0,2n)[0,2^n)[0,2n)中。

在应用中来说:SNARKs是用在Zcash之中的技术,STARKs用在0x上。bulletproof用在门罗币当中,但不是用于保护隐私,门罗币中使用RingCT来保护隐私。

BulletProofs

BulletProofs的思想是一个数字可以表示成二进制形式,如果一个数字的二进制形式有nnn位,那么就可以证明这个数字在[0,2n)[0,2^n)[0,2n)中。

在实际使用过程中,令这个数字为vvv,二进制表示为a\mathbf{a}a,则v=⟨a,2i⟩v = \langle \mathbf{a},2^i \ranglev=⟨a,2i⟩。

要证明的是:

  1. a\mathbf{a}a的大小是正确的。
  2. 证明我们知道这个值,可以用pedersen承诺加Fiat-Shamir类似的技术来证明。

SNARKs

SNARKs1有非常多的变种(50+),SNARKs的基本思路是Computation→\to→Arithmetic Circuit→\to→R1CS3→\to→QAP4→\to→SNARKs

由一个算式,比如x∗y+4=10x*y+4=10x∗y+4=10,要不暴露x,yx,yx,y的情况下证明这个算式是成立的。


先把他转换为算数电路:


再由算数电路变为R1CS:

R1CS3是一种描述电路的语言。具体来说,一条R1CS由四个向量组成,分别为三个描述向量(L,R,O)\left(L,R,O\right)(L,R,O),以及一个解向量vvv,要满足
⟨L,v⟩∗⟨R,v⟩=⟨O,v⟩\langle L, v\rangle *\langle R, v\rangle=\langle O, v\rangle ⟨L,v⟩∗⟨R,v⟩=⟨O,v⟩

首先这个算数电路中的Constraint有3个,分别是:

  1. output1=x∗y\text{output}_1=x*youtput1​=x∗y
  2. output1+4=10\text{output}_1+4=10output1​+4=10

将其转换为R1CS,则令v=[1,x,y,output1]v=[1,x,y,output_1]v=[1,x,y,output1​],对于两个Constraint,分别取:

  1. L=[0,1,0,0],R=[0,0,1,0],O=[0,0,0,1]L=[0,1,0,0],R=[0,0,1,0],O=[0,0,0,1]L=[0,1,0,0],R=[0,0,1,0],O=[0,0,0,1]

⟨L,v⟩=x,⟨R,v⟩=y,⟨O,v⟩=output1\langle L, v\rangle=x,\langle R, v\rangle=y,\langle O, v\rangle=output_1⟨L,v⟩=x,⟨R,v⟩=y,⟨O,v⟩=output1​

⟨L,v⟩∗⟨R,v⟩=⟨O,v⟩⟺x∗y=output1\langle L, v\rangle *\langle R, v\rangle=\langle O, v\rangle \Longleftrightarrow x*y = output_1⟨L,v⟩∗⟨R,v⟩=⟨O,v⟩⟺x∗y=output1​

  1. L=[4,0,0,1],R=[1,0,0,0],O=[10,0,0,0]L=[4,0,0,1],R=[1,0,0,0],O=[10,0,0,0]L=[4,0,0,1],R=[1,0,0,0],O=[10,0,0,0]

⟨L,v⟩=output1+4,⟨R,v⟩=1,⟨O,v⟩=10\langle L, v\rangle=output_1 +4,\langle R, v\rangle=1,\langle O, v\rangle=10⟨L,v⟩=output1​+4,⟨R,v⟩=1,⟨O,v⟩=10

⟨L,v⟩∗⟨R,v⟩=⟨O,v⟩⟺(output1+4)∗1=10\langle L, v\rangle *\langle R, v\rangle=\langle O, v\rangle \Longleftrightarrow (output_1+4) * 1 = 10⟨L,v⟩∗⟨R,v⟩=⟨O,v⟩⟺(output1​+4)∗1=10


从算数电路得到QAP4:

QAP的构造方式如下,L,R,O都是长度为4的向量,我们构造3*4个多项式Li(X),Ri(X),Oi(X),i∈[1,4]L_i(X),R_i(X),O_i(X), i\in[1,4]Li​(X),Ri​(X),Oi​(X),i∈[1,4]。

拿Li(X)L_i(X)Li​(X)举例,他代表着LLL向量的第iii个元素,在不同的Constraint下的多项式,也就是说L1(1)=0,L1(2)=4L_1(1)=0,L_1(2)=4L1​(1)=0,L1​(2)=4,通过多项式插值可以得到L1(X)=4X−4L_1(X)=4X-4L1​(X)=4X−4

罗列一下所有Li(X)L_i(X)Li​(X)的可得:
Constraint1:L(1)=[0,1,0,0]Constraint2:L(2)=[4,0,0,1]L1(1)=0,L1(2)=4,L1(X)=4X−4L2(1)=1,L2(2)=0,L2(X)=−X+2L3(1)=0,L3(2)=0,L3(X)=0L3(1)=0,L3(2)=1,L4(X)=X−1Constraint~1:L^{(1)}=[0,1,0,0]\\ Constraint~2:L^{(2)}=[4,0,0,1]\\ \begin{aligned} L_1(1)&=0,&&L_1(2)=4,&&L_1(X)=4X-4\\ L_2(1)&=1,&&L_2(2)=0,&&L_2(X)=-X+2\\ L_3(1)&=0,&&L_3(2)=0,&&L_3(X)=0\\ L_3(1)&=0,&&L_3(2)=1,&&L_4(X)=X-1\\ \end{aligned} Constraint 1:L(1)=[0,1,0,0]Constraint 2:L(2)=[4,0,0,1]L1​(1)L2​(1)L3​(1)L3​(1)​=0,=1,=0,=0,​​L1​(2)=4,L2​(2)=0,L3​(2)=0,L3​(2)=1,​​L1​(X)=4X−4L2​(X)=−X+2L3​(X)=0L4​(X)=X−1​
可以看出Li(n)=L(n)[i]L_i(n)=L^{(n)}[i]Li​(n)=L(n)[i]。

L(X)→=(L1(X),L2(X),L3(X),L4(X))\overrightarrow{L(X)}=(L_1(X),L_2(X),L_3(X),L_4(X))L(X)​=(L1​(X),L2​(X),L3​(X),L4​(X))

R(X)→=(R1(X),R2(X),R3(X),R4(X))\overrightarrow{R(X)}=(R_1(X),R_2(X),R_3(X),R_4(X))R(X)​=(R1​(X),R2​(X),R3​(X),R4​(X))

O(X)→=(O1(X),O2(X),O3(X),O4(X))\overrightarrow{O(X)}=(O_1(X),O_2(X),O_3(X),O_4(X))O(X)​=(O1​(X),O2​(X),O3​(X),O4​(X))

很容易验证L(1)→=L(1),L(2)→=L(2)\overrightarrow{L(1)}=L^{(1)},\overrightarrow{L(2)}=L^{(2)}L(1)​=L(1),L(2)​=L(2)

L(X)=⟨L(X)→,v⟩L(X)=\langle \overrightarrow{L(X)},v \rangleL(X)=⟨L(X)​,v⟩

R(X)=⟨R(X)→,v⟩R(X)=\langle \overrightarrow{R(X)},v \rangleR(X)=⟨R(X)​,v⟩

O(X)=⟨O(X)→,v⟩O(X)=\langle \overrightarrow{O(X)},v \rangleO(X)=⟨O(X)​,v⟩

由此可以得到L(X)∗R(X)−O(X)=0forX∈{1,2}L(X)*R(X) - O(X)=0~for~X\in\{1,2\}L(X)∗R(X)−O(X)=0 for X∈{1,2}

令P(X)=L(X)∗R(X)−O(X)P(X)=L(X)*R(X)-O(X)P(X)=L(X)∗R(X)−O(X),将P(X)P(X)P(X)拆为两个因子多项式P(X)=T(X)∗H(X)P(X)=T(X)*H(X)P(X)=T(X)∗H(X)。

其中T(X)T(X)T(X)公开。

这样的T(X)T(X)T(X)其实很容易找,因为X=1,X=2X=1,X=2X=1,X=2是P(X)=0P(X)=0P(X)=0的两个根,所以可以令T(X)=(X−1)(X−2)T(X)=(X-1)(X-2)T(X)=(X−1)(X−2),用多项式的除法得到H(X)H(X)H(X)即可。


现在要向外部证明的其实是:

P(X)=L(X)∗R(X)−O(X)=T(X)∗H(X)P(X)=L(X)*R(X)-O(X)=T(X)*H(X)P(X)=L(X)∗R(X)−O(X)=T(X)∗H(X)这样一个式子在所有XXX上成立。

但是公开的多项式只有T(X)T(X)T(X),也就是说,如果取一个数X=sX=sX=s,那么其他人最多能知道T(s)T(s)T(s)的值。那如何在不暴露L(s),R(s),O(s),H(s)L(s),R(s),O(s),H(s)L(s),R(s),O(s),H(s)的情况下证明L(s)∗R(s)−O(s)=T(s)∗H(s)L(s)*R(s)-O(s)=T(s)*H(s)L(s)∗R(s)−O(s)=T(s)∗H(s)成了现在要考虑的问题。

那这里就用到了基于椭圆曲线的一种加密:

令E(s)=sGE(s)=sGE(s)=sG,其中GGG是椭圆曲线的一个生成元。

这样的加密如下性质:

  1. 单项性:给定xxx,很容易计算y=E(x)y=E(x)y=E(x),但给定yyy,很难找到一个xxx满足y=E(x)y=E(x)y=E(x)。
  2. 线性:E(αx+βy)=αE(x)+βE(y)E(\alpha x+\beta y)=\alpha E(x) + \beta E(y)E(αx+βy)=αE(x)+βE(y)
  3. 单射:x≠y⟶E(x)≠E(y)x\neq y \longrightarrow E(x) \neq E(y)x​=y⟶E(x)​=E(y)

所以Prover可以直接计算出P(E(s))=E(P(s))P(E(s))=E(P(s))P(E(s))=E(P(s))的值。

SNARKs的协议如下:
1. Setup: 将E(s)E(s)E(s)公开,T(s)T(s)T(s)公开,sss本身丢弃
2. Prover自己有L,R,O,HL,R,O,HL,R,O,H四个多项式
3. Prover发送E(L(s)),E(R(s)),E(O(s)),E(H(s))E(L(s)),E(R(s)),E(O(s)),E(H(s))E(L(s)),E(R(s)),E(O(s)),E(H(s))
4. 任何人都可以验证:
E(L(s))∗E(R(s))−E(O(s))=E(H(s))∗E(T(s))E(L(s))*E(R(s)) - E(O(s)) = E(H(s)) * E(T(s))E(L(s))∗E(R(s))−E(O(s))=E(H(s))∗E(T(s))

小结:

这里省略了很多的细节,只讲了大概的框框,包括SNARKs是否满足ZK的三个性质是没证明的,所以看到这里应该还没被说服,为啥只要给出了这个证明就得相信这个计算是正确的?其实就是Completeness和Soundness没有证明嘛。
省略的细节包括椭圆曲线,sss其实还要做盲化,要不然不是Zero-knowledge,以及一些配对相关的东西。

区块链扩容

区块链扩容包括了两层

  1. 对区块链本身进行扩容,让他能存更多的交易。这类扩容的例子有Ethereum,Eth2x,DFinity, Polkadot,Cosmos,用到的技术有Sharding, Pruning, State rent, WASM, PoS, Casper, Light clients, ZKPs.
  2. 在分布式应用中尽量少的依赖区块链。比如Dapps,代表性的有Plasma Cash, Ignis,Rollup。

ZKP如何做扩容?

ZKP是解决了这样一个问题:F(X,Y)=ZF(X,Y)=ZF(X,Y)=Z,其中FFF是任意函数,XXX是公开的输入,YYY是私有的输入,ZZZ是公开的输出。

这里YYY除了可以当做一个隐私信息,还可以作为一个批量的信息源,比如XXX和ZZZ都是几十byte,而YYY是几MB的消息。比如在区块链中,FFF可以是验证交易以及更新账本,XXX是先前值的Merkle root,ZZZ是当前值的Merkle root,YYY是一整个Merkle tree。

目前ZKP的技术可以一次操作处理500个交易。Prover的时间是25分钟,目标是降到10分钟(2019年的演讲)。


  1. Succinct Non-interactive ARguments of Knowledge ↩︎ ↩︎

  2. Succinct (Scalable) Transparent ARguments of Knowledge ↩︎

  3. Rank-1 Constraint Satisfaction ↩︎ ↩︎

  4. Quadratic arithmetic program ↩︎ ↩︎

零知识证明从0到1,ZK简介相关推荐

  1. 什么是零知识证明(ZK Proof)?Web2.0通往Web3.0的入口技术

    古老的难题 女:你爱我吗? 男:爱! 女:怎么证明? 男:-- 零知识证明的定义 零知识证明(Zero-Knowledge Proof)也叫做最小泄露证明,能充分证明自己是某种权益的合法拥有者,又不把 ...

  2. 去中心化数字身份DID简介——四、用户属性的零知识证明

    在上一篇文章中,我们介绍了用户具有多个身份属性时,选择性的把其中的一个属性暴露出来,而不会造成其他信息的暴露.更进一步的情况,某些时候我们只需要验证用户的年龄达到多少岁,或者小于多少岁,但是并不关心用 ...

  3. PrivacyIN Week2 | 张宇鹏博导开讲经典零知识证明协议设计原理

    前言 隐私研究院[PrivacyIN]第一期ZK训练营课程精讲内容上线,本期课堂邀请到美国德州农工大学(Texas A&M University)计算机科学与工程学院的助理教授张宇鹏,主要介绍 ...

  4. 零知识证明经典文献大汇总(可收藏)

    从去年的DAO经典到更早的NFT经典(以及在此之前是最初的加密经典). 本文, 为那些寻求理解.深入和构建零知识的人挑选了一组资源:强大的基础技术,这些基础技术掌握着区块链可扩展性的关键,代表着隐私应 ...

  5. 零知识扑克牌游戏开发教程【ZK Poker】

    零知识证明是实现去中心化的一个重要工具.当平台透明存储数据时 我们应当如何保证隐私?当为了扩容而引入链下交易时,我们如何在 链上进行验证?零知识证明在解决这些问题时可以发挥重要的作用. 这个教程的目的 ...

  6. 零知识证明实践教程,第三部分

    本文是零知识证明简单实践教程的第三部分, 第一部分见:零知识证明第一部分, 第二部分见:零知识证明第二部分. 下面这个图片是我们在第二部分所使用的merkle树来构造prover的承诺.同时我们也提出 ...

  7. 使用 zk-SNARK 的可编程零知识证明:第 1 部分

    理论上,可以为任何数学问题构建零知识证明 (ZKP),而无需揭示此解决方案.在实践中,为一个问题开发 ZKP 通常需要发明一种全新的密码算法.它没有标准配方,需要广泛而深入的密码学知识.例如,零知识谜 ...

  8. 基于circom、snarkjs实现零知识证明不透漏具体地理位置的区域监控

    目录 第一章 背景 第二章 开发准备 环境安装 第三章 计算和证明 1. 设计电路 2. 编译电路 3. 设计输入 4. 计算获得证据(Computing the witness) 5. 证明电路(P ...

  9. 零知识证明学习资源汇总

    本文将继续会持续进行更新,更新后的版本将在 Github 和知乎上发布,欢迎关注. Github 地址:https://github.com/sec-bit/learning-zkp/blob/mas ...

最新文章

  1. oracle解锁system密码,Oracle System密码忘记 密码修改、删除账号锁定lock
  2. 用户界面设计准则从何而来
  3. 递归的效率问题及递归与循环比较
  4. Netty 中 IOException: Connection reset by peer 与 java.nio.channels.ClosedChannelException: null
  5. bios uefi legacy_重装系统时,如何判断启动方式Legacy/UEFI,你知道吗
  6. python集合运算_python set集合的基本运算
  7. android常用地图坐标转换
  8. 网线的交叉线和直通线原理
  9. 网站使用QQ互联接入第三方登录,实现qq快捷登录网站的功能
  10. 读博不得不明白的深刻道理
  11. html 各浏览器兼容性
  12. 多租户SaaS管理系统框架设计:多租户,多组织,用户区别
  13. 软件推荐:强力卸载软件HIBIT
  14. html语言中的双冒号,css单冒号和双冒号用法和区别
  15. 抽奖动画 - lao虎机抽奖,手把手教你做一个抽奖机软件
  16. 控制工程实践(4)——线性控制系统的稳态误差(之一)
  17. 狂奔与内卷并存,自嗨锅、莫小仙们如何寻找“破局之道”?
  18. 阿里云视觉智能平台高校学生专访|臧家河:疫情在家,我的视觉AI实践之旅
  19. 无懈可击的web设计
  20. Altium Designer 19.1.18 - 更改铺铜的透明度

热门文章

  1. canvas实战之酷炫背景动画(三)
  2. 2021年中国股票市场成交情况、政策调整与股票市场异常波动及政策建议分析[图]
  3. 虾皮马来西亚热销产品有哪些?
  4. 牛逼哄哄的富士康老板郭台铭低头了,夏普将向三星供应液晶面板
  5. DeepMind 最新发文:AlphaZero 的黑箱打开了
  6. 将本地的项目导入到github仓库总结lxw
  7. (干货)一文了解导航电子地图领域有哪些前沿热点技术
  8. do while循环语句的学习以及练习
  9. 苹果手机的隐藏功能分享
  10. 数组面试题-大力出奇迹?