TornadoCash V2详解: 隐私池和“无罪证明”

原文标题:TornadoCash V2: Privacy-Pools and "Proof-of-Innocence"

原文作者:Albert.Lin

原文来源:Mirror

编译:Lynn,MarsBit

简介

TornadoCash是加密货币世界中最著名的匿名交易服务。 TornadoCash利用零知识证明(ZKP)技术来掩盖资金来源。TornadoCash背后的机制被美国政府批评为非法金融活动提供便利,导致其在2022年8月被美国财政部强制除名。在许多情况下,隐私保护和洗钱活动似乎经常紧密地交织在一起。在追求隐私的同时,恶意行为者往往利用这些隐私功能进行非法洗钱。有没有可能找到一种方法,让人们既能维护自己的隐私,又能有效地遏制洗钱活动?TornadoCash的早期开发者之一ameen.eth开发的Privacy-Pools已提出一个可能的方向。(关于退市,只有前端网站和GitHub仓库受到影响,而合约部分在区块链上仍未受到影响。最终,在电子前线基金会的努力下,GitHub仓库被恢复了。更多细节,请参考本源。)

介绍TornadoCash的机制

在介绍隐私池之前,了解TornadoCash背后的设计原则是很重要的。关于详细的解释,你可以参考我以前的文章,题为”分解TornadoCash: 向朋友解释其功能的新手指南”。在这里,我将简要回顾一下TornadoCash的设计原则。

TornadoCash利用被称为“承诺”的收据来控制访问权。承诺是通过散列一个“秘密”值和一个 “空洞”代码来生成的。每个“承诺”只能用于一次提款。存款信息使用“Merkle树”结构记录,承诺作为叶子节点,并计算Merkle根。用户只需要提供从叶子到根的数据路径,就可以证明该数据是“Merkle树”中的一个叶子,从而间接证明之前向TornadoCash的资金存款。零知识证明用于隐藏存款来源,而“空洞器”则用于防止双重提款攻击。

TornadoCash的承诺有两个目的:

  1. 证明以前的存款。
  2. 确保单次取款

零知识证明

无罪证明”

根据TornadoCash的设计原则,只能确定提取的资金来自以前的存款,但不能确定具体的存款。这种匿名功能被犯罪分子利用来进行非法洗钱活动,这就是为什么美国政府试图监管TornadoCash。然而,如果我们能提供另一种证明,如零知识证明(ZKP),以证明所提取的资金不是来自黑名单上的存款,就有可能证明该提款与非法活动无关。这个概念被称为“无罪证明”,其目的是为了确定相关个人的清白。

**“无罪证明”**的概念可以分为两个方向:

  1. 证明所提取的资金来自白名单(允许的名单)上所列的存款集。
  2. 证明被提取的资金不是来自黑名单(拒绝名单)上的存款。

这两个方向的目的是通过证明其与授权存款的关联性或与禁止存款的关联性来确定被提取资金的合法性。

零知识证明

隐私池的设计原则

隐私池的设计原则建立在TornadoCash的基础上,并增加了**“无罪证明”**的概念。在隐私池中,提款收据不仅具有代表TornadoCash收据的原始目的,而且还具有第三种意义: “证明所提取的资金来自白名单上的存款 “

通过纳入这种额外的证明,Privacy-Pools旨在为提取的资金的合法性提供更高的保证,确保它们可以被追溯到白名单上列出的授权存款。

来自Privacy-Pools的收据代表了以下含义:

  1. 证明以前的存款。
  2. 保证单次提款
  3. 证明所提取的资金来自白名单上的存款

在这里,我们用Allow Merkle Tree来解释隐私池如何将**“无罪证明”的概念纳入系统(其中Allow Merkle Tree**代表白名单概念)。首先,Allow Merkle Tree有几个特点。

  • 顾名思义,Allow Merkle Tree是Merkle Tree。
  • 该树的高度和节点数与隐私池中的存款默克尔树相同。
  • Allow Merkle Tree的每一片叶子都对应于Deposit Merkle Tree中的一个叶子的位置(代表一个存款)。

Allow Merkle Tree的叶子节点中的数据可以分为以下两种类型:

  • 允许: 这表明该位置的存款是允许的。(没有任何存款的位置也被默认为允许的。)
  • 阻止: 这表明该位置的存款被阻止或拒绝。

下面的图片说明,在Deposit Merkle Tree中索引0和1的位置代表合法资金,它们在Allow Merkle Tree中的相应位置也被标记为“允许”。

