Source: https://rareskills.io/zh-cn/post/circom-intro

Circom 是一种用于创建一阶约束系统(R1CS)并填充该 R1CS 见证向量(witness vector)的编程语言。

R1CS 格式之所以备受关注,是因为该格式在构建 SNARKs(尤其是 Groth16 )方面非常有用。借助 SNARKs,我们能够实现可验证计算,从而允许我们证明计算的正确性。在验证时,利益相关方为了确认正确性所消耗的计算量,要比他们亲自执行该计算所需的计算量少得多。而且还可以生成证明而不泄露底层数据,在这种情况下,我们将其称为 zkSNARKs。

我们 ZK 书籍的第一部分重点介绍了如何证明给定 R1CS 的见证(witness)的有效性。而本资源则侧重于如何以编程方式生成 R1CS,以及如何设计它们以模拟真实的算法,例如虚拟机或密码学哈希函数。

前置知识

我们希望读者已经熟悉我们 ZK 书籍中的以下章节:

我们将假设读者知道 R1CS 是什么及其代表的含义。上述四章已对此进行了全面解释。

使用 Circom 并不需要完全理解 ZK 背后的数学原理,但必须完全掌握某些核心原则,否则 Circom 将变得难以理解。

尽管如此,如果读者确实希望在 ZK 领域发展职业生涯,学习 ZK 的基础知识是必不可少的。为此,我们强烈建议通读 ZK book 的前两部分,并从零开始构建 Groth16 证明系统以巩固所学。

然而,如果读者的目标是快速了解 ZK 应用程序,那么我们建议先阅读上面列出的四章内容,然后再使用本资源。

Circom 为什么存在

Circom 的创建是为了解决为 SNARKs 开发约束系统时的两个主要问题。

  1. 手动设计约束系统既繁琐又容易出错,尤其是在处理大规模或重复性约束时。
  2. 填充见证(witness)同样具有挑战性,需要手动计算原本可以通过编程方式推导出的中间值。

因此,Circom 实现了:1) 简化约束设计;2) 自动填充见证。

1. 设计约束系统十分繁琐