零知识证明 - zkSNARK 入门 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BlockHeader
V2EX    推广

零知识证明 - zkSNARK 入门

  •  
  •   BlockHeader 2019-05-01 23:35:57 +08:00 2638 次点击
    这是一个创建于 2403 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网络上讲解零知识证明的文章就不多,这些文章要不太浅显,要不太深入,很少有能给入门者整体框架上的认识。

    比如,阿里巴巴零知识证明就是一个非常好的通俗理解零知识证明的例子:

    阿里巴巴被强盗抓住,为了保命,他需要向强盗证明自己拥有打开石门的密码,同时又不能把密码告诉强盗。他想出一个解决办法,先让强盗离开自己一箭之地,距离足够远让强盗无法听到口令,足够近让阿里巴巴无法在强盗的弓箭下逃生。阿里巴巴就在这个距离下向强盗展示了石门的打开和关闭。

    这个整个过程就是零知识证明,证明者能够在不向验证者提供任何有用信息(石门的口令)的情况下,使验证者相信某个论断(阿里巴巴知道打开石门的方法)是正确的。

    技术人除了通俗的理解零知识证明外,还需要对零知识的理论和推导过程深入理解运用。以太坊的一篇 blog,比较适合想深入理解零知识证明的小伙伴。

    https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/

    这篇文章也是这篇 blog 的翻译和我自己的理解。通过这篇文章,能快速建立零知识证明的逻辑框架。虽然这篇文章有些推导公式,但是相对简单,小伙伴可以耐心阅读。

    先给出零知识证明的逻辑框架:

    图 0

    0 - 零知识证明的基本概念

    零知识证明,zkSNARKzero-knowledge Succint Non-interactive ARguments of Knowledge 的简称:

    • Succinct:证明的数据量比较小
    • Non-interactive:没有或者只有很少交互。
    • ARguments:验证者只对计算能力有限的证明者有效。拥有足够计算能力的证明者可以伪造证明。这也叫“计算可靠性"(相对的还有”完美可靠性")。
    • of Knowledge:对于证明者来说在不知道证据(Witness,比如一个哈希函数的输入或者一个确定 Merkle-tree 节点的路径)的情况下,构造出一组参数和证明是不可能的。

    零知识证明大体由四部分组成:

    • 多项式问题的转化 - 需要证明的问题转化为多项式问题 t(x)h(x) = w(x)v(x),证明者提交证明让验证者确认多项式成立。
    • 随机挑选验证 - 随机选择验证的数值 s,验证 t(s)h(s) = w(s)v(s)。相对于验证多项式相等 t(x)h(x) = w(x)v(x),随机挑选验证,简单,验证数据少。随机挑选验证,安全性肯定不及多项式等式验证,但如果确实足够随机,安全性还是相当高的。
    • 同态隐藏 - 同态隐藏指的是函数的一种特性。输入的计算和输出的计算保持“同态”。以加法同态为例,满足如下的三个条件的函数 E(x),称为加法同态:1. 给定 E(x),很难推导出 x. 2. 不同的输入,对应不同输出 3. E(x+y) 可以由 E(x),E(y)计算出来。乘法同态类似。
    • 零知识 - 证明者和验证者之间除了“问题证明与否”知识外,不知道其他任何知识(不知道随机挑选值,不知道挑选值的多项式计算结果等等)。

    在了解零知识的基础概念上,慢慢推导整个零知识证明过程,先从 NP 问题说起。

    1- NP 问题以及约化

    解决一个问题需要花费时间。如果解决问题需要的时间与问题的规模之间是多项式关系,则可以称该问题具有多项式复杂度。一般问题可分成两类:P 问题NP 问题。P 问题指的是在多项式时间内可解的问题。NP 问题( Non-Deterministic Polynomial Problem,非确定性多项式问题),指不能在多项式内可解,但是可以在多项式时间内验证的问题。

    很显然,P 问题也是 NP 问题,但是是否 NP 问题是 P 问题,NP=P ?,目前为止还没有人能证明。一般认为,NP 问题不等于 P 问题,也就是说,NP 问题不存在多项式解法。

    约化(Reduction),可以理解成问题的转化。对任意一个程序 A 的输入,都能按某种法则变换成程序 B 的输入,使两程序的输出相同,那么,可以说,问题 A 可约化为问题 B。

    NPC 问题,是一个 NP 问题,并且,其他所有的 NP 问题都能归约到它。简单的说,NP 问题之间可以相互归约,一个 NP 问题求解,其他 NP 问题一样能求解。

    举例说明,NP 问题以及 NP 问题的归约。

    布尔公式满足性问题(SAT 问题,boolean formula satisfiability) 就是一个 NP 问题。布尔公式定义如下:

    • 假设变量$x_1$, $x_2$, $x_3$, ... 是布尔公式
    • 假设 f 是布尔公式,$\lnot f$也是布尔公式(取反)
    • 假设 f 和 g 是布尔公式,$f \land g$和$f \lor g$也是布尔公式(与和或)

    一个布尔公式可满足,指输入是 0/1 的情况下,存在输出为真。SAT 问题指,找出所有可满足的布尔公式。SAT 问题看上去,除了枚举一个个可能的布尔公式外,没有更好的办法,也就是多项式时间内不可解。如果知道一个可满足的布尔公式,验证非常方便(输入是 0/1 的情况下,看看输出是否为真)。SAT 问题是 NP 问题。

    再看看另外一个 NP 问题:PolyZero 问题。PolyZero 问题指某个多项式满足:多项式输入是 0 或 1 的情况下,多项式输出为 0。

    $$PolyZero(f) := 1$$

    f 满足输入是 0/1 的情况下,多项式输出为 0。

    一个布尔表达式 f 可以通过如下的归约函数 r,转化为多项式:

    • $$r(x_i) := (1-x_i)$$
    • $$r(\lnot f) := (1-r(f))$$
    • $$r(f \land g) := (1- (1 - r(f))(1 - r(g)))$$
    • $$r(f \lor g) := r(f)r(g)$$

    也就是说,一个 SAT 问题,通过归约函数 r,可以归约为一个 PolyZero 问题:f 是可满足的,当且仅当 r(f)输出为 0。

    $$SAT(f) = PolyZero(r(f))$$

    总结一下,NP 问题是在多项式时间内无解,但是可以多项式时间验证的问题。NP 问题可以相互归约。

    2 - QSP 问题

    需要证明的问题,肯定是 NP 问题,如果是 P 问题,不存在问题解的”寻找“,也就不存在证明。简单的说,zkSNARK 问题处理的都是 NP 问题。既然 NP 问题相互可以归约,首先需要确定一个 NP 问题,其他 NP 问题都可以归约到这个 NP 问题,再进行证明。也就是,证明了一个 NP 问题,就可以证明所有 NP 问题。

    QSP 问题是个 NP 问题,也特别适合 zkSNARK。为啥特别适合,目前还不需要深究。有相关的论文论证: https://eprint.iacr.org/2012/215.pdf

    QSP 问题是这样一个 NP 问题:给定一系列的多项式,以及给定一个目标多项式,找出多项式的组合能整除目标多项式。输入为$n$位的 QSP 问题定义如下:

    • 给定多个多项式:$v_0, ... , v_m, w_0, ... , w_m$
    • 目标多项式:$t$
    • 映射函数:$f: \left{(i, j) |1\leq i \leq n, j\in{0,1} \right} \to \left{1, ... m\right}$

    给定一个证据( Witness ) u,满足如下条件,即可验证 u 是 QSP 问题的解:

    • $$a_k, b_k = 1\ \ 如果 k = f(i, u[i])$$
    • $$a_k, b_k = 0\ \ 如果 k = f(i, 1- u[i])$$
    • $$v_aw_b 能整除\ t,其中 v_a = v_0 + a_1v_1 + ... + a_mv_m, w_b = w_0 + b_1w_1+ ... + b_mw_m$$

    对一个证据 u,对每一位进行两次映射计算($u[i]$以及$1-u[i]$),确定多项式之间的系数。因为针对证据 u 的每一位,计算两次,确定多项式之间的系数,如果$2n < m$,多项式的选择还是有很大的灵活性。

    如果证明者知道 QSP 问题的解,需要提供证据(也就是 u )。验证者在获知证据 u 的情况下,按照上述的规则恢复出多项式的系数,验证$v_av_b$是否能整除$t$:$th=v_aw_b$。为了方便验证者验证,证明者可以同时提供$h$。在多项式维度比较大的情况下,多项式的乘法还是比较复杂的。

    有个简单的想法,与其验证者验证整个多项式是否相等,不如随机挑选数值进行验证。假设验证者随机挑选验证数值 s,验证者只需要验证$t(s)h(s)=v_a(s)w_b(s)$。

    以上是基础知识,下面开始介绍 zkSNARK 的证明过程。在继续深入一个 QSP 问题证明细节之前,先看看一个多项式问题的证明过程。

    3 - 多项式问题的证明过程

    假设一个多项式$f(x)=a_0+a_1x+a_2x^2+ ... + a_{d-1}x^{d-1}+a_dx^d$。证明一个多项式,即给定一个输入$x$,提供$f(x)$的证明。

    3.1 有线群论基础(椭圆曲线)

    定一个有限群,生成元是$g$,阶为$n$,则该群包括如下的元素:$g^0,g^1,g^2, ... ,g^{n-1}$。通过有限群加密的方式很简单:$E(x) := g^x$。也就是说,得知$g^x$的情况下,不能反推出$x$。

    3.2 选定随机数

    验证者随机选择一个有限群中的元素,比如$s$。提供如下的计算结果($s$的不同阶的加密结果):

    $$E(s^0), E(s^1), ... , E(s^d)$$

    在生成这些计算结果后,$s$就不需要了,可以忘记。

    3.3 $E(f(s))$计算

    举个例子,$f(x) = 4 + 2x + 4x^2$,$E(f(s)) = E(s^0)^4E(s^1)^2E(s^2)^4$。显然,$E(f(s))$可以不知道$s$的情况下,通过验证者提供的数据计算出来。

    3.4 $\alpha$对

    注意的是,验证者是不知道待证明的多项式参数的,即使证明者提供了$E(f(s))$,验证者也无法验证。 $\alpha$对的方法可以让验证者确认证明者是通过多项式计算出结果。 在 3.2 的基础上,验证者还随机选择另外一个元素$\alpha$,并提供额外的计算结果:

    $E(\alpha s^0), E(\alpha s^1), ... , E(\alpha s^d)$

    证明者需要提供$E(f(s))$和$E(\alpha f(s))$。

    $$E(f(s)) = E(s^0)^4E(s^1)^2E(s^2)^4$$

    $$E(\alpha f(s)) = E(\alpha s^0)^4E(\alpha s^1)^2E(\alpha s^2)^4$$

    3.5 配对函数

    配对函数$e$,满足如下定义:

    $$e(g^x, g^y) = e(g, g)^{xy}$$

    验证者验证$\alpha$对的方式很简单,检验如下的等式是否成立:

    $$e(E(f(s)), g^\alpha) = e(E(\alpha f(s)), g) $$

    假设$A= e(E(f(s)), B=E(\alpha f(s))$推导过程如下:

    $$e(A, g^\alpha) = e(E(f(s)), g^\alpha) = e(g^{f(s)}, g^\alpha) = e(g, g)^{\alpha f(s)}$$

    $$e(B, g) = e(E(\alpha f(s)), g) = e(g^{\alpha f(s)}, g) = e(g, g)^{\alpha f(s)}$$

    到此为止,验证者提供$\alpha$对的情况下,证明者可以证明通过某个多项式计算出某个结果,验证者不知道具体的多项式的参数。

    3.6 $\delta $ 偏移

    更进一步,证明者采用$\delta $ 偏移,甚至不想让验证者知道$E(f(s))$。采用$\delta $ 偏移,证明者不再提供$A$和$B$,而是随机一个$\delta $参数,提供$A'$和$B'$。

    $$A' = E(\delta + f(s)) = g^{\delta + f(s)} = g^\delta g^{f(s)} = E(\delta)E(f(s)) = E(\delta)A$$

    $$B' = E(\alpha (\delta + f(s))) = E(\alpha\delta + \alpha f(s)) = g^{\alpha \delta + \alpha f(s)} = E(\alpha)^\delta E(\alpha f(s)) = E(\alpha)^\delta B$$

    很显然,验证者从$A'$无法推导出$E(f(s))$,但验证者一样能验证$\alpha$对的配对函数是否成立:

    $$e(A', g^\alpha) = e(E(\delta + f(s)), g^\alpha) = e(g^{\delta + f(s)}, g^\alpha) = e(g, g)^{\alpha (\delta + f(s))}$$

    $$e(B, g) = e(E(\alpha (\delta + f(s)), g) = e(g^{\alpha (\delta + f(s))}, g) = e(g, g)^{\alpha (\delta + f(s))}$$

    多项式的整个证明过程如下图所示:

    图 1

    4 - QSP 问题的 skSNARK 证明

    skSNARK 证明过程分为两部分:a) setup 阶段 b )证明阶段。QSP 问题就是给定一系列的多项式$v_0, ..., v_m, w_0, ..., w_m$以及目标多项式$t$,证明存在一个证据$u$。这些多项式中的最高阶为$d$。

    4.1 setup 和 CRS

    CRS - Common Reference String,也就是预先 setup 的公开信息。在选定$s$和$\alpha$的情况下,发布如下信息:

    • $s$和$\alpha$的计算结果

      $$E(s^0), E(s^1), ... , E(s^d)$$

      $E(\alpha s^0), E(\alpha s^1), ... , E(\alpha s^d)$

    • 多项式的$\alpha$对的计算结果 $$E(t(s)), E(\alpha t(s))$$

      $$E(v_0(s)), ... E(v_m(s)), E(\alpha v_0(s)), ..., E(\alpha v_m(s))$$

      $$E(w_0(s)), ... E(w_m(s)), E(\alpha w_0(s)), ..., E(\alpha w_m(s))$$

    • 多项式的$\beta_v, \beta_w, \gamma$参数的计算结果

      $$E(\gamma), E(\beta_v\gamma), E(\beta_w\gamma)$$

      $$E(\beta_vv_1(s)), ... , E(\beta_vv_m(s))$$

      $$E(\beta_ww_1(s)), ... , E(\beta_ww_m(s))$$

      $$E(\beta_vt(s)), E(\beta_wt(s))$$

    4.2 证明者提供证据

    在 QSP 的映射函数中,如果$2n < m$,$1, ..., m$中有些数字没有映射到。这些没有映射到的数字组成$I_{free}$,并定义($k$为未映射到的数字):

    $$v_free}(x) = \sum_k a_kv_k(x)$$

    证明者需提供的证据如下

    • $$V_{free} := E(v_{free}(s)), \ W := E(w(s)), \ H := E(h(s)),$$
    • $$V_{free}' := E(\alpha v_{free}(s)), W' := E(\alpha w(s)), H' := E(\alpha h(s)), $$
    • $$Y := E(\beta_vv_{free}(s) + \beta_ww(s))$$

    $V_{free}/V_{free}', W/W', H/H'$是$\alpha$对,用以验证$v_{free},w,h$是否是多项式形式。$t$是已知,公开的,毋需验证。$Y$用来确保$v_{free}(s)$和$w(s)$的计算采用一致的参数。

    4.3 验证者验证

    在 QSP 的映射函数中,如果$2n < m$,$1, ..., m$中所有映射到的数字作为组成系数组成的二项式定义为(和$v_{free}$互补):

    $$v_{in}(x) = \sum_k a_kv_k(x)$$

    验证者需要验证如下的等式是否成立:

    • $$e(V_{free}', g) = e(V_{free}, g^\alpha), e(W', E(1)) = e(W, E(\alpha)), e(H', E(1)) = e(H, E(\alpha))$$
    • $$e(E(\gamma), Y) = e(E(\beta_v\gamma), V_{free})e(E(\beta_w\gamma), W)$$
    • $$e(E(v_0(s))E(v_{in}(s))V_{free}, E(w_0(s))W) = e(H, E(t(s)))$$

    第一个(系列)等式验证$V_{free}/V'_{free}, W/W', H/H'$是否是$\alpha$对。

    第二个等式验证$V_{free}$和$W$的计算采用一致的参数。因为$v_{free}$和 w 都是二项式,它们的和也同样是一个多项式,所以采用$\gamma$参数进行确认。证明过程如下:

    $$e(E(\gamma), Y) = e(E(\gamma), E(\beta_vv_{free}(s) + \beta_ww(s))) = e(g, g)^{\gamma(\beta_vv_{free}(s) + \beta_ww(s))}$$

    $$e(E(\beta_v\gamma), V_{free})e(E(\beta_w\gamma), W) = e(E(\beta_v\gamma), E(v_{free}(s)))e(E(\beta_w\gamma), E(w(s))) = e(g,g)^{(\beta_v\gamma)v_{free}(s)}e(g,g)^{(\beta_w\gamma)w(s)} = e(g, g)^{\gamma(\beta_vv_{free}(s) + \beta_ww(s))}$$

    第三个等式验证$v(s)w(s) = h(s)t(s)$,其中$v_0(s)+v_{in}(s)+v_{free}(s) = v(s)$。

    简单的说,逻辑是确认$v, w, h$是多项式,并且$v,w$采用同样的参数,满足$v(s)w(s) = h(s)t(s)$。

    到目前为止,整个 QSP 的 zkSNARK 的证明过程逻辑已见雏形:

    图 2

    4.4 $\delta $ 偏移

    为了进一步“隐藏” $V_{free}$和$W$,额外需要采用两个偏移: $\delta_{free}和\delta_w$。 $v_{free}(s)/w(s)/h(s)$进行如下的变形,验证者用同样的逻辑验证。

    $$v_{free}(s) \rightarrow v_{free}(s) + \delta_{free}t(s)$$  $$w(s) \rightarrow w(s) + \delta_wt(s)$$  $$h(s) \rightarrow h(s)+\delta_{free}(w_0(s) + w(s)) + \delta_w(v_0(s) + v_{in}(s) + v_{free}(s)) + (\delta_{free}\delta_w)t(s)$$

    至此,zkSNARK 的推导逻辑就基本完整。使用 zkSNARK 证明,由如下的几步组成:

    1/ 问题转化: 一个需要证明的 NP 问题转化为选定的 NP 问题(比如 QSP 问题)

    2/ 设置参数( setup ):设置参数的过程也是挑选随机数的过程,并提供 CRS

    3/ 证明者获取证据 u,通过 CRS 计算证据( proof )

    4/ 验证者验证证据以及响应的 proof

    总结:零知识证明由四部分组成:多项式问题的转化,随机挑选验证,同态隐藏以及零知识。需要零知识证明的问题先转化为特定的 NP 问题,挑选随机数,设置参数,公布 CRS。证明者,在求得证据的情况下,通过 CRS 计算出证据。验证者再无需其他知识的情况下可以进行验证。

    8 条回复    2019-05-06 19:57:15 +08:00
    BlockHeader
        1
    BlockHeader  
    OP
       2019-05-01 23:36:50 +08:00
    现在还不能贴图

    可以关注 公众号 “星想法”,看图。谢谢。
    32556188w
        2
    32556188w  
       2019-05-01 23:45:34 +08:00
    @BlockHeader 哇,可以加入你们不~嘿嘿
    BlockHeader
        3
    BlockHeader  
    OP
       2019-05-01 23:53:37 +08:00
    @32556188w 哈哈,私聊,私聊。
    geelaw
        4
    geelaw  
       2019-05-02 00:07:20 +08:00
    错误连篇,或者说使用了另一种语言(很多词语的含义和主流接受含义不同),而且最重要的关键概念也没有解释什么叫做“零知识”,如何刻画这一性质?这在历史上是一个 non-trivial 问题。
    lance6716
        5
    lance6716  
       2019-05-02 00:19:06 +08:00via Android
    @geelaw 大佬,有没有面向密码学专业以外的,零知识证明的博文推荐
    ryd994
        6
    ryd994  
       2019-05-02 13:56:10 +08:00 via Android   1
    @Livid 这个人所有文章都是推广数字币
    BlockHeader
        7
    BlockHeader  
    OP
       2019-05-06 19:56:33 +08:00
    @geelaw 你好,我们交流一下。哪里错误连篇?谢谢。
    BlockHeader
        8
    BlockHeader  
    OP
       2019-05-06 19:57:15 +08:00
    @ryd994 我的哪些文章推广数字币了?我只是写写区块链的技术而已。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2714 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 06:54 PVG 14:54 LAX 22:54 JFK 01:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86