Home Tornado设计
Post
Cancel

Tornado设计

Tornado 是什么

Tornado 是一个去中心化的混币器,用来匿名传送加密货币。

什么是混币器?混币器是为了匿名传送加密货币,一般在区块链上交易货币,都是可以查到货币的来源和目标地址的。混币器通过将多人的交易混合在一起,交易中的来源和目标地址不再是简单的一一对应关系,而是多对多的关系。这样就算知道目标地址获得了货币,也不知道货币的来源地址是什么。

混币器的分类?有中心化的和非中心化的。中心化的一般是依靠区块链外的第三方机构,交易信息和货币会先发给第三方,由第三方将多笔混淆之后在发送给区块链。好处是实现很简单,坏处是不安全,第三方可能作恶或者泄漏交易信息。去中心化的一般是通过一些技术手段,直接在链上处理交易,也能达到匿名的目的。

Tornado 在以太坊上就是一个普通的智能合约,只不过合约内应用了一些譬如零知识证明等技术手段。

另外,想做到链上交易的匿名,除了 Tornado 这种类似链上附加的方式来做,还可以在链本身做,比如 Zcash。

混币器保护了用户的隐私,但也常常被用来洗黑钱。今年 8 月,美国财政部外国资产控制办公室(OFAC)制裁了 Tornado Cash,将 Tornado 相关的 38 个以太坊地址添加到“特别指定国民”名单中,禁止美国实体及个人与其交互。同时 GitHub 也删除了 Tornado 所有代码,封禁了所有给 Tornado 贡献过代码的账号(不过现在又恢复了,参考第一个链接)。

Tornado 设计的核心

角色:

  • user。货币交易的参与者,包括发送货币和接受货币的。
  • relayer。可选的角色,如果想更高的匿名性,那么可以将所有交易发送给 relayer,然后 relayer 以自己的名义发送交易到链上。
  • contract。以太坊上的 Tornado 合约。

其他:

  • Prove 和 Verify。零知识证明的流程,括号内元素为需要的输入参数。

deposit 存入货币

假设准备发送货币的是用户 A。用户 A 先随机选择两个数,一个是 k(nullifier),一个是 r(secret),这两个数类似于取款密码的作用,然后对两个数拼接后做哈希,的到 commitment(后面会用到)。

1
为什么是两个数?如果只是作为密码,那么一个 r 就够了,Tornado 是为了防止多次提款,所以加入了另一个数 k,在后面取款流程中,如果成功会记录 k 的哈希在合约内,以后如果重复取款,就会发现。

用户 A 发送 deposit 交易到 Tornado 的链上合约内(假设没有 relayer),参数包括 commitment 和要存入的货币。

1
这里要存入的货币,是有一定限制的。在 Tornado 的合约内,是包含几个货币池子的,有 0.1、1、10、100 ETH 几种。分池子就是为了匿名,比如 1 ETH 池子内都是一个个的 1 ETH 大小的待取货币,你存了一个,我存了一个,放到池子里就分不出来了。如果你存了 1.1,我存了 1.2,那么放到一起,还是能分出来。

那么合约收到 deposit 的交易后会做什么呢?合约会检查对应池子的默克尔树,如果有空位,那么就将 commitment 插入到空位,然后重新计算对应的默克尔树,将旧的 merkle root 记录在合约的 merkle root history 内,新的 merkle root 和 commitment 对应的 merkle path,返回给用户。

withdraw 提取货币

假设提取货币的是用户 B,B 需要从 A 那要几样东西才能提取货币:

  • 零知识证明 Prove。这个 Prove 的计算公式如图中所示,是为了“证明我知道 secret 和 nullifier 是什么,但是不告诉你具体的数值“,另外还指定了要将货币提取给哪个地址和手续费(如有)。
  • merkle root。包含上一步存入的 commitment 的默克尔树根。
    1
    
    merkle root 的选择,有点技巧,如果直接用上一步返回的,那么就能将 root 和 commitment 联系起来,因为每次存入 commitment,root 都会变,那么在 withdraw 的时候提供的 root 就可以定位到 commitment,这个肯定是不行的。所以这里是包含 commitment 的就可以,因为合约状态是公开的,所以肯定是可以找到这样的 root。
    
  • nullifier hash。nullifier 的哈希。用来防治重复提币。

B 构建一个 withdraw 的交易发送到 Tornado 合约,参数包含 Prove、root、nullifer hash、address、fee 等。

合约会在 merkle root history 里确定存在参数提到的 root,然后进行零知识证明的 Verify 流程,如果通过代表有资格提取,但是还没完,还要将 nullifier hash 在合约内的 hash list 内进行查找,如果存在代表是重复提现,那么就中止了,如果不存在,那么合约会将 fee 发送到 relayer 地址,将剩余的 (N - fee) ETH 给参数中的接收地址 address,同时在合约的 nullifier hash list 内记录这笔交易的 nullifier hash。

安全提示

官方的文档里还介绍了一些安全提示,挺好的,这里就直接翻译下贴在这里:

  • Using Relayer or not, you still need to keep up common Internet anonymity like using vpn, proxies, Tor in order to hide the IP address you act from. Since you are using browser an Incognito Tab feature is also useful.
    1
    
    使用 VPN、代理、Tor 等方式来保护自己的 IP。
    
  • Make sure you clear cookies for dapps before using your new address, because if a dapp sees both old and new address with the same cookies it will know that addresses are from the same owner.
    1
    
    清理自己的浏览器 cookies。
    
  • The note contains data that can be used to link your deposit with withdraw. It is a good idea to make sure that your note data is securely destroyed after the withdrawal is complete.
    1
    
    清理电脑缓存数据。
    
  • Wait until there are a few deposits after yours. If your deposit and withdrawal are right next to each other, the observer can guess that this might be the same person. We recommend waiting until there are at least 5 deposits
    1
    
    等你的 deposit 后面又增加了几个别人的 deposit 后,再提现。
    
  • Wait until some time has passed after your deposit. Even if there are multiple deposits after yours they all might be made by the same person that is trying to spam deposits and make user falsely believe that there is a large anonymity set. We recommend waiting at least 24h to make sure that there were deposits made by multiple people during that time.
    1
    
    最好还要多等一段时间,比如 24 小时。
    

一些想法

关于技术

Tornado 的设计简单有效,从设计思想和受欢迎程度上都看得出来,“简单有效”或许才是真正搞技术的人的追求,而搞营销的人追求的是复杂难懂,同时不可避免的漏洞百出。。

关于人文

Tornado 作为一个开源的项目,又是部署在公链上,貌似没有人可以干涉它的运行,实际上呢,看看美国对它的制裁吧。所处的环境,使用的人,都是受限的,就没有真正自由的软件,根不是自由的,叶子就不会是自由的。

参考

https://github.com/tornadocash/tornado-core

https://tornado.cash/audits/TornadoCash_whitepaper_v1.4.pdf

https://tornado-cash.medium.com/introducing-private-transactions-on-ethereum-now-42ee915babe0

https://mirror.xyz/qiwihui.eth/vvAVr6a5bFxehzz5kyRG0p5e_xSM61e9RaYgjVMNbCU

This post is licensed under CC BY 4.0 by the author.
Contents