电路
Tornado.cash 前端背后有许多 Circom 电路,它们为 Tornado.cash 用户提供基本的隐私保障。这些电路实现了 零知识协议,Tornado.cash 的智能合约可以与之交互,以证明用户存款的声明,例如该存款有效、尚未被提取,以及在匿名挖矿的背景下,一张纸币的存款交易和提取交易之间存在的区块数量。
ZK 电路的工作原理
SNARK 和 GROTH16
在尝试了解 Tornado.cash 的底层工作原理之前,您首先需要了解零知识电路、它们的构造方式以及如何在客户端生成证明,然后在链上进行验证。虽然 ZK 系统有 几种不同类型,但 Tornado.cash 依赖于一种称为“简洁非交互式知识论证”(SNARK) 的变体,具体来说是一种称为 GROTH16 的变体。
Circom 和 snarkjs
因为我们并非都是 Vitalik,所以最好有一些简单的工具来抽象这些复杂多项式承诺的生成和执行。这就是 Circom 和 snarkjs 发挥作用的地方。
Circom 最容易被认为是一种电路语言的编译器,它的作用非常类似于电气工程师用来描述电路的那种 硬件描述语言。只不过我们描述的不是电路,而是算术电路,它包含组件以及它们连接在一起的方式。
编译 Circom 电路时,生成的输出是 R1CS 约束系统 和 Wasm 可执行文件,将用于生成 见证。
R1CS
要理解 R1CS(Rank-1 约束系统),当然需要更多的数学知识。而重要的密码系统数学,可以参阅 Vitalik 的帖子。
R1CS 是三个向量组 (a, b, c)(a,b,c) 的序列,并且 R1CS 的解是向量 ,其中 必须满足方程 . a * s . b - s 。 c = 0s.a∗s.b−s.c=0,其中..表示点积 - 简单来说,如果我们将aa和ss“合并在一起”,将两个值在相同的位置相乘,然后取这些乘积的总和,然后对bbandss和然后cc和ss执行相同的操作,则第三个结果等于前两个结果的乘积。下一步是将此 R1CS 转换为 QAP 形式,它实现了完全相同的逻辑,只是使用多项式而不是点积......现在我们可以通过对多项式进行点积检查来同时检查所有约束,而不是单独检查 R1CS 中的约束。如果我们尝试伪造我们从中得出此 QAP 解决方案的 R1CS 解决方案中的任何变量 - 比如,将最后一个设置为 31 而不是 30,那么我们得到的 attpolynomial 将无法通过其中一项检查。
简而言之,R1CS 是一组多项式约束,电路生成的任何证明都必须满足这些约束。这些约束是 由 Circom 根据电路设计中各种“信号”和操作之间的关系生成的。
见证人
现在,根据您使用 Tornado.cash 的目的,您可能不需要任何见证人。但是,不用担心,如果一切正常,您与 Tornado.cash 交互的所有见证人都将被积极压缩,并且它们的主体将按照您的意愿处理。
在 SNARK 电路的上下文中,见证人是需要根据电路设计从电路输入生成的一组值,以满足电路施加的所有约束。您可以将 Circom 生成的见证生成器视为电路特定的解压缩函数,该函数将您的输入通过电路运行,并快照沿途产生的所有各种中间值。
通过从您的输入生成的这种扩展形式,您知道必须将哪些值分配给 R1CS 指定的约束才能构建有效的证明。
证明
当您想到“证明”时,您可能会想象它是某事为真的无可辩驳的保证。然而,在 SNARK 的背景下,“证明”实际上代表了某事几乎肯定为真的_论据_。如果我们尝试将解决方案传输到电路施加的每个多项式约束,我们最终会得到比我们简单地证明电路中的中间状态值之间存在某些类型的关系大几个数量级的证明。
对于任何给定的电路,具有足够计算能力的人都有可能以畸形的方式生成满足电路约束的证明,但这在难度上大致相当于分解大素数。
因此,在为 SNARK 电路生成证明时,您要计算给定输入的电路中间状态(见证生成),然后计算输入、中间状态和电路输出之间的关系。
一旦您有满足必要约束集的证明,您就可以发布该证明以及输入和输出的某些子集(又称公共信号)。了解 R1CS、您的公共信号、您的证明和电路的证明密钥后,任何人都可以验证您的证明是否满足 R1CS,以及您的公共信号是否与您的证明相符。
电路
在充分了解 ZK 证明电路后,让我们深入研究 Tornado.cash 如何使用一些相对简单的电路,使您能够私下且无需许可地隐藏公共区块链网络上存款和取款交易之间的关系,然后在稍后证明有关存款和取款之间关系的事情(例如,您在取款前等待了多长时间)。
Tornado.cash 最好理解为具有两个独立的主要组件。
核心存款电路
核心存款电路是大多数用户与之交互的电路,证明用户已创建代表某些相应资产面额存款的承诺,他们尚未提取该资产,并且他们知道在生成初始承诺时提供的秘密。
匿名挖矿
匿名挖矿电路构成了匿名挖矿计划的基础,该计划激励用户将存款留在合约中更长时间,以确保 Tornado.cash 存款池维持大量活跃存款(从而增加其他用户的 k-匿名性)。
Last updated