您好!刚知道Zcash吗?
Zcash网络很年轻,但发展迅速! 注册以后我们将与您联系告知有关如何开始使用Zcash的更多信息!

语言

解释 SNARKs 第六部分: 匹诺曹协议

Ariel Gabizon | May 10, 2017

<< 第五部分

在第五部分中,我们看到了 Alice 为 Bob 验证声明的过程使如何被翻译成一个 "语言多项式" 的,它被称为二次运算程序 (QAP)。

在本部分中,我们将展示 Alice 如何发送一个短证明给 Bob来验证她对于 QAP 的成真指派。 我们将使用 Parno, Howell, Gentry 和 Raykova 的 匹诺曹协议。但是先让我们回忆一下我们上次给出的 QAP 的定义:

一个二次算数程序 \(Q\),有 阶数 |d| *和尺寸 \(m\) ,它由多项式 \(L_1,\ldots,L_m\), \(R_1,\ldots,R_m\), \(O_1,\ldots,O_m\) 组成,并且有一个目标多项式 \(T\) 阶数\(d\)

一个赋值操作 \((c_1,\ldots,c_m)\) 满足 \(Q\) 如果,定义 \(L:=\sum_{i=1}^m c_i\cdot L_i, R:=\sum_{i=1}^m c_i\cdot R_i, O:=\sum_{i=1}^m c_i\cdot O_i\) 并且 \(P:=L\cdot R -O\), 我们得到 \(T\) 可以整除 \(P\)

正如我们在第 5 本分中看到的,Alice 通常希望来验证她有一个成真指派来处理一些额外的限制,比如 \(c_m=7\); 但是我们在这里出于简便考虑将其忽略,并显示如何验证 某些 成真指派。

如果 Alice 有一个成真指派,这意味着根据之前定义的 \(L,R,O,P\),这里存在一个多项式 \(H\) 使得 \(P=H\cdot T\) 成立。特别的,对于任意 \(s\in\mathbb{F}_p\),我们有 \(P(s)=H(s)\cdot T(s)\)

假设现在 ALice 没有 一个成真指派,但是她现在依然根据一些非成真指派 \((c_1,\ldots,c_m)\) 建立了 \(L,R,O,P\) 。这时我们得到保证 \(T\) 无法整除 \(P\)。这意味着对于任意多项式 \(H\) ,同时多项式中最高的阶数为 \(d\)\(P\)\(H\cdot T\) 将是不同的多项式。注意到 \(P\)\(H\cdot T\) 中的最高阶数为 \(2d\)

现在我们可以使用著名的 Schwartz-Zippel Lemma ,它告诉我们两个阶数不同的多项式,如果在 \(2d\) 点可以取到相同的值,则它们在 \(2d\) 点的 \(s\in\mathbb{F}_p\) 也相同。因此,如果 \(p\)\(2d\) 大很多,则很有可能 \(P(s)=H(s)\cdot T(s)\),因为随机取值的 \(s\in\mathbb{F}_p\) 非常小。

这表明接下来的协议草案可以测试 ALice 是否有一个成真指派。

  1. Alice 选择多项式 \(L,R,O,H\) 的最高阶数为 \(d\)
  2. Bob 随机选择一个点 \(s\in\mathbb{F}_p\),并且计算 \(E(T(s))\)
  3. Alice 发送给 Bob 这些多项式在 \(s\) 点的 隐藏值,比如 \(E(L(s)),E(R(s)),E(O(s)),E(H(s))\)
  4. Bob 检查目标多项式是否在 \(s\) 处收敛。也就是说,他会检查是否有 \(E(L(s)\cdot R(s)-O(s))=E(T(s)\cdot H(s))\) 等式成立。

接下来,如果 ALice 没有一个成真指派,她将最终使用一个与等式不相成立多项式,也因此并没有得到 \(s\) 的大多数选择。因此,Bob 在这种情况下有很高的概率会拒绝选择 \(s\)

