# Tornado Cash是如何工作的？

在深入通俗理解Tornado Cash的使用教程前，以下是协议全面运作的总体概况。

### Tornado.Cash功能的全面概述

为了实现隐私，Tornado.Cash **使用智能合约来接受来自一个地址的代币存款，并允许他们从另一个地址提款**。这些智能合约作为混合所有已存资产的池。

一旦从这些池中通过一个全新的地址提取资金，来源地址和目的地址之间的链上关联就会断开。因此，被提取的加密资产是匿名的。

虽然代币在 Tornado Cash池中，但保管权仍掌握在用户手中。因此，用户可以完全控制他们的代币。

**对于传统的 Tornado Cash 固定金额池：**

* • 当用户将资金存入池（也称为存款）时，会生成私人票据。此私人票据用作用户稍后访问这些资金的私人密钥。要提取资金，用户可以使用不同的地址 - 旧地址或新地址 - 并通过此私人票据提取资金。

**对于Tornado Cash Nova，新的ETH池具有任意数量和隐蔽转账：**

* 资金直接链接到给定的钱包地址。没有私人票据或密钥。用户可以连接到指定的地址来访问他们的资金。
* 资金托管是通过将代币存入池中或通过从已注册到Nova的账户隐蔽转账来获得的。

这种协议的优势自然来自它的用户数量和池的大小。存入池中的用户越多越好。但是，为了保护隐私和匿名性，用户必须牢记一些基本规则，例如：

* 提款时使用中继器支付gas；
* 在存款和取款操作之间留有充足的时间间隔；
* 通过等待几笔交易再提取资产，将其资金与其它人的资金混合一起。

_更多的窍门可以在这找到：_[_保持匿名的窍门_](tips-to-remain-anonymous.md)_。_

### zk-SNARK和哈希过程的贡献

Tornado.Cash使用零知识简洁的非互动知识论证(也称为zk-SNARK)，以验证和允许交易。

来处理一笔存款，Tornado Cash生成一个随机的字节区域，通过[Pederson哈希](https://iden3-docs.readthedocs.io/en/latest/iden3\_repos/research/publications/zkproof-standards-workshop-2/pedersen-hash/pedersen.html) （因为它与zk-SNARK更友好）， 计算它，然后将代币和20 mimc哈希发送到智能合约。然后合同将把它插入到Merkle树中。

为了处理提款，相同区域的字节被分成两个独立的部分：一边是**secret**，另一边是**nullifier** 。nullifier被散列。这个nullifier是链上发送的公共输入，用于用智能合约和Merkle树数据进行检查。例如，它避免了双重支付。

多亏了zk-SNARK，可以在不透露任何信息的情况下证明20 mimc哈希的初始承诺和nullifier。即使nullifier是公开的，隐私性也会得到维护，因为没有办法将散列的nullifier关联到初始承诺。此外，即使交易的信息存在于Merkle根中，关于确切的Merkle路径的信息，即交易的位置，仍然是保密的。

从技术角度来看，存款是简单的，但在gas方面昂贵，因为他们需要计算20 mimc哈希和更新Merkle树。相反，提款过程很复杂，但成本更低，因为只有进行nullifier哈希和零知识证明才需要使用gas。

_编写_ [_@ayefda_](https://torn.community/u/ayefda)