零知识证明

让我们假设今天有一个罪犯想从事洗钱活动,并将非法资金存入Privacy-Pools的位置,存款Merkle Tree ndex: 2。我们知道这些资金是非法的,所以我们更新允许Merkle树中的相应位置,特别是 index:2”,改为“阻止”。这个动作确保被阻止的资金不能被提取,因为它们与非法活动有关。

零知识证明

在从允许名单上提款的情况下

假设一个用户,其存款被列在美国政府的允许名单上,想提取资金。除了提供在Deposit Merkle Tree中拥有存款的证明外,他们还需要提供在美国允许名单上的证明。美国允许名单的相应证明包括Allow Merkle根(由用户提供,在代码中被称为subsetRoot)和沿途遇到的中间节点值。

在Privacy-Pools的ZKP验证阶段,Merkle Root是使用叶子值allowed(在实际代码中,它是keccak256(allowed))和给定的中间节点值构建的。然后系统检查这个计算出来的Merkle Root是否与用户提供的Allow Merkle Root相匹配。如果它们匹配,则验证成功,表明提取的资金来自美国政府允许名单上的存款。

零知识证明

在从被拒绝名单中提款的情况下

如果一个用户,其存款没有列在美国政府的允许名单上,试图提取资金,而他们在美国允许名单上的相应存款位置被标记为“阻止”,这将阻止该用户使用与美国政府允许名单相关的Allow Merkle Root来提取资金。这将导致验证失败,因为无法生成相应的证明。

在Privacy-Pools中,计算依赖于叶子值allowed(代码中的keccak256(allowed)),但美国政府的允许列表将该位置标记为blocked。这种差异导致无法计算相同的Merkle Root,导致验证失败。因此,用户将无法使用美国政府允许列表中的Allow Merkle Root提取资金。

零知识证明

在这种设计下,用户确实需要提供一个替代的Allow Merkle Root来提取资金。这个替代的Allow Merkle Tree必须将相应的存款位置标记为“允许”,以便计算出相同的Allow Merkle Root来成功验证。这个替代的Allow Merkle Tree可以来自另一个政府或机构,他们维护这样一个列表,甚至由用户自己生成。

在这种情况下,美国政府可以利用提款过程中使用的Allow Merkle Root来确定用户的资金是否符合美国政府的规定,使他们能够追踪这些资金。如果用户使用的是自我生成的或不被信任的Allow Merkle Tree,那么提取的资金极有可能来自有问题的存款,因为任何有信誉的第三方Allow Merkle Tree都会将该存款位置标记为“被阻止”。

零知识证明

常见问题:

问:如果Allow Merkle Root是由取款人提供的,他们是否可以伪造一个假的Allow Merkle Root来声称该叶子对应于一个允许的存款?这是否意味着他们仍然可以提取资金?

答:答案是肯定的。在这种情况下,确实有可能提取资金。作者特别指出,这种机制的目的不是为了防止犯罪分子提取资金,而是为了确保即使他们成功提取了资金,也能知道这些资金来自于被拒绝的名单。当取款人提供一个没有说服力的Allow Merkle Root时,可以认为他们是从被拒绝名单上的存款中提取资金。据推测,允许这种行为的原因是为了保持服务的去中心化性质。每个Allow Merkle Tree需要一定的权限管理来更新每个叶子的状态。如果一个特定的Allow Merkle Tree根部被强制执行,就意味着有人拥有某些权限来控制资金的提取,这与去中心化的精神相悖。

问:谁决定这笔交易是否来自被拒绝名单上的资金?

答:作者没有具体提到谁来决定一项交易是否来自被拒绝名单上的资金。据了解,这方面很可能是由各自的监管部门决定的。例如,如果美国政府打算调查隐私池中的非法资金,他们可以检查每笔交易的Allow Merkle Root,以确定它是否与非法资金有关。确定哪些Allow Merkle Roots被认为是有效或允许的标准将由各监管机构自己决定。

Privacy-Pools代码

在这里,我提供了主要的代码和作者的评论,希望能帮助大家通过代码理解主要的逻辑。

零知识证明

零知识证明

