本文介绍了如何使用zkSNARK(如Plonk)构建算术电路来进行零知识证明,特别是范围证明和集合成员证明。通过具体的例子,展示了如何将数学表达式转化为电路,并讨论了其中的技术和挑战。
这是关于加密技术的一系列更大文章的一部分。如果这是你第一次接触这篇文章,我强烈建议你从系列的开始开始。
在理论解释之后,是时候进入更实用的内容了!
在今天的文章中,我想专注于一些简单的例子,说明我们如何使用 zkSNARK,例如 Plonk,来证明一些声明。因此,我们基本上是在 构建一些算术电路。
我认为没有比重新审视 区间证明 更好的开始了!让我们直接进入主题。
在我们不算简短地看过 Bulletproofs 之后,我们看到从零开始构建一个区间证明是多么困难。但现在,我们手头有了一些新玩意儿。正如我们所承诺的,我们将看一下如何构建一个算术电路以表示这个声明:
存在一个有效的 N 位表示形式来表示一个数 v
构建这样一个电路可以让我们使用 Plonk 证明所述数字 v 的知识!那么让我们再次试着把这放入方程中。
事实上,这就是我们之前描述的同一个系统 我们之前说过。因此,接下来的描述将有些简化——我建议参考之前的解释以获得更多细节!
如果我们的数字 v 可以用 N 位表示,这意味着它有一些有效的二进制表示:
反过来,这些数字应该满足这个方程:
我们还知道我们的所有输入都将在一个大小为 q 的 有限域 中:
无论是 v 还是 bᵢ 都将是我们电路的输入——因此,我们需要某种方式来证明 bᵢ 值是 比特(要么 0 要么 1)。我们可以通过以下检查来做到这一点:
对于每一个 N 位。
太好了!我们有了系统……但我们如何将其转化为算术电路?特别是,我们需要能够表示 减法,但我们只能使用 加法 和 乘法 门。该怎么办呢?
嗯……
好吧,在处理 有限域 时,有一个 加法逆元 的概念!想象一下 减去 1,相当于 加上 -1。但是,当然, -1 不是我们域中的元素:
那么这如何帮助我们呢?你看,就像我们说当结果大于 q - 1 时,加法会 循环到 集的 开头,同样,当结果小于 0 时,减法也会 循环到 集的 末尾。
实际上,发生的事情是,我们可以通过使用 取模操作 将 -1 映射到该集合中:
你可能会看到这被表示为 -1 ≡ q - 1 (mod q)。这称为同余关系,它表示“-1 在模 q 的情况下与 q - 1 相等”。
总而言之,加上 q - 1 的效果与 减去 1 完全相同!
这对于加法 群 而言也是有效的。
现在我们知道如何进行减法,我们可以构建我们电路!
首先,我们必须检查 bᵢ 是一个比特。这可以通过以下方式完成:
这表示 bᵢ(bᵢ — 1)。如果 bᵢ 是一个比特(要么 0 或者 1),输出应该为 0。
当然,如果我们将所有这些检查的输出相加,结果值也应该为 0。
然后,我们需要表示每个比特乘以...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!