零知识

由于验证者能够从证明者发送的数据中提取未知多项式 \(p(x)\) 的知识,我们就来看一下这些被提供的值(也就是证明):\(g^p, g^{p'}, g^h\)。它们参与了下面的验证:

$$g^p = \left(g^h\right)^{t(s)} \text{(多项式 $p(x)$ 有根 $t(x)$)}$$

$$\left(g^p\right)^\alpha = g^{p'} \text{(使用了正确形式的多项式)}$$

问题是我们如何改变证明可以使检查仍然有效,但无法提取任何知识?前面的章节给了我们一个答案:我们可以使用随机值 \(\delta\)(Delta)来「移位」这些值,例如 \(\left(g^{p}\right)^\delta\)。现在,为了提取知识,首先需要找到无法得知的值 \(\delta\)。此外,这种随机化在统计学上与随机值无法区分。

为了保持这种关系,我们在验证者的检查中验证一下。等式的每一边都有一个证明者提供的值。所以如果我们用同一个 \(\delta\) 来「移位」每一个值,那么等式一定保持相等。

具体来讲,就是证明者选择一个随机值 \(\delta\),并使用它对证明中的值进行求幂 \(\left(g^{p(s)}\right)^\delta\),\(\left(g^{h(s)}\right)^\delta\),\(\left(g^{\alpha p(s)}\right)^\delta\),然后提供验证内容给验证者:

$$\left(g^p\right)^\delta = \left(\left(g^h\right)^\delta\right)^{t(s)}$$

$$\left(\left(g^p\right)^\delta\right)^\alpha = \left(g^{p'}\right)^\delta$$

再合并一下我们就可以看到校验的等式依然成立:

$$g^{\delta \cdot p} = g^{\delta \cdot t(s) h}$$

$$g^{\delta \cdot \alpha p} = g^{\delta \cdot p'}$$

注:零知识可以轻而易举地融入到这个结构之中,这通常也被称为「无成本」的零知识。

译者注:借助这个「无成本」的技巧,就可以轻松实现零知识了。但是这里实现零知识的方法和实际中的 Pinocchio 协议还有 Groth16 方案略有不同。实际方案中是用乘法乘以 \(g^{δ \cdot t(s)}\)。