太长不看版

  • “无罪证明”是一个概念,它使用另一个证明来证明一笔提款来自允许名单上的存款。它可以从允许列表和拒绝列表的角度来构建。
  • 隐私池以TornadoCash为基础,增加了“无罪证明”的概念。Privacy-Pools中的收据代表了一个额外的含义:证明所提取的资金来自允许列表中的存款。
  • Allow Merkle Tree的存在是为了证明所提取的资金来自于允许的列表。Allow Merkle Tree中的叶子位置与Deposit Merkle Tree中的存款叶子位置相对应。Allow Merkle Tree的叶子数据可以是“允许”或“阻止”。
  • 除了提供必要的数据来构建Deposit Merkle Root外,取款人还需要提供Allow Merkle Root和构建它所需的数据,以证明所提取的资金来自允许的列表中。
  • 由于Allow Merkle Root是由取款人提供的,恶意行为者有可能伪造一个假的Allow Merkle Root来提取非法资金。然而,伪造的Allow Merkle Root的存在仍然会在区块链上引起怀疑,并能够跟踪非法资金的流动。

开发者ameen.eth将**“无罪证明”的概念与TornadoCash相结合,提供了另一个视角,即“隐私不等于犯罪”**。作者发现,使用另一个零知识证明(ZKP)来证明一个额外的事实,类似于ZKP的增加。与构建一个更大、更复杂的ZKP相比,这种方法更简单、更有效。关于Allow Merkle Tree的选择,似乎在未来,它可能由一个更公正的实体构建,这将为其他人提供更大的可信度。

最后,作者对Chih-Cheng Liang和Ping Chen审阅文章并提供宝贵意见表示感谢。

参考资料

  • Tornado Cash 實例解析
  • ZKP 與智能合約的開發入門
  • [ZKP 讀書會] Tornado Cash
  • Tornado Cash — How it Works | DeFi + Zero Knowledge Proof
  • https://github.com/tornadocash/tornado-core
  • 深入理解TornadoCash技术细节
  • https://www.privacypools.com/
  • https://github.com/ameensol/privacy-pools
  • 0xhhh Thread 介紹新功能和其原理
  • demo video
  • Vitalik’s 講如何改進 Tornado v2
  • privacy pools v0 tweet
  • Introducing Proof of Innocence built on Tornado Cash

转载声明:本文 由CoinON抓取收录,观点仅代表作者本人,不代表CoinON资讯立场,CoinON不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。若以此作为投资依据,请自行承担全部责任。

声明:图文来源于网络,如有侵权请联系删除

风险提示:投资有风险,入市需谨慎。本资讯不作为投资理财建议。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2023年6月13日 下午12:17
下一篇 2023年6月13日 下午12:17

相关推荐

TornadoCash V2详解: 隐私池和“无罪证明”

星期二 2023-06-13 12:17:53

简介

TornadoCash是加密货币世界中最著名的匿名交易服务。 TornadoCash利用零知识证明(ZKP)技术来掩盖资金来源。TornadoCash背后的机制被美国政府批评为非法金融活动提供便利,导致其在2022年8月被美国财政部强制除名。在许多情况下,隐私保护和洗钱活动似乎经常紧密地交织在一起。在追求隐私的同时,恶意行为者往往利用这些隐私功能进行非法洗钱。有没有可能找到一种方法,让人们既能维护自己的隐私,又能有效地遏制洗钱活动?TornadoCash的早期开发者之一ameen.eth开发的Privacy-Pools已提出一个可能的方向。(关于退市,只有前端网站和GitHub仓库受到影响,而合约部分在区块链上仍未受到影响。最终,在电子前线基金会的努力下,GitHub仓库被恢复了。更多细节,请参考本源。)

介绍TornadoCash的机制

在介绍隐私池之前,了解TornadoCash背后的设计原则是很重要的。关于详细的解释,你可以参考我以前的文章,题为”分解TornadoCash: 向朋友解释其功能的新手指南”。在这里,我将简要回顾一下TornadoCash的设计原则。

TornadoCash利用被称为“承诺”的收据来控制访问权。承诺是通过散列一个“秘密”值和一个 “空洞”代码来生成的。每个“承诺”只能用于一次提款。存款信息使用“Merkle树”结构记录,承诺作为叶子节点,并计算Merkle根。用户只需要提供从叶子到根的数据路径,就可以证明该数据是“Merkle树”中的一个叶子,从而间接证明之前向TornadoCash的资金存款。零知识证明用于隐藏存款来源,而“空洞器”则用于防止双重提款攻击。

TornadoCash的承诺有两个目的:

  1. 证明以前的存款。
  2. 确保单次取款

