编译器

A Vamp-IR -IR算术电路指南

详细介绍 Vamp-IR 中间表示和算术电路的设计,为零知识证明提供高效编译支持。

算术电路概念入门

> 关于算术电路的概念入门。我们将探讨算术电路是什么,它们用于什么目的,有哪些与之工作的工具,包括我们 Anoma 在此处开发的工具,以及我们如何使用这些工具来处理电路。

这篇博客旨在介绍算术电路的概念入门,随着零知识证明的普及,这一概念近来备受关注。我们将探讨算术电路是什么,它们用于什么目的,有哪些与之工作的工具,包括我们 Anoma 在此处开发的工具,以及我们如何使用这些工具来处理电路。

算术电路是什么

算术电路源自一个名为“计算复杂性理论”(CCT)的研究领域,并作为计算多项式的标准模型。算术电路是一个抽象概念,但其运作方式类似于逻辑电路:它将变量和数字作为输入,这些输入会经过“加法”或“乘法”等算术门,如下面的图像所示。红色方框是输入变量,灰色八边形是常数,绿色圆圈是运算门,右侧的蓝色方框是输出。

像这样的算术电路可以连接到其他算术电路,在这种情况下,一个电路的输出成为另一个电路的输入,而电路本身可以被视为“门”。在 CCT 中,算术电路用于推理计算多项式的复杂性。最近,它们在“计算证明”的某个相邻领域中获得了极大的流行,而其目前最大的实际应用是零知识证明和特别地,zkSNARKS。

Anoma 中的算术电路

Anoma 的核心是高度注重隐私。这就是为什么我们的许多研究和开发都围绕零知识工具包和同态密码系统展开,这些都与算术电路密切相关。

本文将帮助我们处理算术电路的两个主要工具是 Vamp-IR,一种针对算术电路的、与目标无关的内部表示(IR)语言;以及 Alucard,一种基于 Common Lisp 的用于编写算术电路的 DSL。

Vamp-IR 可以通俗地描述为算术电路的"LLVM"。它并不是为了让人们直接编写 Vamp-IR 代码或执行 Vamp-IR 代码而设计的。相反,其他语言(如 Alucard 或 Juvix)可以编译成 Vamp-IR,而 Vamp-IR 可以进一步编译成各种目标(例如 Plonkup 或 Bellman)。

当我们说 Vamp-IR 是目标无关的,我们指的是它旨在仅捕获电路的意图,而不向任何特定的证明系统或任何具体的约束系统做出让步,Vamp-IR 代码可以进一步编译成这些系统。这样,用 Vamp-IR 编写的电路可以编译成 R1CS 或 QAP、普通的 Plonk、带查找的 Plonk、带自定义门的 Plonk 或任何其他约束系统。

在这篇博客文章中,我们将使用 Alucard 编写电路,Alucard 是我们专门为编写零知识证明和算术电路而设计的自研语言。它正处于积极开发中,并且已经相当功能丰富:你可以在 Emacs 或 VS Code 中舒适地编写 Alucard 代码,同时享受 REPL、语法高亮、调试和编译成 Vamp-IR 的功能。你可以通过[这个链接了解更多关于 Alucard 的信息](https://github.com/anoma/alucard)。

详情查看[https://anoma.net/research/a-vamp-irs-guide-to-arithmetic-circuits-and-perfectly-boiled-eggs]