区块链网QKLW.COM记者报道:本文为加密货币研究和宣传机构CoinCenter 8月25日发表的关于Tornado Cash工作机制的文章,作者为Alex Wade,Michael Lewellen和Peter Van Valkenburgh。
2022年8月,美国财政部外国资产控制办公室 (OFAC) 制裁了Tornado Cash,将45个以太坊地址添加到受制裁者的特别指定国民 ( Specially Designated Nationals,SDN) 名单中。
本文档旨在帮助读者了解Tornado Cash是什么、它是如何运作的,以及究竟是什么受到了制裁。但在我们进入Tornado Cash之前,让我们回顾一下以太坊、智能合约和去中心化的一些关键概念。
以太坊是一个合作运行的、全球性的、透明的数据库。通过共同努力,来自世界各地的参与者维护了以太坊地址的公共记录,其中包括用户帐户和智能合约应用程序。这些记录像现代台式计算机的用户帐户和软件一起工作,除了以太坊是:
合作运行:以太坊的基本运作来自其全球参与者的集体努力。没有任何一方可以改变以太坊的运作方式。
可公开访问:世界上任何地方的任何人都可以与以太坊、其用户及其应用程序进行交互。
透明:世界上任何地方的任何人都可以下载和查看以太坊数据库中的所有信息。
任何人都可以成为以太坊的用户。创建帐户很简单,不需要电话号码、电子邮件或实际地址。取而代之的是,用户安装一个名为“钱包”的应用程序,该应用程序会为该用户生成一个称为“地址”的唯一标识符和一个称为“私钥”用于身份验证的类似密码的字符串。就像一个拥有多个电子邮件地址的人一样,以太坊的用户可以根据需要创建和使用任意数量的地址。然而,与电子邮件不同的是,以太坊的用户并不是传统意义上的“客户”。他们是在开源软件上运行的全球计算系统的参与者,该软件在没有第三方监督的情况下运行。同样重要的是要注意,由同一用户控制的以太坊地址不一定彼此公开链接;它们只是属于拥有相应私钥的用户的惟一标识符。
通过分享地址,用户可以从世界任何地方的任何人那里接收代币(例如像以太币这样的加密资产)。与传统的支付服务不同,在以太坊上发送和接收代币不需要中介。相反,发送者广播他们转移代币的意图,使用相应的私钥对他们的消息进行数学签名,以太坊网络用新的余额共同更新发送者和接收者地址的全局记录。在此过程中,第三方不会保管被转移的代币。
除了发送和接收代币之外,用户帐户还可以与智能合约交互,智能合约是扩展以太坊功能的应用程序。当开发人员编写智能合约时,他们决定智能合约将支持哪些操作以及这些操作必须遵循哪些规则。这些规则和操作是使用广播到以太坊网络的代码编写的,就像上面描述的代币转账一样。一旦将智能合约的代码添加到以太坊的记录中,它就会收到一个唯一的地址,并且任何用户都可以与之交互以自动执行它支持的规则和操作。
从本质上讲,智能合约是任何人都可以部署到以太坊的开源应用程序。就像以太坊的其他部分一样,任何人都可以在任何地方查看和使用智能合约,而无需依赖中介。
人和智能合约都可以拥有以太坊地址;关键区别在于,当一个人拥有地址时,他们拥有控制发送到该地址的任何代币的私钥。该人最终将决定是否以及何时使用这些代币进行任何交易。当智能合约有地址时,写在智能合约代码中的规则和操作控制代币。它们可以是简单的规则(例如自动发回代币),或者更复杂的规则。可能存在包括人工操作和人工决策的规则(例如如果这些人为控制的地址中有5个发送签名消息表示他们同意,则将代币发回)。然而,这些规则也可能完全和永久地不受任何人的控制。在这种情况下,发送到该地址的任何令牌也是如此,直到或除非合同根据规则将它们送回给某些人。
默认情况下,智能合约是不可变的,这意味着一旦部署,任何人都无法删除或更新它们。智能合约的开发人员可以(在合约代码中)包含更新功能的能力作为支持的操作(例如,这个人工控制的地址可以在未来重写合约)。但是,这样的操作必须在智能合约部署之前包含在智能合约的代码中(即发布到以太坊网络)。如果在部署之前不包含可更新性,任何人都无法修改智能合约。也可以通过将更新功能的权限转移到没有相应私钥的占位符(placeholder)以太坊地址来撤销更新功能的能力。这个占位符被称为“零地址”。一旦更新合约的能力被撤销,它就不能被收回,合约也不能再被改变。
与传统金融不同,以太坊的记录是完全透明的:任何人都可以下载和查看其用户账户的余额和交易历史。尽管用户地址是假名的,但如果真实世界的身份与用户地址相关联,则可以追踪该用户的完整财务历史。以太坊的透明度对于可审计性很重要(例如验证记录更新是否有效)。然而,这种透明性也让用户难以保护自己的个人信息。默认情况下,今天的偶然交易记录(例如在机场支付Wi-Fi费用)直接指向早期交易记录,其中可能包括同一用户很久以前进行的任何私密、赤裸或敏感的交易。
在智能合约可能支持的许多不同应用程序中,它们还可能为用户提供一种途径,以在与金融系统交互时重新获得他们期望的隐私。这种隐私的核心是使用智能合约来打破公共记录链,否则这些记录会将你今天的交易与过去进行的每笔交易联系起来。这就是Tornado Cash。
Tornado Cash是一个为以太坊用户提供隐私保护的开源软件项目。与许多此类项目一样,Tornado Cash不是法律实体,而是由不同贡献者群体多年来开发的几个开源软件库。这些贡献者已发布并提供Tornado Cash作为以太坊区块链上的智能合约集合作为一般用途。
正如我们将解释的那样,其中一些智能合约已被OFAC制裁。然而,Tornado Cash隐私工具的核心是Tornado Cash pools,它们只是OFAC制裁的地址的一个子集。每个Tornado Cash pool都是部署到以太坊的智能合约。与其他智能合约一样,pool合约通过特定操作扩展了以太坊的功能,以太坊的任何用户都可以根据Tornado Cash合约代码中定义的规则执行这些操作。
本节将描述这些pool是如何工作的。特别是,它将描述使这些池能够自主运行的关键创新:一种被称为“零知识证明”的隐私保护数学应用。
后续部分将描述OFAC制裁的具体地址以及它们的作用。最后的附录将列出所有受制裁的合约及其显著特征。
Tornado Cash pools是智能合约,使用户能够在以太坊上进行私秘交易。当用户使用时,Pool将自动执行两种支持的操作之一:“存款”或“取款”。这些操作一起允许用户从一个地址存入代币,然后将同样的代币提取到另一个地址。至关重要的是,即使这些存款和取款事件公开发生在以太坊的透明分类账上,存款和取款地址之间的任何公共链接都被切断了。用户可以提取和使用他们的资金,而不必担心将他们的整个财务历史暴露给第三方。
为了支持存款和取款操作,这些智能合约编码了进一步定义其功能的严格规则。这些规则自动应用于存款和取款操作,以维护所有Tornado Cash pool共享的一个非常重要的属性:用户只能提取他们最初存放的特定代币。
此属性会自动针对池的所有操作强制执行,并确保Tornado Cash池完全是非托管的。也就是说,存入并随后提取代币的用户保持对其代币的完全所有权和控制权,即使它们混入过池子。用户在任何时候都不需要将其代币的控制权交给任何人。
Tornado Cash池的一个关键原则是用户的隐私在很大程度上来自许多其他用户同时使用该池。如果池中只有一个用户,那么用户的存款和取款地址之间的链接是否被切断并不重要:简单的推论就会清楚地知道提取的代币来自哪里。相反,许多用户同时使用池。可以把它想象成银行的保险箱室。任何人都可以去那个房间的一个带锁的盒子里存放贵重物品,并且假设锁是好的,只有拥有钥匙的人才能取回这些贵重物品。但是,除了安全性之外,这可能会或可能不会增强隐私。如果只看到一个人进出房间,那么我们就知道那个房间里的任何贵重物品都是他们的。另一方面,如果,许多人经常进出房间,那么我们无法知道谁在哪个箱子里控制了哪些贵重物品。通过保证用户只能提取他们最初存入的代币的属性,许多用户可以同时使用这些池子,并保证没有其他人会收到他们的代币。
传统上,这些保证由托管服务提供:例如银行的保险箱,或在其他加密货币服务中运行“混币服务”的一群人。像Blender.io这样的混币服务直接从他们的客户那里接受代币,聚合和混合它们,然后将资金返还给他们的客户(在这个过程中通常会收取一些费用)。在中间聚合和混合阶段,有问题的资金完全由混币服务运营商控制并被混合。在混合过程的最后阶段,用户将直接从无数其他也使用该服务的用户那里获得资金。
相比之下,Tornado Cash池没有托管运营商,用户只提取他们最初存入的代币(而不是来自服务的其他用户的代币混合)。这之所以成为可能,是因为存款和取款操作的重要属性,这些操作是通过使用称为“零知识证明”的隐私保护数学分支自动执行的。” 这种零知识密码学包含在 Tornado Cash的智能合约代码中,构成了存款和取款操作的基础。
回顾之前的观点,以太坊是透明的:任何人都可以查看任何用户账户的交易历史和余额。同样,任何人都可以查看智能合约应用程序的交互历史、余额和代码。如果用户使用智能合约执行操作,这种交互就会成为永远记录在以太坊公共记录中的事实,任何人都可以调用和检查。那么,用户如何可以存入Tornado Cash池,然后再提取到不同的地址,而不会与任何观察以太坊公共记录的人建立明显的联系呢?
答案在于零知识证明。零知识证明是一种加密方法,通过该方法,一方(“证明者”)可以向另一方(“验证者”)证明给定的陈述是真实的,而证明者无需传达该陈述之外的任何其他信息。
在Tornado Cash,“证明者”是用户从池中提取代币,而“验证者”是Tornado Cash池合约之一。当用户使用池子智能合约撤回其代币时,用户必须提供零知识证明。池的代码自动检查输入证明,仅在证明有效时才处理提款。用户究竟要证明什么陈述以及他们如何创建证明稍微复杂一些,需要在存款过程中更详细一些。
当用户想要存入代币时,他们首先会生成一个“存款票据”(只有用户知道的一长串数字)。这是在用户自己的计算机上完成的,永远不会公开共享。接下来,用户提示Tornado Cash pool 合约处理存款。除此提示外,用户还提供其存款票据和存款代币的哈希(或编码形式)。池子智能合约自动将编码注释记录为其他用户编码注释的公共列表中的新条目。至此,充值用户已经完成了第一部分的流程,并保留了存款票据,作为稍后提取代币的收据。
当用户准备提取他们的代币时,他们首先将存款票据分成两半。一侧像“秘钥”,另一侧像“锁”。之后,用户提示Tornado Cash智能合约取款。除了提示,用户还提供:
“锁”的哈希(或编码形式)
使用“秘钥”和“锁”生成的零知识证明
池子智能合约使用这些输入来自动验证(即证明)以下内容:
1、零知识证明是使用“秘钥”生成的。它对应于池子的公开编码票据列表中的现有编码票据之一(即证明被提取的代币先前是由某人存入的),和它具有完全相同的“秘钥”。
2、相同的证明也对应于与证明一起提供的“锁”的编码形式(即证明提取它们的人必须是存放它们的同一个人)。
3、提交的“锁”之前没有提交(即相关存款尚未被提取)。
假设证明得到验证,池子智能合约会自动:
1、向用户发送他们的代币。
2、在其他用户的编码锁的公共列表中记录编码的“锁”,确保相同的代币不能再次被取走。
至关重要的是,在执行上述操作的同时,永远不会透露以下内容:此证明对应于哪个特定的编码票据(即,在Tornado Cash的所有储户中,谁现在正在取款)。
如前所述,对于大多数读者来说,Tornado Cash是Tornado Cash智能合约的核心子集的代名词:Tornado Cash pools。这些合约中的绝大多数是不可变的。也就是说,它们无法被任何人更新或删除。可在附录A中找到已被制裁的、不可变的Tornado Cash pool完整列表。
请注意,其中许多池曾一度扮演“运营者(operator)”角色。操作员角色最初由0xDD4c…3384担任,又名Gitcoin Grants:Tornado.cash,这是另一个受制裁的地址。该角色为其持有者提供了两个权限:
updateVerifier:用于更新智能合约使用的“验证者”。本质上,此权限可用于修改合约处理零知识证明的方式。
changeOperator:用于将“运营者”权限转移到另一个地址,或通过将“运营者”权限转移到零地址来完全撤销“操作员”权限。
2020年5月,updateVerifier权限与changeOperator权限一起对Tornado Cash pool进行了最终更新。这将所有池子的零知识证明处理器更新为最终版本,其中包含1100多名社区参与者的贡献。此外,本次更新通过使用changeOperator将权限转移到零地址,撤销了“运营者”权限。实际上,2020年5月进行的更新巩固了社区的偏好,并确保无法进行进一步的更改。
SDN列出的少数池子仍然拥有“运营者”权限。其中,两个属于非常古老、现已未使用的 Tornado Cash版本。其余的池子要么具有更新的、不可改变的版本,要么使用得很少,以至于在2020年5月的最终更新期间它们很可能被忽视了。剩下的八个池子,大部分都没用过,用过的池子在过去三年内只用过一两次。附附录C中有一份保留运营者权限的过时的Tornado Cash池子的完整清单。
池子智能合约代表Tornado Cash应用程序的核心,该应用程序保持不变且不受任何一方的控制。然而,OFAC的制裁还包括辅助智能合约,为社区持续维护和使用Tornado Cash提供协调机制。其中一些合约今天未使用,属于旧版本的Tornado Cash。与Tornado Cash的社区维护相关的OFAC制裁的智能合约的完整列表可在附录B中找到。
SDN清单包括两个至今仍在使用的主要合约:
Tornado Cash (Router):最新Tornado Cash池的注册表,与当前版本的Tornado Cash 一致。用户可以选择通过路由器合约与Tornado Cash池进行交互,从而确保他们的存款和取款操作使用最新的代码进行处理。
Tornado Cash (Relayer Registry) : 一个为Tornado Cash用户提供中继辅助提款服务的运营者注册表。用户可以选择通过中继器处理他们的提款,这可以提供额外的隐私。
与池子智能合约不同,Router和Relayer Registry支持一些可更新的功能。但是,更新这些合约的权限不是由人持有,而是由另一个智能合约持有。该智能合约,也称为Tornado Cash: Governance,它定义了决定如何更新Router和Relayer Registry的规则和操作。
简而言之,Tornado Cash: Governance规定这些智能合约的更新是在社区的要求下处理的,社区公众投票来确定应该进行哪些更新以及何时更新。任何TORN代币的持有者都可以参与这些投票。TORN是一种建立在以太坊上的ERC20代币,社区明确使用它来对治理提案进行投票。以太坊的任何用户都可以购买TORN代币并参与此过程。
请注意,虽然此过程允许更广泛的以太坊社区参与Tornado Cash的开发和维护,但此过程的任何部分都不允许更新或删除Tornado Cash池智能合约。此外,参与Tornado Cash: Governance流程是完全可选的:用户可以使用Tornado Cash池,而无需参与、监督或与Tornado Cash: Governance流程进行交互。
尽管Tornado Cash: Governance和TORN代币合约是Tornado Cash软件生态系统的一部分,但两者都没有被添加到OFAC的SDN列表中。
如前所述,“Relayer”是为Tornado Cash用户提供可选服务的独立运营商。
默认情况下,当用户提示Tornado Cash pool合约取款时,取款账户需要已经有ETH才能支付以太坊网络来处理智能合约的操作。但是,在取款之前将以太币发送到提款账户可能会在用户的存款和提款账户之间创建一个链接。
Relayer允许用户无需预先为其提款账户注资再取款,这有助于用户在取款时保持隐私。
用户从公共Relayer Registry中选择一个Relayer,这是另一个被制裁的Tornado Cash智能合约。然后,用户使用他们的取款账户签署授权Relayer辅助提款的交易。用户将此交易发送给他们选择的Relayer,Relayer代表他们处理提款,并在此过程中赚取费用。请注意,即使他们代表用户处理提款,Relayer也永远不会保管用户的代币;智能合约确保提取的代币只发送到用户的提款账户。
OFAC没有专门将任何中继地址添加到SDN列表中,但它已将包含中继者注册表的智能合约添加到列表中。
Tornado Cash旨在使以太坊的用户能够保护他们的隐私。Tornado Cash并没有暴露他们完整的财务历史,而是让用户控制他们的个人信息:共享什么以及与谁共享。然而,维护隐私和保持对个人信息的控制并不需要以不遵守法律义务为代价。
为此,Tornado Cash的开发人员创建了Tornado Cash合规工具(Tornado Cash Compliance Tool)。用户向该工具提供在池子存款过程中生成的原始“存款票据”,以创建一份PDF报告,提供代币原始来源的证明。尽管Tornado Cash池合同切断了用户存款和取款地址之间的公共链接,但合规工具允许用户有选择地“撤销”这种切断,以便向第三方提供可追溯性。
合规工具不是智能合约。但是,与本文中描述的其他软件一样,Compliance Tool也不是 Tornado Cash开发人员提供的服务;它是一个任何人都可以使用的开源工具。
最后,受制裁地址中有两个是捐赠地址。这些地址过去曾用于筹集资金,以支持为Tornado Cash提供支持的隐私软件的开发。虽然某些人或实体确实控制发送到这些地址的代币,但据我们所知,这些代币不会出于隐私目的而混合或重新路由。它们只是发件人的礼物,用于支持收件人进行的软件开发工作。OFAC批准的捐赠地址的完整列表可在附录D中找到。
总的来说,虽然OFAC列出的少数合约确实保留了人为控制的元素,但它们都不是Tornado Cash隐私工具的关键,而且它们都没有控制用户代币。核心隐私工具——池子合约——不受任何个人或团体的控制;它们只是广泛分布的计算机代码,由以太坊网络根据严格且不可更改的规则执行。
Tornado Cash智能合约允许用户将他们的代币存入并随后将其提取到另一个地址。
即使任何人都可以观察到用户存入或取出代币,但他们无法确定哪些取款对应于哪些存款。
这些操作被定义为智能合约代码,无需任何中介或第三方即可自动执行。
用户始终保留对其资金的控制权,并且只能提取他们最初存入的代币。
没有人控制这些Tornado Cash智能合约的运行,也没有人有能力在未来改变它们的运行。
一些OFAC制裁的地址保留了一定程度的人工控制。但是,这些地址不是Tornado Cash隐私操作的核心,Tornado Cash核心在不可变地址中,也无法控制任何用户代币。