现在问题是,我们是否有工具来实施这种设计。其中的关键点是 Alice 必须选择她将要使用的多项式,且在 直到 \(s\) 的前提下。但是,这正是我们要解决的问题 可验证的盲评价协议,这些已经在第 2-4 部分中讨论过了。

考虑到我们已经具备了这些知识,在把这个构想变成 zk-SNARK 之前,我们需要确定四个关键问题。我们将在本部分中解决其中两个,而另外两个将在下一部分中讨论。

确认 Alice 根据一个赋值选择她的多项式

这是一个要点:如果 Alice 没有一个满意的赋值,这并不意味着她不能找到 任何 \(L,R,O,H\) 多项式,这些多项式在 \(d\) 点处有 \(L\cdot R-O=T\cdot H\),它仅意味着她不能找到 \(L,R\)\(O\) 都是 由赋值产生的 一类多项式,也就是,对于 相同的 \((c_1,\ldots,c_m)\)\(L:=\sum_{i=1}^m c_i\cdot L_i, R:=\sum_{i=1}^m c_i\cdot R_i, O:=\sum_{i=1}^m c_i\cdot O_i\)

在第四部分中的协议仅仅保证了她在相同的度上使用了相同的多项式 \(L,R,O\),但并不保证它们是由赋值产生的。这就是一个使正式的证明变的模糊的点,也是我们的方案解决的不够清晰的点。

让我们用以下的方法将多项式组 \(L,R,O\) 结合入同一多项式 \(F\)

\(F=L+X^{d+1}\cdot R+X^{2(d+1)}\cdot O\)

使用 \(R\) 乘以 \(X^{d+1}\) 和 使用 \(O\) 乘以 \(X^{2(d+1)}\) 的目的是 \(L,R,O\) 的系数在 \(F\) 中 “不会被混用”:在 \(F\)\(1,X,\ldots,X^d\) 的系数是 \(L\) 的精确系数,下一个 \(d+1\)\(X^{d+1},\ldots,X^{2d+1}\) 中的系数是 \(R\) 的精确系数,而最后一个 \(d+1\) 的系数是 \(O\).

让我们使用相似的方式在 QAP 的定义中结合多项式,为每一个 \(i\in \{1,\ldots,m\}\) 定义一个多项式 \(F_i\),它的第一个 \(d+1\) 的系数是 \(L_i\) 的系数,之后跟随的系数是 \(R_i\)\(O_i\)。也就是说,对于每一个 \(i\in \{1,\ldots,m\}\) ,我们都定义了多项式。

\(F_i=L_i+X^{d+1}\cdot R_i+X^{2(d+1)}\cdot O_i\)

注意到,当我们将 \(F_i\) 中的 \(L_i\), \(R_i\), 和 \(O_i\) 的其中两个“分别相加”时,比如,\(F_1+F_2 = (L_1+L_2)+X^{d+1}\cdot (R_1+R_2)+X^{2(d+1)}\cdot(O_1+O_2)\)

更概括的,假设对于某些 \((c_1,\ldots,c_m)\) 我们有 \(F=\sum_{i=1}^mc_i\cdot F_i\) 。而对于相同的系数 \((c_1,\ldots,c_m)\),我们将得到 \(L=\sum_{i=1}^m c_i\cdot L_i, R=\sum_{i=1}^m c_i\cdot R_i, O=\sum_{i=1}^m c_i\cdot O_i\)。 换句话来说,如果 \(F\)\(F_i\) 的线性组合,这意味着 \(L,R,O\) 确实是有赋值产生的结果。

因此,Bob 将询问 Alice 来验证 \(F\) 是否是 \(F_i\) 的线性组合。 这样的做法与评价可验证的协议相类似:

Bob 选择一个随机的 \(\beta\in\mathbb{F}^*_p\),并且将隐藏的部分 \(E(\beta\cdot F_1(s)),\ldots,E(\beta\cdot F_m(s))\) 发送给 Alice。他这是向 Alice 索取 \(E(\beta\cdot F(s))\) 元素。如果她成功了,随之会产生一个拓展版本的 知识系数假设,这个证据按时她知道如何编写 \(F_i\) 的线性组合 \(F\)

