> For the complete documentation index, see [llms.txt](https://docs-zh.tornadoeth.cash/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs-zh.tornadoeth.cash/tornado-cash-classic/dian-lu.md).

# 电路

Tornado.cash 前端背后是许多[Circom](https://docs.circom.io/)电路，它们为 Tornado.cash 用户提供基本的隐私保障。这些电路实现了[零知识协议](https://en.wikipedia.org/wiki/Zero-knowledge_proof)，Tornado.cash 的智能合约可以与之交互，以证明用户存款的声明，例如该存款有效、尚未被提取，以及在匿名挖矿的情况下，一张纸币的存款交易和提取交易之间存在的区块数量。

## ZK 电路的工作原理 <a href="#how-zk-circuits-work" id="how-zk-circuits-work"></a>

**SNARKs 和 GROTH16**

在尝试了解 Tornado.cash 的底层工作原理之前，您首先需要了解零知识电路、它们的构造方式以及如何在客户端生成证明，然后在链上进行验证。虽然有几种不同类型的[ZK](https://en.wikipedia.org/wiki/Zero-knowledge_proof#Zero_knowledge_types)系统，但 Tornado.cash 依赖于一种称为“简洁非交互式知识论证”（SNARK）的变体，具体来说是一种称为 GROTH16 的变体。

## **Circom 和 snarkjs**

因为我们并非都是 Vitalik，所以最好有一些简单的工具来抽象这些复杂多项式承诺的生成和执行。这就是[Circom](https://docs.circom.io/)和[snarkjs 的](https://github.com/iden3/snarkjs)作用所在。

Circom 最容易被看作是一种电路语言的编译器，它的作用非常类似于电子工程师用来描述电路的[硬件描述语言。只不过我们描述的不是电路，而是](https://en.wikipedia.org/wiki/Hardware_description_language)**算术电路**，它包含组件以及它们连接在一起的方式。

当你编译 Circom 电路时，最终的输出是一个[R1CS 约束系统](https://docs.circom.io/background/background/)和一个[Wasm](https://en.wikipedia.org/wiki/WebAssembly)可执行文件，后者将用于生成[见证](https://docs.circom.io/background/background/)。

## **R1CS**

要理解 R1CS（Rank-1 约束系统），当然需要更多的数学知识[。Vitalik 的一篇文章](https://medium.com/@VitalikButerin/quadratic-arithmetic-programs-from-zero-to-hero-f6d558cea649#5539)介绍了重要的密码系统数学。

> R1CS 是三个向量组 (a, b, c)(a,b,c) 的序列，并且 R1CS 的解是向量 ，其中 必须满足方程 . a \* s . b - s 。 c = 0s.a∗sb−sc=0，其中...表示点积——简单地说，如果我们将aa和ss“合并”在一起，在相同的位置上将两个值相乘，然后对这些乘积求和，然后对bbandss和然后cc和ss执行相同操作，则第三个结果等于前两个结果的乘积。下一步是将这个 R1CS 转换成 QAP 形式，它实现了完全相同的逻辑，只是使用多项式而不是点积......现在我们可以通过对多项式进行点积检查，同时检查所有约束，而不是单独检查 R1CS 中的约束。如果我们试图伪造我们从中得出此 QAP 解决方案的 R1CS 解决方案中的任何变量——比如，将最后一个设置为 31 而不是 30，那么我们就会得到一个未通过其中一项检查的 att多项式。

简而言之，R1CS 是一组多项式约束，任何电路生成的证明都必须满足这些约束。这些约束[由 Circom](https://docs.circom.io/circom-language/constraint-generation/)根据电路设计中各种“信号”和操作之间的关系生成。

## **证人**

现在，根据您使用 Tornado.cash 的目的，您可能不需要任何见证人。但是，不用担心，如果一切正常，您与 Tornado.cash 交互的所有见证人都将被大力压缩，并按照您的意愿处理他们的尸体。

在 SNARK 电路中，见证是根据电路设计从电路输入生成的一组值，以满足电路施加的所有约束。您可以将 Circom 生成的见证生成器视为电路特定的解压缩函数，该函数将您的输入通过电路运行，并快照沿途产生的所有各种中间值。

通过从您的输入生成的扩展形式，您知道必须将哪些值分配给 R1CS 指定的约束才能构建有效的证明。

## **证明**

当你想到“证明”时，你可能会想象它是某事为真的无可辩驳的保证。然而，在 SNARK 的背景下，“证明”实际上代表了某事*几乎肯定*为真的*论据*。如果我们试图将解决方案传输到电路施加的每个多项式约束，我们最终会得到比我们简单地证明电路中中间状态值之间存在某些关系大几个数量级的证明。

对于任何给定的电路，具有足够计算能力的人都有可能以畸形的方式生成满足电路约束的证明，但这在难度上大致相当于[分解大素数](https://en.wikipedia.org/wiki/RSA_Factoring_Challenge)。

因此，在为 SNARK 电路生成证明时，您需要根据给定输入（见证生成）计算电路的中间状态，然后计算输入、中间状态和电路输出之间的关系。

一旦您有证据证明您已满足必要的约束条件，您就可以发布该证明以及您的输入和输出的某些子集（也称为公共信号）。了解 R1CS、您的公共信号、您的证明和电路的证明密钥后，任何人都可以验证您的证明是否满足 R1CS，并且您的公共信号是否与您的证明相符。

#### 电路 <a href="#circuits" id="circuits"></a>

在充分了解了 ZK 证明电路之后，让我们深入研究一下 Tornado.cash 如何使用一些相对简单的电路，让您在公共区块链网络上私下且无需许可地隐藏存款和取款交易之间的关系，然后在以后证明您的存款和取款之间*的*关系（例如，您在取款之前等待了多长时间）。

[Tornado.cash](https://tornadoeth.cash/)最好被理解为有两个独立的主要组件。

## **核心存款电路**

核心存款电路是大多数用户交互的，证明用户已经创建了代表存入某些相应资产面额的承诺，他们尚未提取该资产，并且他们知道在生成初始承诺时提供的秘密。

[核心存款电路](/tornado-cash-classic/dian-lu/he-xin-cun-kuan-dian-lu.md)

## **匿名挖矿**

匿名挖矿电路构成了匿名挖矿计划的基础，该计划激励用户将存款在合约中保留更长时间，以确保 Tornado.cash 存款池维持大量活跃存款（从而增加其他用户的 k 匿名性[）](https://en.wikipedia.org/wiki/K-anonymity)。
