
1. 为什么 Tornado Cash 是理解 ZK 的最佳案例?
Tornado Cash为代表的隐私项目才是真正用到了ZK-SNARK算法的零知识性,而大多数打着ZK旗号的Rollup,用到的只是ZK-SNARK的简洁性。很多时候人们往往混淆了Validity Proof与ZK的区别,而Tornado Cash恰好是理解ZK应用的极佳案例。
零知识证明在区块链中有两种使用场景:
- 隐私保护:在不泄露交易细节(交易双方地址、交易余额)的情况下证明区块链上的资产转移是有效的
- 扩容:利用ZK技术节省链上计算空间
目前ZK技术在区块链行业中应用最广泛的是ZK Rollup(以太坊Layer2解决方案),这主要是扩容场景的利用。而隐私保护场景的集大成者正是Tornado Cash。
想了解更多关于Tornado Cash与zk-SNARK的技术细节,可以阅读我们的文章:Tornado Cash 与 zk-SNARK。
2. Tornado Cash 的技术架构
Tornado Cash使用零知识简洁非交互式知识论证(zk-SNARK)来验证和允许交易,具体使用的是GROTH16变体。
Tornado Cash的后端依赖一系列Circom电路来实现核心隐私保证。这些电路实现了零知识协议,智能合约通过该协议来验证关于用户存款的声明:例如存款是否有效、是否已被提取等。
想深入了解Tornado Cash的Circom电路设计,可以阅读我们的文章:龙卷风币核心电路与隐私保护实战指南。
3. 核心电路:存款与提款
存款过程
Tornado Cash生成一个随机字节区域,通过Pedersen Hash(对zk-SNARK更友好)计算,然后将代币和20 MiMC哈希发送到智能合约,合约将其插入Merkle树。
存款在技术上相对简单,但Gas费用较高,因为需要计算20 MiMC哈希并更新Merkle树。
提款过程
同一份随机字节区域被拆分成secret和nullifier两部分。nullifier被哈希后作为公开输入发送到链上验证,防止双花攻击。通过zk-SNARK,可以在不泄露任何信息的情况下证明初始承诺和nullifier的20 MiMC哈希。
提款过程在技术上更复杂,但Gas费用更低,因为链上只需要nullifier哈希和零知识证明。

4. Merkle 树与零知识证明的结合
Tornado Cash的所有存款记录都存进了链上构造的一棵Merkle Tree,作为其最底层的叶子结点。
要证明「我在Tornado资金池里存过款」可以被转化为「我的存款记录可以在Tornado合约里找到」。取款者证明自己曾用密钥生成了存款记录里的某个记录,但通过ZK不泄露具体是哪一个。
想深入了解Merkle Tree的详细技术原理,可以阅读我们的文章:Merkle Tree 与 zk-SNARKs 协同工作。
5. 为什么说这是「最精妙的 ZK 应用」?
Tornado Cash是一个玻璃箱,混杂了很多人放进去的Coin硬币。我们能看到放Coin的是哪些人,但这些Coin高度同质化,如果有生面孔的人从玻璃箱拿走一枚Coin,我们很难知道他拿走的Coin最初是谁放进去的。
零知识证明本身实现了隐私保护——外界只知道取款人的确往资金池里存过款,但不知道他对应哪个存款者。这正是zk-SNARK算法「零知识性」最纯粹的体现。
💡 常见疑问解答
Tornado Cash为什么被称为最精妙的ZK应用?
Tornado Cash真正用到了ZK-SNARK算法的零知识性——用户可以向智能合约证明存过款,同时不透露是哪一笔存款。而大多数ZK Rollup只用到了ZK-SNARK的简洁性(Validity Proof)。
Tornado Cash使用的具体ZK方案是什么?
Tornado Cash使用零知识简洁非交互式知识论证(zk-SNARK),具体使用的是GROTH16变体,后端依赖Circom电路来实现核心隐私保证。
Tornado Cash如何实现存款和提款?
存款时生成随机字节区域通过Pedersen Hash计算,将代币和20 MiMC哈希发送到合约插入Merkle树。提款时将随机字节拆分为secret和nullifier,nullifier哈希作为公开输入防止双花,通过zk-SNARK在链上验证。
为什么提款Gas费用比存款低?
存款需要计算20 MiMC哈希并更新Merkle树,Gas费用较高。提款链上只需要nullifier哈希和零知识证明验证,Gas费用更低。
