TornadoCash V2: Privacy-Pools 及 Proof-of-Innocence

互联网 阅读 1327 2023-06-05 19:14:00
欧易OKX交易所
注册领60000元数币盲盒、全球头部交易所
官网注册

前言

TornadoCash是加密货币世界中最著名的匿名交易服务。TornadoCash利用ZKP(Zero-Knowledge Proof)技术来隐藏资金来源。美国政府主张这样的机制助长了非法金流活动,最终在2022 年8 月被美国财政部制裁而被迫下架。隐私保护和洗钱活动在很多情况下似乎总是紧密相连。在追求隐私的同时,不法分子往往利用这些隐私特性进行非法资金清洗。是否能找到一种方法,既能让人们拥有隐私,又能有效遏制洗钱活动?TornadoCash 早期开发者ameen.ethPrivacy-Pools或许给出了一个方向。(关于下架的部分只有前端网站和GitHub Repository 受到影响,合约部份因在区块链上则不受影响。最后在电子前哨基金会的争取之下GitHub 有恢复Repository,详情可以参考

简介TornadoCash 原理

在介绍Privacy-Pools 之前,需要先理解TornadoCash 相关的设计原理。详细介绍可以参考我之前的文章「Breaking Down TornadoCash: A Beginner's Guide to Explaining its Functionality to Friends」。这边简单复习一下TornadoCash 的设计原理。

TornadoCash 使用收据(commitment)来控制访问权限。收据是由secret(秘密值)和nullifier(注销码)一起Hash 产生,每个收据只能提款一次。使用Merkle Tree (杂凑树)记录存款信息,将收据作为leaf 节点并计算出Merkle Root (杂凑树根)。使用者只需提供leaf 到root 中间经过的数据,即可证明该数据是否Merkle Tree 的leaves 之一,也间接证明之前有存款资金到TornadoCash。使用Zero-Knowledge Proof 来隐藏存款来源,另外使用nullifier防止Double Withdrawal 攻击。

TornadoCash 的收据有两个含义

  • 证明之前发送者有存入资金
  • 确保每个接收者只能领取一次资金

“Proof-of-Innocence”

根据TornadoCash 设计的原理,只能知道领款的资金一定是来自之前的某笔存款的资金,但却不知道是来自哪一笔存款。这是不法份子使用TornadoCash 进行不法的洗钱活动的主要目的,也是美国政府为什么要监管TornadoCash 原因。若我们可以提出另外的Proof(ZKP),来证明领款时的资金不是来自拒绝清单的存款,是否就能证明这笔领款并非来自于不法份子,这就是“Proof-of-Innocence” (“无罪证明”)核心概念。

“Proof-of-Innocence” 概念可以分成两个方向

  • 证明领款的资金是来自允许清单中存款的资金集合(允许清单)
  • 证明领款的资金并没有来自拒绝清单的存款资金集合(拒绝清单)

这两种做法都是可以证明领款资金都不是来自于拒绝清单里的存款。下图的做法是采用拒绝清单的方式,证明领款的资金并非来自于拒绝清单的存款(红色)。

美国政府source:https://medium.com/@chainway_xyz/introducing-proof-of-innocence-built-on-tornado-cash-7336d185cda6Privacy-Pools 设计原理

Privacy-Pools 在TornadoCash 基础上多加上了“Proof-of-Innocence” 的概念。Privacy-Pools 领款收据除了TorandoCash 收据原本代表的意义之外,还有第三个意思:『证明领款的资金来自于允许清单中的存款』。

Privacy-Pools 收据代表意义:

  • 证明之前发送者有存入资金
  • 确保每个接收者只能领取一次资金
  • 证明领款的资金来自于允许清单中的存款

这边我们使用Allow Merkle Tree 来解释Privacy-Pools 是如何把“Proof-of-Innocence” 运用在这个系统中(Allow Merkle Tree 是运用允许清单的概念)。首先Allow Merkle Tree 有几个特点

  • Allow Merkle Tree 顾名思义是一个Merkle Tree
  • 树高和节点数都跟Privacy-Pools 的Deposit Merkle Tree 相同。
  • Allow Merkle Tree 的leaf 皆对应Deposit Merkle Tree leaf(存款) 位置。

Allow Merkle Tree leaf 资料可以分成下面二类:

  • allowed:表示该位置的存款是允许。(尚未有存款的位置也是预设allowed)
  • blocked:表示该位置的存款是拒绝。

下图可以看到index0和1的位置在Deposit Merkle Tree 皆为legal funds,对应的Allow Merkle Tree leaf 位置也是allowed。

美国政府假设今天有一名不法份子想要进行洗钱活动,他把攻击后所得不法资金存进Privacy-Pools ,存款位置是Deposit Merkle Treeindex:2的位置。我们知道那是不法的资金,所以在对应的Allow Merkle Treeindex:2位置我们更新为blocked。

美国政府允许清单领款情形

假设今天有一名在美国政府允许清单存款的用户想要提领资金,需要提供『 有存款在Dposit Merkle Tree 中的证明』之外,还需要提供『 在美国允许清单的是Allowed 的证明』。对应美国允许清单的证明包含了Allow Merkle Root (由用户自行提供,在程式码中为subetRoot)和中途会经过的node 值。Privacy-Pools 在验证ZKP 阶段时,会以leaf 值为allowed(实际程式码中是keccak256(allowed))和给定中途会经过的node 值去建构出Merkle Root。验证此Merkle Root 与用户提供的Allow Merkle Root 是否相同。若相同代表验证通过,表示该领款的资金是来存在于美国政府允许清单中的存款。

美国政府拒绝清单领款情形

今天有一名不在美国政府允许清单存款的用户想要提领资金,而对应的存款的位置在美国政府允许清单中被标记成blocked。这样会导致用户无法使用美国政府允许清单的Allow Merkle Root 去领出资金,因为产生不出对应的证明而导致验证失败(因为Privacy-Pools 使用leaf 是值allowed去做计算,而美国政府允许清单将该位置标记成blocked,导致计算不出相同的Merkle Root )。

美国政府这样的设计被迫这名用户需要提供其他的Allow Merkle Root 才能提领资金(其他的Allow Merkle Tree 需将该存款位置标记成allowed,才能计算出相同的Allow Merkle Root 来通过验证)。这个其他的Allow Merkle Tree 可能来自于其他政府或机构所维护,甚至是这名用户自行产生。今天美国政府就可以藉由提领时所用的Allow Merkle Root, 来判断用户的资金是否符合美国政府的法律规范,借此来达到追踪的目的。若用户是使用自己产生或不具公信力的的Allow Merkle Tree ,基本上该笔领款资金极有可能来自有问题的存款(每个具公信力的第三方Allow Merkle Tree 都将该存款位置标记成blocked)。

美国政府常见的问题

Q: 如果Allowroot 是由提领人提供,是不是可以假造一个假Allow Merkle Root 来证明该leaf 是允许清单中的存款,是不是代表还是可以把钱领走呢?

A: 答案是肯定的,确实是可以把钱领走。这一点作者有特别提出说,这样的机制并不是要禁止不法份子把钱领走,而是就算可以领走也会被知道说这笔资金是拒绝清单的资金。当提领人提供了一个没有说服力的Allow Merkle Root,基本上可以视为他是从拒绝清单存款提领。笔者这边猜测允许这样做的原因是想要保持这个服务的去中心化性质。因为每个Allow Merkle Tree 都需要有一定的权限管理去更新每个leaf 的status。若强制指定某个allow tree root 的话,代表有人有一定权限控制资金的提领,这一点并不符合去中心化的精神。

Q: 会是由谁来决定这笔交易是来自于拒绝清单资金呢?

A: 笔者看到的部分并没有特别提,理解是这部分应该由各监管单位自己去做。假设今天美国政府要查Privacy-Pools 的脏钱,他可以透过去检查每笔的Allow Merkle Root 来判断他是不是脏钱。至于怎样的Allow Merkle Root 是允许,那就是各监管单位他们自己去判断。

Privacy-Pools 程式码

这里附上主要的程式码和笔者自己的注解,希望可以帮助大家可以透过程式码理解主要逻辑。

// circuits/withdraw_from_subset.circom

template WithdrawFromSubset (levels, expectedValue) {

// public

signal input root;

signal input subsetRoot;

signal input nullifier;

signal input assetMetadata; // abi.encode(token, amount).snarkHash();

signal input withdrawMetadata; // abi.encode(recipient, refund, relayer, fee).snarkHash();

// private

signal input secret;

signal input path; // Indicate whether the data represents the left leaf or the right leaf.

signal input mainProof[levels]; // Construct the data required for deposit root.

signal input subsetProof[levels];// Construct the data required for allow root.

// Calculate the nullifier and commitment.

component hasher = CommitmentNullifierHasher();

hasher.secret <== secret;

hasher.path <== path;

hasher.assetMetadata <== assetMetadata;

nullifier === hasher.nullifier;

// expectedValue: keccak256("allowed") % p

component doubleTree = DoubleMerkleProof(levels, expectedValue);

doubleTree.leaf <== hasher.commitment;

// Convert the path to bits to specify whether it is the left leaf or the right leaf.

// It can be observed that the deposit tree and allow tree share the same path.

doubleTree.path <== path;

for ( var i = 0 ; i < levels; i++) {

doubleTree.mainProof[i] <== mainProof[i];

doubleTree.subsetProof[i] <== subsetProof[i];

}

root === doubleTree.root; // Verify the deposit root.

subsetRoot === doubleTree.subsetRoot; // Verify the allow root.

signal withdrawMetadataSquare;

withdrawMetadataSquare <== withdrawMetadata * withdrawMetadata;

}

TLDR

  • “Proof-of-Innocence”是用另一个Proof 来证明该笔领款是来自于允许清单中的存款。“Proof-of-Innocence” 可以从允许清单拒绝清单两个角度来建构。
  • Privacy-Pools 在TornadoCash 基础上叠加了”Proof-of-Innocence“ 的概念,原本的收据代表意义多了第三个意思:『证明领款的资金来自于允许清单中的存款』。
  • Allow Merkle Tree 存在可以证明提领资金是存在允许清单中。Allow Merkle Tree 的leaf 位置相对应于Deposit Merkle Tree 的存款leaf 位置。Allow Merkle Tree leaf 资料为allowed和blocked。
  • 领款者除了需要提供建构Deposit Merkle Root 所需资料之外,还需要另外提供Allow Merkle Root 和建构Allow Merkle Root 的资料来证明提领资金的是存在允许清单中。
  • 由于Allow Merkle Root 是由领款者提供,不法份子仍有办法透过假造的Allow Merkle Root 来把不法资金领走。假造的Allow Merkle Root 依然会呈现在链上并被其他人视为这笔领款仍有存有疑虑,借此来达到追踪不法资金的流向。

开发者ameen.eth将”Proof-of-Innocence“ 概念和TornadoCash 结合,提供另一个『 隐私不等同于犯罪』的方向。笔者觉得有趣的角度是利用另一个ZKP 来证明另一件事实,有点像是ZKP 的加法。这样的使用方式会比建构一个更大行更复杂的ZKP 更来为简单,效率也更高。关于Allow Merkle Tree 的选择,感觉之后会是由一个比较公正的单位来建构,这样对于其他人也有比较高的说服性。

最后感谢Chih-Cheng Liang以及Ping Chen帮忙Review 文章和给出宝贵的意见!

免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:被猜测是赵长鹏的接任者,负责币安美国以外所有市场的Richard Teng究竟有何来头? 下一篇:Kakarot路线图:从将EVM带入Starknet,至成为type 1 zkEVM

您可能感兴趣

  • 一文读懂TON生态上最火热的社交游戏项目MOMO AI
    一文读懂TON生态上最火热的社交游戏项目MOMO AI

    在区块链技术的不断进化中,TON生态已经成为全球关注的焦点。作为一个具有前瞻性的区块链平台,TON不仅提供了超高的处理效率和安全性,还因其开放性和灵活性,吸引了众多创新项目和开发者的加入。在这样一个充满活力的生态系统中,MOMO AI凭借其独特的游戏和社交融合功能,快速崛起,成为TON生态中最具影响力的项目之一。目前DappRadar 排名第 17 位,Solana 生态系统排名第 1 位,TON生态游戏排名第 1 位。在MOMO AI不仅仅是一个游戏项目,它的出现代表了区块链游戏领域的一次重大创新,通过

    每日资讯 2024-06-20 21:03 679
  • 老牌DeFi入局RWA赛道:重磅动作不断的TrueFi如何杀出重温?
    老牌DeFi入局RWA赛道:重磅动作不断的TrueFi如何杀出重温?

    在区块链社交领域,项目如雨后春笋般迅速崛起,每一个新兴平台都试图在Web3世界中留下自己的烙印。最近,TrueFi作为一种新型信用协议,引起了广泛关注。据Lookonchain监测,最近出现了一则重要消息:一位大户从币安提取了价值245万美元的1443万枚TRU,并将其质押在TrueFi平台上。这一举动不仅突显了TrueFi在数字资产领域的影响力,也反映了市场对其潜力的认可。TrueFi不仅仅是一个信用协议,近期还推出了以美元为基础的TRI代币,旨在推动现实世界资产交易市场。这种创新为TrueFi注入了新

    每日资讯 2024-06-20 20:03 521
  • 澳大利亚最大证券交易所ASX上市首支比特币ETF,首日交易量达130万美元
    澳大利亚最大证券交易所ASX上市首支比特币ETF,首日交易量达130万美元

    作者:Weilin,PANews6月20日,澳大利亚证券交易所(ASX)上市该交易所的首支比特币现货ETF,由美国资产管理公司VanEck发行,名为VanEck Bitcoin ETF,代码VBTC。VanEck种子投资约为98.5万澳元(约合65.7万美元)。从首日表现来看,该ETF首个交易日交易量达到130万美元。ASX占澳大利亚股票市场90%份额,为国内最大证券交易所。上市的VBTC是美国市场上价值6.47亿美元的VanEck比特币ETF HODL的联接基金(feeder fund)。该基金已在澳大

    每日资讯 2024-06-20 19:03 314
  • 梳理Curve创始人清算事件:第三轮DeFi保卫战,为何他无动于衷?
    梳理Curve创始人清算事件:第三轮DeFi保卫战,为何他无动于衷?

    撰文:链茶馆Curve Finance 是一个专注于稳定币兑换的 DeFi 平台,其创始人 Michael Egorov 长期使用平台的治理代币 CRV 作为抵押,从多个 DeFi 平台借出大量稳定币,然而,CRV 代币价格的剧烈波动导致 Egorov 的借贷仓位面临清算风险。6 月 13 日晚间,Arkham 发文表示表示 Curve 创始人 Michael Egorov 价值近 9 位数的借贷头寸(1.41 亿美元 CRV)已被全部清算,并在 Curve 的借贷平台 Llamalend 上共计产生超过

    每日资讯 2024-06-20 19:02 321
  • 比特币市场占有率飙升至55.25%,创2021年新高
    比特币市场占有率飙升至55.25%,创2021年新高

    据币百科数据显示,比特币的市场主导地位已经飙升至55.25%,创下自2021年4月以来的新高。最近一段时间,由于比特币和以太坊价格从高点回落,而其他山寨币行情惨遭血洗,跌幅更大,反过来推升了比特币的主导地位。今年5月底时候,比特币市场占有率还不到50%。这一增长还主要受现货ETF批准的推动。

    每日资讯 2024-06-20 18:52 154
  • 加密市场“6.18”狂甩货之后,后市行情怎么走?
    加密市场“6.18”狂甩货之后,后市行情怎么走?

    币圈人有属于自己的618。在经历了一周的阴跌后,6月18日,大盘再次地震。就在凌晨,比特币罕见跌破市场支撑价65000美元,以太坊随之下跌,跌破3400美元,24 小时跌幅6.23%,MEME之王SOL也难掩颓势,一度跌至127.22 USDT,下挫10.98%。主流币尚且惨淡,山寨币就更难言向好,山寨币普遍呈现出“跌麻了”行情,大部分山寨币跌幅超过20%,刚上线的ZK一度跌破0.2USDT,跌幅超36%。据Coinglass数据显示,截至昨日下午2点,24小时全网爆仓 3.18 亿美元,主爆多仓,多单爆

    每日资讯 2024-06-20 18:03 174
  • 安全特刊完结篇|OKX Web3:为用户资产安全护航
    安全特刊完结篇|OKX Web3:为用户资产安全护航

    引言 | OKX Web3特别策划了《安全特刊》栏目,针对不同类型的链上安全问题进行专期解答。通过最发生在用户身边最真实案例,与安全领域专家人士或者机构共同联合,由不同视角进行双重分享与解答,从而由浅入深梳理并归纳安全交易规则,旨在加强用户安全教育的同时,帮助用户从自身开始学会保护私钥以及钱包资产安全。感谢大家一路陪伴~终于!OKX Web3钱包安全团队发起的《安全特刊》系列迎来完结篇~不要放到收藏夹吃灰!也不要等亿会儿就学!钱包和资产安全无小事、你们要看在眼里、记在心里哦~~一、内容回顾首先,非常感谢慢

    每日资讯 2024-06-20 17:03 377
  • 从理论到实践:Based Rollup能否实现L1排序驱动的Rollup方案
    从理论到实践:Based Rollup能否实现L1排序驱动的Rollup方案

    作者:YBB Capital Researcher Ac-Core前言:以太坊的工作原理是每个节点都会存储并执行用户提交的每笔交易,为对整个网络进行扩展,以太坊采用了Rollup解决方案。简单来说它将大部分交易处理移到链下(L2),从而减轻以太坊主网(L1)的负担并降低交易费用,即Rollup=L1的一组智能合约+L2的网络节点,即链上智能合约和链下聚合器,它自身的结算、共识和数据可用性依赖于以太坊本身,仅负责执行交易。L2网络节点由多个部分组成,其中最重要的是排序器,但目前Rollup的排序器都面临着中

    每日资讯 2024-06-20 17:02 480