添加零知识部分 - 隐藏赋值

在一份 zk-SNARK 中,Alice 想要隐藏所有有关她赋值的信息。然而,隐藏的 \(E(L(s)),E(R(s)),E(O(s)),E(H(s))\) 确实包含了 某些 赋值信息。

比如,对于某些其他的满意赋值 \((c'_1,\ldots,c'_m)\),Bob 可以计算出对应的 \(L',R',O',H'\) 和隐藏的 \(E(L'(s)),E(R'(s)),E(O'(s)),E(H'(s))\)。如果这些与 Alice 的隐藏值不相同,他就可以推断出 \((c'_1,\ldots,c'_m)\) 不是 Alice 的赋值。

为了避免在她的赋值操作中的信息泄露,Alice 将通过为每一个多项式添加一个 "随机的 \(T\)-转移" 的方式来隐藏她的赋值操作。 那就是,她随机地选择 \(\delta_1,\delta_2,\delta_3\in\mathbb{F}^*_p\) 并且定义 \(L_z:=L+\delta_1\cdot T,R_z:=R+\delta_2\cdot T,O_z:=O+\delta_3\cdot T\)

假设 \(L,R,O\) 是由满意赋值产生的;因此,对于某些 \(H\)\(L\cdot R-O = T\cdot H\) 。由于我们刚刚在各处添加了 \(T\)\(T\) 同样可以整除 \(L_z\cdot R_z-O_z\)。 让我们做一些计算来看看:

\(L_z\cdot R_z-O_z = (L+\delta_1\cdot T)(R+\delta_2\cdot T) - O-\delta_3\cdot T\) \(= (L\cdot R-O) + L\cdot \delta_2\cdot T + \delta_1\cdot T\cdot R + \delta_1\delta_2\cdot T^2 - \delta_3\cdot T\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\) \(=T\cdot (H+L\cdot \delta_2 + \delta_1\cdot R + \delta_1 \delta_2\cdot T)\)

因此,定义 \(H'=H+L\cdot\delta_2 + \delta_1\cdot R + \delta_1\delta_2\cdot T\),我们有 \(L_z\cdot R_z-O_z=T\cdot H_z\)。 因此,如果 Alice 使用多项式 \(L_z,R_z,O_z,H_z\) 而不是 \(L,R,O,H\),Bob 将接受这笔交易。

在另一方面,这些多项式使用 \(T(s)\neq 0\) 评价了 \(s\in\mathbb{F}_p\) (它们几乎全都是 \(d\)\(s\)),这并不会揭露赋值的相关信息。比如,由于 \(T(s)\) 非零且 \(\delta_1\) 随机, \(\delta_1\cdot T(s)\) 是一个随机值,并且因此 \(L_z(s)=L(s)+\delta_1\cdot T(s)\) 并不会揭露 \(L(s)\) 的任何信息,这是由于随机价值所掩盖的。

下一次会有什么内容?

我们已经展示了匹诺曹协议的设计,从中了解了 Alice 可以向 Bob 证实她拥有一个对于 QAP 的满意赋值,并且不需要揭露赋值的内容。然而,在获得 zk-SNARK 之前还有两个重要的问题需要提前解决:

  • 在这份草案中,Bob 需要一个"支持乘法"的 HH。比如,他需要计算 \(E(H(s)\cdot T(s))\) from \(E(H(s))\)\(E(T(s))\)。然而,我们目前并没有看到任何一个HH 可以实现这个方法的例子。我们仅仅看到了一个 HH 可以支持加法和线性组合。
  • 贯穿整个系列,我们已经讨论了 Alice 和 Bob 之间的 互动 协议。我们最终的目标,是让 Alice 发送单独的信息 非交互式证明,它同时是 公开可验证的 - 这意味着任何看到这个单独的信息证明的人,将能够确信它的有效性,而不仅仅是 Bob (他之前和 Alice 交流过)。

这些问题都能够通过配对椭圆曲线的方法解决,我们将在接下来和最后的部分中加以说明。

cryptography, zkSNARKs, explainers | 查看所有标签