零知识证明

无罪证明”

根据TornadoCash的设计原则,只能确定提取的资金来自以前的存款,但不能确定具体的存款。这种匿名功能被犯罪分子利用来进行非法洗钱活动,这就是为什么美国政府试图监管TornadoCash。然而,如果我们能提供另一种证明,如零知识证明(ZKP),以证明所提取的资金不是来自黑名单上的存款,就有可能证明该提款与非法活动无关。这个概念被称为“无罪证明”,其目的是为了确定相关个人的清白。

**“无罪证明”**的概念可以分为两个方向:

  1. 证明所提取的资金来自白名单(允许的名单)上所列的存款集。
  2. 证明被提取的资金不是来自黑名单(拒绝名单)上的存款。

这两个方向的目的是通过证明其与授权存款的关联性或与禁止存款的关联性来确定被提取资金的合法性。

零知识证明

隐私池的设计原则

隐私池的设计原则建立在TornadoCash的基础上,并增加了**“无罪证明”**的概念。在隐私池中,提款收据不仅具有代表TornadoCash收据的原始目的,而且还具有第三种意义: “证明所提取的资金来自白名单上的存款 “

通过纳入这种额外的证明,Privacy-Pools旨在为提取的资金的合法性提供更高的保证,确保它们可以被追溯到白名单上列出的授权存款。

来自Privacy-Pools的收据代表了以下含义:

  1. 证明以前的存款。
  2. 保证单次提款
  3. 证明所提取的资金来自白名单上的存款

在这里,我们用Allow Merkle Tree来解释隐私池如何将**“无罪证明”的概念纳入系统(其中Allow Merkle Tree**代表白名单概念)。首先,Allow Merkle Tree有几个特点。

  • 顾名思义,Allow Merkle Tree是Merkle Tree。
  • 该树的高度和节点数与隐私池中的存款默克尔树相同。
  • Allow Merkle Tree的每一片叶子都对应于Deposit Merkle Tree中的一个叶子的位置(代表一个存款)。

Allow Merkle Tree的叶子节点中的数据可以分为以下两种类型:

  • 允许: 这表明该位置的存款是允许的。(没有任何存款的位置也被默认为允许的。)
  • 阻止: 这表明该位置的存款被阻止或拒绝。

下面的图片说明,在Deposit Merkle Tree中索引0和1的位置代表合法资金,它们在Allow Merkle Tree中的相应位置也被标记为“允许”。

零知识证明

让我们假设今天有一个罪犯想从事洗钱活动,并将非法资金存入Privacy-Pools的位置,存款Merkle Tree ndex: 2。我们知道这些资金是非法的,所以我们更新允许Merkle树中的相应位置,特别是 index:2”,改为“阻止”。这个动作确保被阻止的资金不能被提取,因为它们与非法活动有关。

零知识证明

在从允许名单上提款的情况下

假设一个用户,其存款被列在美国政府的允许名单上,想提取资金。除了提供在Deposit Merkle Tree中拥有存款的证明外,他们还需要提供在美国允许名单上的证明。美国允许名单的相应证明包括Allow Merkle根(由用户提供,在代码中被称为subsetRoot)和沿途遇到的中间节点值。

在Privacy-Pools的ZKP验证阶段,Merkle Root是使用叶子值allowed(在实际代码中,它是keccak256(allowed))和给定的中间节点值构建的。然后系统检查这个计算出来的Merkle Root是否与用户提供的Allow Merkle Root相匹配。如果它们匹配,则验证成功,表明提取的资金来自美国政府允许名单上的存款。

零知识证明

在从被拒绝名单中提款的情况下

如果一个用户,其存款没有列在美国政府的允许名单上,试图提取资金,而他们在美国允许名单上的相应存款位置被标记为“阻止”,这将阻止该用户使用与美国政府允许名单相关的Allow Merkle Root来提取资金。这将导致验证失败,因为无法生成相应的证明。

在Privacy-Pools中,计算依赖于叶子值allowed(代码中的keccak256(allowed)),但美国政府的允许列表将该位置标记为blocked。这种差异导致无法计算相同的Merkle Root,导致验证失败。因此,用户将无法使用美国政府允许列表中的Allow Merkle Root提取资金。

零知识证明

在这种设计下,用户确实需要提供一个替代的Allow Merkle Root来提取资金。这个替代的Allow Merkle Tree必须将相应的存款位置标记为“允许”,以便计算出相同的Allow Merkle Root来成功验证。这个替代的Allow Merkle Tree可以来自另一个政府或机构,他们维护这样一个列表,甚至由用户自己生成。

