Tornado.Cash 以太坊混币器

Tornado.cash 在 Goerli 测试网上有部署,因此测试时切换到 Georli 测试网即可:

图片

首先先进行存款操作,成功之后,需要留“凭证”,浏览器会自动保存这个凭证到本地的txt文件,该凭证需要提款的时候用:

图片

后续在提款时,只需要输入这个凭证和提款地址,即可把币提出来。

那么为什么tornado可以混币呢?原理图如下:

图片

用户所有的动作都与Proxy合约交互,最终所有的存款操作都流入到tornadoCash.eth池子合约中;当用户提款时,tornadoProxy会内部调用tornado.eth池子合约给用户发起转账。

所以,从外部角度来看,用户的钱转给了TornadoProxy,而提款逻辑中,用户的钱都从池子合约中流出,并且流出的金额都是等值的,通过这种手段来混淆交易(让存款和取款的关系对应不上)。

举例说明,比如地址A存入100ETH,然后提到另一个地址B,如果不用混币器,那么A->B转账的交易就会被追踪分析了;如果是使用TornadoCash,资金链变成了:

图片

因此达到了混淆资金流向的目的。当TornadoCash的用户越多,用户提币时间、提币地址越混杂,分析难度就越高。

存款逻辑

存款的交互交易如下:

https://goerli.etherscan.io/tx/0x39a08fd3adbfea863720fa678bf4f172603e9afc42598726db8362182e67919a

调用了合约的deposit方法,value中指定充值ETH数额:

图片

decode 之后如下:

图片

并且会执行一个内部交易,向第一个参数的地址转移这个ETH:

图片

第一个参数也是tornado.cash的合约(在主网上又称为Tornado.eth1合约),合约的地址(instance)写死在智能合约中,可以看到如果是存ETH对应了四个合约地址,这里用ENS表示:

图片

这里的eth-01:代表存入0.1ETH对应的合约地址,eth-1对应存入1ETH对应的转账合约地址,以此类推。存款的逻辑如下:

1. 用户和TornadoProxy合约的deposit函数交互

2. TornadoProxy合约发起内部交易,将用户的钱转到tornadocash.eth合约中

图片

因此我们通过查看Tornadocash.eth1合约的内部交易就会发现,只要是TornadoCashProxy合约发起的,这个内部交易就是用户入金触发的。

图片图片

取款逻辑

取款的时候需要提供存款时生成的一个密钥,每次存款成功都会生成一个,用户在连接到Dapp后也能看到:

图片

提款界面需要提供这个凭证,以及填写想要转到哪个币地址中:

图片

提款之后,提款的交易hash会直接显示出来:

图片

https://goerli.etherscan.io/tx/0x74c8b0b20d54bbf32091fb6ad9f0bc9d7907fd6e70180f55cc8c166db5dd242f

https://goerli.etherscan.io/tx/0x02e7d380b38d1de1d62fe51ec728542b58504bab31ad7eb3903783562a1ab85c

本质上是与Proxy合约的withdraw函数进行交互:

图片

参数如下:

图片

提款交易会派生出两个内部交易,分别为提币到目标地址、手续费:

图片图片

如何追踪

以下内容是来自:

  • 如果一笔取款交易紧跟着一笔存款交易发生,那么这两笔交易就很有可能来自同一个人。我们建议用户在存入资金之后,等待其他人存入几笔资金,然后再考虑要不要取款。

  • 如果某个地址发起多次存款,而另一个地址多次发起同样资金规模的取款交易,则这些交易很可能是有关联的。如果你希望多次取款,请尝试打乱资金数额并取出到互不关联的多个地址。

  • 存入资金后,记得等待一段时间。即便在你之后已有躲避存入资金的交易,它们也很有可能来自同一个人、TA 试图通过发送大量交易来欺骗用户,让用户相信匿名集已经很大,但实际并非如此(也就是所谓的 “女巫攻击”)译者注:在 Tornado.cash 及类似的混币器解决方案中,都有一个匿名集的概念,就是混币资金池中资金来源的多样性,资金来源越多,外部观察者越难跟踪并将交易跟某个身份关联起来,用户的隐私性就越强)。我们建议你至少等待 24 小时,以保证在你存入和取出之间有足够多不同的参与者都在合约中存入了资金。使用 Tornado.cash 时记得看看旁边的统计信息。

  • 你要是总在所在时区的同一时间段存钱和取钱,也会削弱你的匿名性。一个简单的办法是尽可能打乱存取款的时间,甚至分散到一天的 24 小时中。

  • Tornado.cash 的统计数据中显示的匿名集大小就是存入给定实例的资金总额。实际上,匿名集大小可能会因为各种各样神奇、难以概括的链外因素而下降,比如,某个人可能用推特发了一条关于自己的隐蔽交易的信息——这就意味着该笔交易不再匿名了,匿名集变小了。就跟所有其它用户自己取消匿名性的情况一样,TA 的存款对大家的匿名性没有任何贡献。因此,不要公开自己存款的数额、数据和时间(尤其是取款交易的),这不仅仅是在保护你自己,也是在保护所有 Tornado.cash 的用户。

总结一下,我们可以得出针对混币器的资金追踪方案:

(1)收集所有转到Tornado的地址和金额,进行金额聚合。

  • 只需要分析TornadoCashProxy合约关联的deposit交易即可

(2)收集所有从Tornado转出的目的地址和金额,进行金额聚合

  • 只需要分析TornadoCashProxy合约关联的withdraw交易即可

(3)对比1、2的结果,比如地址A -> TornadoCash存入200ETH,同时又监控到同一个临近时间段,又有一个地址B接收了TornadoCash 200ETH的资金,那么有理由相信A和B可能有某种关联(当然也存在某种程度的误差)。

下一章:Tornado.cash 原理

区块链从设计上并不是完全匿名的,充其量是伪匿名的。任何一个人或者组织可以轻而易举的创建一个 Hash 账户并参与校验,虽然这样的账户不会与个人进行一一对应,但由于交易的公开性、任何人都可以在公共账本上追踪你的 ...