复制成功

分享至

主页 > Web3.0 >

零知识证明编程——用Circom、Groth16构建证明及验证

2024.09.04

来源:登链社区

为工作程序员提供的 ZKP 教程介绍。

你知道为什么斑马有条纹吗?一种理论是这是一种伪装。当斑马聚集在一起时,这使得狮子更难以区分它们的猎物。狮子必须将猎物从群体中隔离出来才能追捕它[^1]。

人类也喜欢在人群中隐藏。一个具体的例子是,当多个人在一个集体名称下作为一个整体行动时。《联邦党人文集》就是这样创作的[^2]。 另一个例子是 Bourbaki,这是 1930 年代一群法国数学家的集体笔名。这导致了现代数学大部分内容的彻底重写,重点在于严谨性和公理化方法[^3]。

零知识证明编程——用Circom、Groth16构建证明及验证
Bourbaki Congress

在数字时代,假设你在一个群聊中,想要发送一条有争议的信息。你想证明你是其中的一员,而不透露是哪一位。我们如何在数字领域使用密码学来做到这一点?我们可以使用一种叫做 群签名 的东西。

从传统上讲,群签名在数学上相当复杂且难以实现。然而,使用零知识证明(ZKP),这个数学问题变成了一个简单的编程任务。在本文结束时,你将能够自己编写群签名。

介绍

这篇文章将向你展示如何从零开始编写基本的零知识证明(ZKP)。

在学习新的技术栈时,我们希望尽快掌握编辑-构建-运行的循环。只有这样,我们才能开始从自己的经验中学习。

我们将首先让你设置环境,编写一个简单的程序,执行所谓的可信设置,然后尽快生成和验证证明。之后,我们将识别一些改进我们程序的方法,实施这些改进并进行测试。在此过程中,我们将建立一个更好的心理模型,以便在实践中编程 ZKP。最后,你将熟悉(某种方式)从零开始编写 ZKP。

我们将逐步构建一个简单的签名方案,你可以证明你发送了特定的消息。你将能够理解这段代码的作用及其原因:

#克隆仓库并运行准备脚本
[email protected]:oskarth/zkintro-tutorial.git
cdzkintro-tutorial

#在执行之前浏览此文件的内容
less./scripts/prepare.sh
./scripts/prepare.sh

我们建议你浏览 ./scripts/prepare.sh 的内容,以查看这将安装什么,或者如果你更喜欢手动安装。执行后,你应该看到 Installation complete 并且没有错误。

如果你遇到问题,请查看最新的官方文档 这里[7]。完成后,你应该安装以下版本(或更高版本):

pragmacircom2.0.0;

templateMultiplier2(){
signalinputa;
signalinputb;
signaloutputc;
c<==a*b;
}

componentmain=Multiplier2();

这就是我们的特殊程序或 _电路_。 [^6] 按行分析:

  • pragma circom 2.0.0; - 定义所使用的 Circom 版本

  • template Multiplier() - 模板是大多数编程语言中对象的等价物,是一种常见的抽象形式

  • signal input a; - 我们的第一个输入,a;输入默认是私有的

  • signal input b; - 我们的第二个输入,b;同样默认是私有的

  • signal output b; - 我们的输出,c;输出始终是公共的

  • c <== a * b; - 这做了两件事:将信号 c 赋值 约束 c 等于 ab 的乘积

  • component main = Multiplier2() - 实例化我们的主组件

  • 最重要的行是 c <== a * b;。这是我们实际声明约束的地方。这个表达式实际上是两个的组合:<--(赋值)和 ===(等式约束)。 [^7] Circom 中的约束只能使用涉及常量、加法或乘法的操作。它强制要求方程的两边必须相等。 [^8]

    关于约束

    约束是如何工作的?在类似数独的上下文中,我们可能会说一个约束是“一个介于 1 和 9 之间的数字”。然而,在 Circom 的上下文中,这不是一个单一的约束,而是我们必须使用一组更简单的等式约束(===)来表达的东西。 [^9]

    为什么会这样?这与底层的数学原理有关。从根本上讲,大多数 ZKP 使用 _算术电路_,它表示对 多项式 的计算。在处理多项式时,你可以轻松引入常量,将它们相加、相乘并检查它们是否相等。 [^10] 其他操作必须用这些基本操作来表达。你不必详细了解这一点才能编写 ZKP,但了解底层发生的事情可能会很有用。 [^11]

    我们可以将电路可视化如下:

    零知识证明编程——用Circom、Groth16构建证明及验证

    构建我们的电路

    供你参考,最终文件可以在 example1-solution.circom 中找到。有关语法的更多详细信息,请参见 官方文档[9]

    我们可以通过运行以下命令来编译我们的电路:

    零知识证明编程——用Circom、Groth16构建证明及验证

    免责声明:数字资产交易涉及重大风险,本资料不应作为投资决策依据,亦不应被解释为从事投资交易的建议。请确保充分了解所涉及的风险并谨慎投资。OKEx学院仅提供信息参考,不构成任何投资建议,用户一切投资行为与本站无关。

    加⼊OKEx全球社群

    和全球数字资产投资者交流讨论

    扫码加入OKEx社群

    相关推荐

    industry-frontier