在这种情况下,美国政府可以利用提款过程中使用的Allow Merkle Root来确定用户的资金是否符合美国政府的规定,使他们能够追踪这些资金。如果用户使用的是自我生成的或不被信任的Allow Merkle Tree,那么提取的资金极有可能来自有问题的存款,因为任何有信誉的第三方Allow Merkle Tree都会将该存款位置标记为“被阻止”。

零知识证明

常见问题:

问:如果Allow Merkle Root是由取款人提供的,他们是否可以伪造一个假的Allow Merkle Root来声称该叶子对应于一个允许的存款?这是否意味着他们仍然可以提取资金?

答:答案是肯定的。在这种情况下,确实有可能提取资金。作者特别指出,这种机制的目的不是为了防止犯罪分子提取资金,而是为了确保即使他们成功提取了资金,也能知道这些资金来自于被拒绝的名单。当取款人提供一个没有说服力的Allow Merkle Root时,可以认为他们是从被拒绝名单上的存款中提取资金。据推测,允许这种行为的原因是为了保持服务的去中心化性质。每个Allow Merkle Tree需要一定的权限管理来更新每个叶子的状态。如果一个特定的Allow Merkle Tree根部被强制执行,就意味着有人拥有某些权限来控制资金的提取,这与去中心化的精神相悖。

问:谁决定这笔交易是否来自被拒绝名单上的资金?

答:作者没有具体提到谁来决定一项交易是否来自被拒绝名单上的资金。据了解,这方面很可能是由各自的监管部门决定的。例如,如果美国政府打算调查隐私池中的非法资金,他们可以检查每笔交易的Allow Merkle Root,以确定它是否与非法资金有关。确定哪些Allow Merkle Roots被认为是有效或允许的标准将由各监管机构自己决定。

Privacy-Pools代码

在这里,我提供了主要的代码和作者的评论,希望能帮助大家通过代码理解主要的逻辑。

零知识证明

零知识证明

太长不看版

  • “无罪证明”是一个概念,它使用另一个证明来证明一笔提款来自允许名单上的存款。它可以从允许列表和拒绝列表的角度来构建。
  • 隐私池以TornadoCash为基础,增加了“无罪证明”的概念。Privacy-Pools中的收据代表了一个额外的含义:证明所提取的资金来自允许列表中的存款。
  • Allow Merkle Tree的存在是为了证明所提取的资金来自于允许的列表。Allow Merkle Tree中的叶子位置与Deposit Merkle Tree中的存款叶子位置相对应。Allow Merkle Tree的叶子数据可以是“允许”或“阻止”。
  • 除了提供必要的数据来构建Deposit Merkle Root外,取款人还需要提供Allow Merkle Root和构建它所需的数据,以证明所提取的资金来自允许的列表中。
  • 由于Allow Merkle Root是由取款人提供的,恶意行为者有可能伪造一个假的Allow Merkle Root来提取非法资金。然而,伪造的Allow Merkle Root的存在仍然会在区块链上引起怀疑,并能够跟踪非法资金的流动。

开发者ameen.eth将**“无罪证明”的概念与TornadoCash相结合,提供了另一个视角,即“隐私不等于犯罪”**。作者发现,使用另一个零知识证明(ZKP)来证明一个额外的事实,类似于ZKP的增加。与构建一个更大、更复杂的ZKP相比,这种方法更简单、更有效。关于Allow Merkle Tree的选择,似乎在未来,它可能由一个更公正的实体构建,这将为其他人提供更大的可信度。

最后,作者对Chih-Cheng Liang和Ping Chen审阅文章并提供宝贵意见表示感谢。

参考资料

  • Tornado Cash 實例解析
  • ZKP 與智能合約的開發入門
  • [ZKP 讀書會] Tornado Cash
  • Tornado Cash — How it Works | DeFi + Zero Knowledge Proof
  • https://github.com/tornadocash/tornado-core
  • 深入理解TornadoCash技术细节
  • https://www.privacypools.com/
  • https://github.com/ameensol/privacy-pools
  • 0xhhh Thread 介紹新功能和其原理
  • demo video
  • Vitalik’s 講如何改進 Tornado v2
  • privacy pools v0 tweet
  • Introducing Proof of Innocence built on Tornado Cash