EIP-7503是一个旨在增强以太坊上交易隐私的提案,通过引入零知识证明机制,允许用户在链上进行匿名交易。文章详细讨论了加密隐私的重要性,以及现有隐私方案的不足之处,相比之下,EIP-7503提供了一种更安全和去中心化的解决方案,减少了坏人对隐私机制的利用。作者分析了实施该提案的技术细节和潜在的优缺点,以及其可能对以太坊生态系统和用户隐私的长远影响。
EIP-7503: Zero-Knowledge Wormholes 是一个以太坊改进提案(EIP),引入了一种在以太坊上进行隐私保护转账的机制。尽管我们看到许多旨在使链上转账私密的努力,包括像 Tornado Cash 这样的加密货币混合器,EIP-7503 是一个协议层解决方案,使以太坊 默认私密。
这是一个重要的考虑:像 Tornado Cash 这样的应用层隐私方法是“选择加入”,这通常对用户有负面影响。以隐私为中心的应用程序也更容易受到审查;例如,许多用户(尤其是美国公民)在 2022 年美国财政部外国资产控制办公室(OFAC)将协议的合约地址列入黑名单 后,无法与 Tornado Cash进行交互。
尽管 OFAC 制裁存在,Tornado Cash 仍能正常运行,原因有几方面:
上述因素意味着,即使分析表明,以太坊区块生产者正在拒绝与协议合约交互的交易,人们今天依然能够使用 Tornado Cash。然而,正如在 OFAC 制裁前的日子里,并不是每一次通过 Tornado Cash 混合器协议路由的交易都是合法的。为举例说明,一篇 Arkham Intelligence 的文章 表明,2023 年至少发生了两起高调的攻击(Euler Finance 的 1.97 亿美元攻击和 Anubis DAO 的 6000 万美元大捞一笔),这些攻击要么是利用从 Tornado Cash 提取的资金资助的,要么是使用混合器洗钱被盗资金并隐瞒向外转账。
考虑到 Tornado Cash 并未解决恶意行为者滥用链上隐私的问题,我们为何要在协议层实施进行私密转账的功能?这不是 风险 吗?为什么一开始就需要有私密交易?难道像以太坊这样的区块链已经足够匿名和“无法追踪”吗?
这些都是合理的问题,本文将讨论所有这些问题。我们将概述金融隐私的重要性,并探讨为何像以太坊这样的公共区块链如果不进行更改,就无法保证隐私。接着,我们将分析 EIP-7503 的启用以太坊私密支付的方法,并讨论采纳 EIP-7503 的潜在优势和缺点。
让我们深入了解吧!
在谈论电子点对点(P2P)支付的“私密交易”或“匿名交易”时,我们是在描述两种特性:不可追踪性和不可链接性。这两种特性由 Nicolas van Saberhagen 在 CryptoNote 白皮书 中设定:
大多数(如果不是全部)链上隐私解决方案可以根据它们满足的上述要求进行分类。 加密货币混合器、CoinJoin 和 环签名 主要关注于隐藏发送地址的信息并使资金不可追踪。使用不同机制来保护发送者的身份,但任何人都可以看到谁收到了资金。
相比之下,以隐私为中心的协议如 Monero、Zcash、Liquid Network 和 Aztec v1 提供了“保护”或“机密”交易的变体,并保证交易的不可链接性。保护或机密交易很难链接到特定的接收者,因为接收者地址的详细信息(以及转账的金额和类型)被保密。隐秘地址 是保持不可链接性的另一种方法:用户生成一个短暂的(短期)地址进行存款,阻止尝试将两个转账链接到同一个地址。
上述改善交易隐私的方法有其独特的优缺点,我们稍后将简要探讨。但现在,我们将关注一个根本性的问题:“金融隐私究竟为何重要?”既然我们花费时间和精力分析一项将私密且匿名交易引入以太坊的提案,我们不妨明示在以太坊上启用交易隐私的理由。
金融隐私之所以重要,是因为隐私是一项基本人权。隐私权赋予每个人决定他们希望公开分享哪些信息的权力,并保持对如何、何时、何地分享个人身份信息(PII)的控制。“个人身份信息”是一个广泛的类别,包含任何可以用于揭示个人身份的信息——包括金融活动的细节(例如,购买历史、电子转账和收入)。
以下是一些个人可能如何行使其(金融)隐私权的例子:
这些例子提供了金融隐私的实际案例,但也强调了一个隐私权批评者常常忽视的细节:隐私并不是我们认为我们需要的东西,直到为时已晚。“你在隐瞒什么?”的惯常反驳没有认识到某些情况下当事方希望对财务交易泄露的很少信息。即使人们 想 因为任意原因隐藏某些东西,为什么要打扰他们,只要他们对保密的渴望不会危及公共健康和安全?
拥有而不需要,总比需要而没有好。 —— 弗朗茨·卡夫卡
与早期支持者和评论家的描述相反,像以太坊和比特币这样的公共区块链远非匿名或私密。这两个术语通常被混淆,但它们的含义略有不同:
0xdeadbeef
),而不是姓名(alice@gmail.com)。以太坊并不私密,因为区块链为每笔交易保持记录,包括转账金额和交易执行的链上行为。以太坊也不是匿名的,因为有关在区块链上进行交易的账户(通过 地址 识别)的信息公开。你可能不会用“Alice·霍普金斯”这样的真实姓名作为你的以太坊账户,但每次使用相同的地址进行交易都会让区块链取证可以将交易与你的现实身份关联——使用 IP 地址监测、地址聚类 和 图表分析 等技术。
无聊猴子游艇俱乐部(BAYC)NFT 项目的创始人在 2022 年被 BuzzFeed 揭露身份。阅读完整故事 以及 NFTnow.com 和 Decrypt 的反驳。。
因此,以太坊被准确描述为 假名(pseudonymous),无法保证匿名性或隐私。这对一个被期望成为未来价值互联网结算层的平台而言是个坏消息。为了说明上下文,银行已经通过将财务数据存储在中心化数据库中提供某种级别的隐私,并在其中实施严格的访问控制机制,以防止未经授权的访问。
这被称为“伪隐私”,因为银行和数据库基础设施提供者可以访问这些信息并随意处理它(例如,冻结对某些国家的付款以遵守基于转账目的地的分析的制裁)。但在“在魔鬼和深蓝大海之间的经典选择”中,普通个人可能更倾向于选择 某种 隐私而不是没有隐私,这排除了开设以太坊账户并让所有链上行为对世界可见的可能。
许多人已经认识到这个问题,尤其是因为它驱使用户远离像以太坊这样的去中心化技术,转向提供稍好隐私保证的中心化解决方案,而代价则是抵制审查和透明度(等等)。例如,维塔利克的 三次转变 对于隐私对以太坊大规模采用前景的重要性提供了很好的论证:
若没有第三次[向隐私保护转账的转变],以太坊就失败了,因为让所有交易(和 POAP 等)的数据对任何人公开是对许多用户过高的隐私牺牲,最终每个人都会转向至少在一定程度上隐藏他们数据的中心化解决方案。—— 维塔利克·布特林
EIP-7503 试图解决之前描述的一些问题,特别是交易发送者缺乏匿名性的问题。该提案引入了一种手段,使地址通过发送资金到一个 不可支配地址,故意销毁以太币 (ETH),并生成一个 ZK-SNARK 证明来验证支付到不可支配地址的资金。如果该证明通过验证,等同于不可支配地址余额的 ETH 代币数量被铸造到用户任意选择的新地址——这打破了发送地址和接收地址之间的连接。
EIP-7503 借鉴了现有隐私协议的想法,以实现以太坊上的隐私保护交易。例如,该提案通过将 ETH 余额正常且零外部交易的以太坊地址的整个集合变为一个 匿名集,使得很难追踪和收到铸造交易的资金。你不能轻易识别出 A 地址负责销毁的 ETH,而 B 地址则在下一笔交易中重新铸造: A 可能是数百万个拥有非零余额但没有发起以太坊交易的地址之一。
这类似于将来自不同来源的资金混合到一个单一池中并允许存款者使用不同地址从这个池中提取资金的想法。然而,EIP-7503 相较于像 Tornado Cash 这样的加密货币混合器更具优势,因为它提供了 合理的否认权。合理的否认权是一个我们稍后会探讨的概念,但现在你需要知道的是,使用 EIP-7503 进行私密转账的用户可以否认曾进行过私密交易。
合理的否认权是 EIP-7503 的一个重要特性,它阻止外部观察者去揭示私密交易的发送者。这可以防止 Tornado Cash 的灾难重演,在该灾难中某些地址被列入黑名单,限制其访问去中心化应用程序、交易所和去中心化金融协议,因为链上取证揭露了与 Tornado Cash 的历史互动——即使其中一些账户是出于良好的原因与 Tornado Cash 互动的(例如,进行私密捐赠)。
EIP-7503 还借鉴了 Zcash 和 Aztec v1 等其他隐私中心协议,利用加密证明验证交易而不暴露交易的细节。以隐私保护的方式验证交易确保以太坊可以 安全地 支持私密转账,而不破坏现有的安全模型,这一模型依赖分布式网络节点重新执行每笔交易以确认其正确性。我们将在后面的部分中探讨 EIP-7503 如何在底层使用 ZK-SNARKs 来支持以太坊私密转账的安全执行(以及其他功能)。
警告:尽管将隐私与匿名性区分开,但为了简化并避免让习惯将这两个概念混为一谈的读者困惑,我将在本文中交替使用“私密”和“匿名” 两个词。此外,EIP-7503 包括匿名性(打破发送者与接收者的链接)和隐私性(提案的扩展将允许用户隐藏存款和取款金额)的元素。
EIP-7503 定义的私密转账工作流。来源
在高层次上,EIP-7503 的工作方式如下:
零地址是以太坊中余额最丰厚的账户,持有超过2.8亿美元的代币。除非有一些不幸的用户误将资金发送到零地址,否则大量将代币发送到零地址的用户要么是创建合约(这需要将零地址设为接收人),要么是故意将这些代币从流通中移除。
最初的ERC-20 代币标准 并未指定用于减少代币供应的功能,这意味着像 WETH(Wrapped Ether)这样的旧代币没有办法确保用户在提取原始存款之前将包裹的资产退出流通。然而,将 WETH 代币发送到零地址可以使其不可支配,并且可以模拟每次从 WETH 包装合约提取 ETH 时 WETH 的流通供应下降在比例上保持 1:1。如果你想知道 WETH 如何保持与本地 ETH 的 1:1 比率,这就是答案。
EIP-7503 使用类似机制,允许用户销毁 ETH,并在以太坊上将代币铸造到另一个地址,略有不同的是。EIP-7503 要求用户在将 ETH 铸造到另一个地址之前,为每个交易生成一个唯一的销毁地址。
将资金发送到销毁地址(根据 EIP-7503 规范创建)等同于将现金投入虫洞——它永远无法被恢复。但你 可以 证明发送给虫洞的内容,使用 ZK-SNARK(Z ero- K nowledge S uccinct A rgument of K nowledge);因此称为“零知识虫洞”。
销毁证明是私密的,因为用户只需要证明他们将代币发送到了一个不可支配地址 A,而不揭示 A 的明文。生成销毁证明需要证明销毁地址确实不可支配。为什么?在接收新铸造的 ETH 代币之前要求用户先销毁原生 ETH,可以确保两种资产在价值和可替代性上的对等。如果用户可以在之后从销毁地址提取资金,那么原生 ETH 和铸造的 ETH 代币之间的 1:1 比率就不再存在。
EIP-7503 在 EVM(以太坊虚拟机)中引入一种新交易类型,该交易接受销毁证明和接收人作为输入,且在证明成功验证时铸造新 ETH 代币并发送回发件地址。为防止对同一销毁交易进行两次铸造 ETH,该证明附加了一个特殊的“空地址”值以追踪地址的使用。
如果发送到不可支配地址的 ETH 成功重新铸造,空地址值会阻止不正值的用户为先前发送到该地址的资金生成新的有效销毁证明(即,防止双重铸币攻击)。重要的是,空地址值能够在不泄漏明文信息的情况下识别一个已使用过的地址。
在这段高层次介绍后,我们现在可以深入 EIP-7503 实现的低层细节。接下来的部分将讨论实施 EIP-7503 的关键细节,例如:
一个普通的以太坊地址是从账户的 私钥 生成的 公钥 的 Keccak256 哈希的前 20 字节(私钥是从助记符或种子短语生成的一个整数)。私钥和公钥是使用椭圆曲线数字签名算法(ECDSA)生成的。ECDSA 是一个复杂的主题(“复杂”是我对“有很多数学”的首选委婉语),但这里有一些资源——从初学者到专家排列:
公钥的获得是通过将私钥(称为秘密或 s 的简写)乘以一个特殊的“生成器值” G 来产生一个新的值,形式为 pubKey = privKey * G
。地址是通过将公钥带入 Keccak256 哈希函数处理,并取哈希字符串的前 20 字节生成的。在伪数学符号中,该操作看起来如下:A = K(s * G)
,其中 A 是地址, s 是秘钥或私钥, G 是椭圆曲线上的生成点。
地址、公共密钥和私钥在不同的作用上:
列表中的最后一项指出了一个微妙的细节:只有在你控制私钥时,才能支出发送到账址的资金——即,你知道用于生成公钥的私钥,而该公钥又用于生成地址。如果你不知道一个地址的私钥,或者私钥被另一个人控制,你便无法支出来自该地址的资金。
我们如何知道地址 A
的余额是不可支配的?我们可以从随机选择一个随机的 20 字节值 A
开始,利用加密哈希函数的一项特殊属性称为 前像抵抗**。简单来说,前像抵抗意味着如果 A
是随机选择的,我们就不能找到一个值 x
使得 H(x)
(x
的哈希)与 A
相同。在伪数学符号中,(该)声明的形式为:H(x) ≠ A
。
A
是哈希的 图像(哈希函数的输出),而 x
是哈希函数的前像(哈希函数的输入)。根据(a)可能的整数的数量(b) 输入被哈希函数处理以生成输出的方式,找出 H(x) = A
值是很困难的。因此,唯一能让你“猜测”出 x
与 A
有关的是,如果你拥有大量的计算能力和足够的时间来通过大量计算来寻找 H(x) = A
。
虽然这不是你的加密学101课程,但以上解释捕捉到了现代加密系统的一个关键属性。哈希函数的前像抵抗特性在 EIP-7503 中也起着关键作用:如果 A
是一个随机的 20 字节值,我们可以合理地相信某个用户无法推导出他们的私钥 s,并且无权支出地址中资产。那就是,计算 A = H(h(s * G)
是不可能的,其中 A 是销毁地址, s 是私钥或秘密, G 是生成点(小注:k(s * G)
等于上段的 x
)。
但是,这一策略并非完全无懈可击。例如,我们如何判断A
真的随机,而不是通过计算 s * G
得到的呢?如果一个用户独立选择 A
,我们要么必须信任用户,要么构建复杂程序以验证 A
是随机选择的;如果我们选择 A
,我们则无需信任用户——但总是存在不容忽视的机会,有人可能会侥幸猜测正确的 x
。既然 x = s * G
,这种知识可能使用户能够推导私钥 s
并从假定不可支配的地址支出。
显然,这是不理想的,突显出需要一个更安全的生成不可支配地址的机制。幸运的是,加密哈希函数还有另一个我们可以利用的属性:碰撞抵抗。简单来说,碰撞抵抗意味着你无法找到 H(x) = H(y)
,其中 x
和 y
是不同的输入——也就是说,通过为不同的输入值计算哈希不会“碰撞”并产生相同的结果。
碰撞抵抗对于防止伪造(和其他用途)而言是重要的:两个人对两个不同的输入进行哈希,结果总是不同的哈希字符串,而一个人不能声称拥有仅对另一个人未知的输入。碰撞抵抗的另一个版本是你找不到 H1(x) = H2(x)
,其中 H1
和 H2
是来自不同家族的哈希函数。换句话说,通过不同的哈希算法计算 x
的哈希值不会“碰撞”并得出相同的输出。
要了解为什么这一点是可能的,我们将举一个虚构的例子来解释哈希函数的工作原理:
Alice、Bob、雪莉和马克属于对立的政党:Alice和Bob是蓝党成员,而雪莉和马克是红党成员。蓝党的忠实支持者和红党的忠实支持者希望在不向竞争党成员泄露敏感细节的情况下,在他们之间共享信息,并独立提出各种加密信息的代码。
蓝党的代码称为双字母算法,而红党则使用一种称为三字母算法的变体。代码非常简单:在编写信息时,我们用数字替代字母 —— 消息字符串中的每个数字指的是字母在字母表中的特定位置。“加密”的部分源自于我们选择数字代表字母的方式:
4-30-50
:4/2 = 2(“B”是字母表中的第二个字母);30/2 = 15(“O”是字母表中的第 15 个字母);50/2 = 25(“Y”是字母表中的第 25 个字母)。6-45-=75
:6/3 = 2(“B”是字母表中的第二个字母);45/3 = 15(“O”是字母表中的第 15 个字母);75/3 = 25(“Y”是字母表中的第 25 个字母)。该示例使用不同的代码对同一条信息进行加密,但我们可以预期蓝党和红党的人在实践中将交换不同的信息(例如,“马克是个混蛋”(Alice→Bob)和“蓝党成员是失败者”(雪莉→马克),等等)。尽管如此,用不同代码加密同一条信息在解释哈希函数的碰撞抵抗时仍然很有用:
当“BOY”使用蓝党的“双字母”算法与红党的“三字母”算法加密时,结果是非常不同的(4-30-50
和 6-45-75
)。蓝党成员无法生成 6-45-75
,除非他们使用红党的加密算法;红党成员也无法生成 4-30-50
,除非他们使用蓝党的加密算法。由于各个党派都对加密算法的细节进行了保密,我们知道竞争党派成员无法解密原本不属于他们的消息。
加密哈希函数不同于加密算法:哈希函数是 单向的,没有办法从输出推导出输入,而加密算法,如上例中的加密算法,则有一个用于解密输入的 密钥。但在碰撞抵抗领域,哈希函数和加密算法之间存在相似性。正如我们无法通过不同的加密算法找到同一输入所对应的相同输出(加密后的消息),我们也无法通过不同的哈希函数找到同一输入所对应的相同输出(哈希)。
我们可以利用哈希函数的碰撞抵抗性来生成用于销毁资产的 可证明 不可支配地址,如 EIP-7503 要求。首先,我们要求用户选择一个秘密值 s(以太坊账户的私钥),计算 s * G
的 Keccak256 哈希以导出公共密钥,再对公共密钥进行哈希以导出地址 A。然后我们要求该用户通过将秘密值 s 采用另一种哈希函数 H 生成一个新地址 B,并提取输出的前 20 个字节作为该地址。
我们的目标是什么?我们希望得到 K(x) ≠ H(x)
,其中 K 表示 Keccak256 哈希函数, H 表示来自不同哈希函数家族的哈希函数。为提高性能,我们希望 H 是“ZK友好”的(即,在电路中验证 H(x)
的结果应该成本低、速度快)。
我们无法得知 B 的公钥,因为该地址是随机生成的,而不是通过计算 s * G
(私钥乘以生成器)得到的,这意味着 B 的私钥是否也无法获知。如果我们不知道 B 的私钥,我们无法为支出 B 余额的消息创建有效签名。通过一个可证明随机的过程生成不可支配地址,我们有了一种让用户在重新铸造资产前销毁 ETH 的方法。
我们如何证明特定用户将 ETH 发送到不可支配地址 并且 该不可支配地址是由该用户创建的?第一个检查是必要的,以避免欺诈性铸造 ETH(我们只有在有用户预先销毁 ETH 的证明时,才铸造新的 ETH 代币),但第二个检查也很重要:我们需要知道地址确实是由用户创建的——否则,我们将需要一份信息(例如销毁交易的哈希)来确认用户并非在试图声称他人的存款。
由于我们希望避免泄露有关用户参与隐私协议的信息,因此我们允许用户生成一个零知识证明,从而证明对 s(哈希生成销毁地址的秘密值)具有知识,而无须公开透露 s。零知识证明声明用户知道一个由 H(s)
结果生成的地址 B:因 s 是私下选择的,其他人无法计算出一个不同的值 H(x)
,使得 H(s) = H(s)
。这是因为哈希函数的碰撞抵抗性如前所述。
隐藏 s 可以防止恶意行为者通过提交确认知识的证据,来兑换用户的存款,确保用户拥有用于生成不可支配地址的私密 s。本节略去了我们如何能够创建零知识证明来证明 H(s) = A
,而不需要验证者独立计算 H(s)
的原因。但你可以阅读维塔利克的 Quadratic Arithmetic Programs: Zero To Hero 和 我关于 ZK-EVM 的文章,获得一些使用 ZK-SNARKs 在不揭示输入的情况下证明计算有效性的背景信息。
我们将验证用户向不可支配地址(即销毁地址)转账资金的零知识证明称为“销毁证明”或“销毁收据”。销毁证明证明以下陈述:
H(s) = A
)。这检查地址是否不可支配,确认 A 是使用与生成可支配以太坊地址的 Keccak256 哈希函数不同(ZK友好)的哈希函数对 s 进行哈希的结果。b ≥ b’
)。这能确保用户尝试铸造到接收地址的金额与在不可支配地址中的存款金额相同。虽然证明第 1 项相对简单,但证明第 2 项则需要对以太坊的状态做出某种假设。特别是,我们必须证明 (a) 不可支配地址存在于标准以太坊 状态梅克尔树 中,以及 (b) 不可支配地址的声明余额与该地址在状态梅克尔树中关联的余额相符。这需要将 梅克尔证明 作为输入生成证明。
梅克尔证明由计算路径从我们试图证明的 (地址 A)到梅克尔树的根所需的梅克尔派特里梅克尔树(MPT)的叶子组成(树根也包含在梅克尔证明中)。我们需要证据以证明状态根——这用于验证梅克尔证明——也为标准,因此我们要求用户将块头 B 作为额外输入传递给电路。这组信息允许资源有限的验证者高效验证地址 A 被纳入状态梅克尔树的情况,并验证余额 b 的合法性。
注意:EIP-7503 规定推荐通过在 _eth_getProof JSON-RPC 方法中推导梅克尔证明,以证明销毁地址在状态梅克尔树中的归纳及验证该地址余额的有效性。这一方法是由 EIP-1186_ 引入的。
nullifier作为输入传递到ZK-SNARK证明电路,以便在成功验证后proof-of-burn变为无效。我们通过从证明中提取(已使用的)nullifier并将其存储在Sparse Merkle Tree(SMT)中来实现这个特性。与可以高效证明元素包含的常规Merkle树不同,Sparse Merkle树在证明元素 的 non-inclusion 时效率很高。关于SMTs的讨论超出了本文的范围,但前述链接的文章为感兴趣的读者提供了很好的概述。
在这种情况下,SMT是有用的,因为ZK-SNARK验证过程只需检查SMT是否排除了附加到新提交证明的nullifier。如果nullifier在Sparse Merkle Tree中缺失,我们就知道用户没有以前使用过此proof-of-burn,并且正在提取一个可信的_fresh_存款。我们将已使用的nullifier添加到SMT,以跟踪用于重新铸造ETH的燃烧地址,而无需公开曝光燃烧地址。
如果我们仅仅将燃烧地址存储在Merkle树中,并在处理新的提取时检查新proof-of-burn中的地址不是树的一部分,会发生什么呢?
将普通燃烧地址用作nullifier会允许外部观察者通过交叉检查该地址的交易历史与链上存储的燃烧地址列表,潜在地暴露燃烧交易的发送者。一旦燃烧地址(不可避免地)作为买方发起的某些交易的收件人出现,任何人都可以证明控制该账户的人燃烧并重新铸造ETH。
使用燃烧(不可支配)地址的哈希可以使知道转移的资金变得困难,但并非不可能。这需要一种暴力攻击,计算当前存在的每个以太坊地址的哈希,直到其中一个哈希与存储在SMT中的nullifier匹配。一旦找到了nullifier哈希的预图像(即不可支配地址),可以采取先前描述的步骤来追踪将资金发送到相关不可支配地址的账户。
我们可以通过找到一个更安全的生成nullifiers的机制来解决这个问题。目前EIP-7503规范采用的策略是使用相同的(ZK友好的)哈希函数,通过将燃烧地址与秘密值 s 进行哈希来生成nullifier N。伪数学标记如下:N = H(A,s)
,其中 A是不可支配地址,而 s是最初生成 A的秘密值。
在这种情况下,秘密值 s被描述为salt。这个salt值本质上提高了从nullifiers中提取燃烧地址信息的难度:如果 s 已知,观察者可以进行暴力攻击,运行所有可能的组合hash(burnaddress,secret)
,以生成链上存储的nullifier N
。但是 s由用户保密,有效消除了找到已使用nullifier对应燃烧地址的可能性。
现在我们知道proof-of-burn想要证明的语句,我们对证明验证的工作原理有了一个大致了解。对于第一个语句(h(s) = A
),验证者需要“理解”生成地址 A所使用的哈希函数的逻辑——这样它就知道H(s)
确实等于 A。在验证器电路中编码哈希函数的逻辑还强制执行 A不能使用Keccak256哈希函数生成。
对于第二个语句(A有一个正余额 _b 的ETH),验证者必须验证一个Merkle证明,证明 A包含于以太坊状态,并验证账户数据。电路验证器还检查区块头 B是否来自规范链——在提取状态根之前——通过调用BLOCKHASH
操作码,输入block.blockHash(blockNumber)
,其中blockNumber
引用区块头 B。如果 B是规范以太坊链的一部分,则hash
返回的结果应与区块头 B的哈希匹配。
此外,验证器电路验证用户的ZK-SNARK证明中包含的nullifier,并确认该nullifier未被以前使用。哈希函数的抗碰撞性在这里起到辅助作用,防止生成相同burn address <> secret value
组合的两个不同nullifier哈希 N1和 N2的尝试。如果用户能够为同一地址生成不同的nullifiers,它可以双重铸造ETH——无论Sparse Merkle Tree是否为该地址存储nullifier。
为了确保proof-of-burn能够被区块提议者验证,EIP-7503提出对EVM进行修改以实施支持ZK-SNARK证明的验证。EIP-7503的作者通过创建一个基于Polaris EVM框架的EIP7503启用版本的EVM测试了实施EVM内验证燃烧证明的可行性。你可以访问专门用于该项目的GitHub仓库以获取协议设计的更多细节。
EIP-7503引入了一种新的交易类型,当用户成功证明已将指定数量存入不可支配地址时,铸造ETH。交易的发送者提交一个ZK-SNARK证明(连同nullifier),网络执行一次状态转换,更新取款地址的余额(在验证proof-of-burn后)。
虽然EIP-7503提供了合理的否认,但鼓励用户避免使用来自同一地址的资金支付铸造交易。如果Alice将ETH发送到一个不可支配地址0xm00la
,然后稍后提交一个交易,要求将相同数量的ETH铸造到一个不同的账户,Bob不需要成为詹米·纽顿也能将Alice与原始燃烧交易联系起来。
前面的部分没有提到,但我们需要用户将第二个地址 B(将从铸造交易中接收ETH)作为ZK-SNARK证明电路的公共输入。这样可以防止诚信用户在铸造交易在内存池中等待时遭到抢先交易的潜在边缘案例。
请记住,验证者不检查发送地址的身份,并故意避免知道燃烧ETH的同一地址是否也在铸造交易中赎回ETH的要求。从隐私的角度来看这非常好,因为这意味着用户可以使用新生成的地址重新铸造ETH——但它增加了抢先交易攻击的风险。由于证明编码了验证所需的所有信息(包括对秘密值 s的了解),任何人都可以发送一个复制品的铸造交易,该交易具有相同的证明,但接收铸造ETH的地址不同。
幸运的是,我们可以要求proof-of-burn引用取款地址 B并实施如下规则:“铸造交易只能将ETH铸造到从proof-of-burn中提取的地址”。验证者会检查作为ZK-SNARK电路的公共输入传递的地址与铸造交易中指定的地址之间的等价性。这样,每个用户可以确认没有人能够从内存池中获取他们的证明携带交易并盗取他们的取款。
EIP-7503为以太坊用户提供了一种简单的方法,在进行资金转移时(无意中)创建发送地址与接收地址之间的链接。你可以将ETH从一个钱包发送到一个新生成的不可支配地址,并通过提供proof-of-burn和nullifier来提取至另一个钱包。对于外部观察者而言,燃烧ETH的账户与铸造ETH的账户之间完全是_零_相关性。
如果用户在一笔交易中燃烧ETH并立即将ETH铸造到一个新地址,可能会出现边缘案例:在链上分析方面的专家可能很快会发现同一个人必须控制这两个地址。然而,EIP-7503具备防止去匿名化的强大特性:合理的否认。以下是政治词典对合理否认的定义:
合理否认是指能够否认任何参与非法或不道德活动的能力,因为没有明确证据证明参与。缺乏证据使这种否认可信或合理。 — 政治词典
合理否认源于中央情报局操作的模糊世界,在那里官员会否认先前知晓下属执行的行动。缺乏纸质记录——公众可以访问的事件记录——意味着高级官员可以与现场操作员撇清关系,避免为操作员的行为所导致的后果负责(避免重大公关灾难)。
在EIP-7503的背景下,合理的否认具有类似的意义。假设你的“主钱包”燃烧了1.365 ETH,而你的“辅助钱包”随后不久铸造了1.365 ETH。如果你的操作引起过度热心的链上侦探的注意,你可以声称是另一人铸造了1.365 ETH,使其看起来像你正在完成一笔私有转账。
在你被指控完成私有转账之后。
如果有人问你:“你为什么会在没有秘密转账意图的情况下将ETH发送到燃烧地址?”你可以声称这笔交易是由于错误发生的——毕竟,没有人能否认很多ETH由于人们在接收地址上打错字而丢失(甚至_我_也犯过这个错误)。这将整个谈话翻转过来,因为,除了那些冷血个体,谁又能不对大量ETH的损失表现出同情呢?
这是一个有些微不足道的例子,突显了EIP-7503的重要性:合理的否认确保普通以太坊用户可以进行私人转账,而无需披露任何_具体_信息,这些信息可能显示参与隐私协议的痕迹。与应用层隐私协议不同,EIP-7503避免在链上存储交易轨迹,且降低了将燃烧和铸造交易与现实身份关联的难度。
EIP-7503没有提供完全的匿名和隐私,因为转移到燃烧地址的资金信息(包括转移的金额)是记录在链上的。但在交易中打破发送和接收地址之间的链接的能力是非常强大的,并减少了与地址重用相关的担忧。
用户不会使用同一地址接收付款,而是可以生成一个新燃烧地址,并要求将资金发送到此地址。由于用户知道秘密值 s,它可以生成有效的proof-of-burn,向链上验证者证明控制燃烧地址的创建,并通过将ETH铸造到其他地址上“提取”存款。这与生成隐式地址接收转账的概念非常相似,降低了不同交易与同一实体关联的机会。
我们可以看到EIP7503风格的私有转账在其他场景中会是有益的:
EIP-7503也可以用于_非隐私_理由:1. 目前,中心化交易所(CEX)必须生成一个唯一地址以接收用户的存款,并需要发送交易将每个地址的余额转移到一个或多个冷钱包,作为运营安全过程的一部分。通过EIP-7503,CEX运营商可以创建一个接收一组用户存款的单一燃烧地址,并生成proof-of-burn,将存储在燃烧地址中的所有存款一次性提取到冷钱包中。减少将CEX存款合并到冷钱包所需的交易数量,有益于CEX运营商(降低运营成本)和网络(减少链上交易数量)。
EIP-7503提供了一条简单的道路,为以太坊的交易隐私奠定基础,而不需要对协议进行广泛的修改。特别是,EIP-7503将允许以太坊在不面临其他隐私聚焦区块链(如Zcash和Monero)所面临的问题的情况下提供交易隐私。
虽然我之前为隐私币辩护,但很明显,像ZEC(Zcash)和MNR(Monero)这样的隐私币无法实现将去中心化的、私人的、_可用的_货币引入全球经济的目标。随着监管压力迫使交易所下架隐私币,拥有者会发现越来越难以利用Zcash、Monero和其他专门设计用于在现实场景中隐藏交易信息的协议提供的隐私。这段摘录来自Haseeb Qureshi的文章 为什么隐私币没有起飞,提供了关于目前硬核隐私项目所面临挑战的良好入门:
隐私币一直是监管询问的首要目标。当监管者被要求“别光站着,做点什么”时,最简单的恶人就是神秘的隐私币。在监管方面,我们看到在南韩、日本、英国和美国的隐私币下架潮。各国政府也在持续努力收紧对隐私币的监管(见这里、这里和这里)。
加密游说团体已经壮大;大量的零售和许多机构现在都持有BTC和ETH。但很少有机构愿意为隐私币辩护。与其允许整个行业被玷污,许多人更愿意让隐私币成为牺牲品。 — Haseeb Qureshi(为什么隐私币没有起飞)
EIP-7503的出现正好是以太坊演变的合适时机:拥有比任何区块链更多的用户,以及大量机构投资,以太坊不太可能遭受其他试图提供私人支付功能的项目所面临的相同命运。如果隐私铸造的ETH代币开始流通,一些交易所会限制交易以太币吗?或许。但十几家其他交易所都会乐于承担这种责任——这就是拥有_强大的网络效应_的体现。
为什么我说EIP-7503在合适的时机到来?曾经在以太坊历史上,支持基层隐私是每个人都认为应该立刻完成的事情。但社区中其他人(对此有理)指出,提升以太坊作为“隐私技术”的潜在边缘案例。在以太坊魔法师论坛上有关以太坊隐私需要的讨论中,这里有一些摘录:
Vitalik的原始论坛帖子呼吁改善以太坊用户隐私的解决方案。 (来源)
Virgil Griffith的回复,警告以太坊急于进入隐私领域。 (来源)
Griffith的直觉在随后几年内几乎总是正确的,许多以默认隐私为特色的加密货币面临成为仅由硬核密码朋克使用的边缘币种的前景(这一群体仅占全球人口的少于0.00001%)。相比之下,以太坊(ETH)的价值和普遍性只不断提升,因此“向隐私技术推动”的风险在五年前与现在相比变得更小。
如果实施隐私转账的升级——也许是为了避免反向监管捕获或最小化基本层复杂性,一个合适的替代方案是将实施EIP-7503的责任推给以太坊L2和L3。鉴于以太坊的Rollup中心路线图,在Rollup上实现EIP-7503是合理的,同时仍然保留在以太坊中确立隐私的目标(例如,类似于Rollup实施ERC-4337以实现本地账户抽象的方式)。
在Rollup上实现EIP-7503更简单,因为每个L2链已经有一个桥接合同,能够为用户在L2上铸造ETH。有了铸造ETH代币的机制,Rollup只需添加用于在链上存储nullifier和生成/验证proof-of-burn的组件,以支持EIP7503风格的私有转账。计划在其基础设施中集成EIP-7503的Layer 2(L2)链的一个例子是Taiko,如本请求意见书(RFC)所述。
这里,我们看到像Taiko这样的协议可以在不会对其基础设施进行广泛更改的情况下,通过采用EIP-7503提供交易隐私。这对不想构建一个全面注重隐私的L2(例如Aztec v2)的协议团队来说是一个关键优点,但希望为用户提供基本的不可追溯性和不可链接性。Nethermind团队关于在Taiko上实施EIP-7503的提案非常值得阅读,以便了解如何通过以太坊L2实现EIP-7503。
EIP-7503还能平衡对隐私的需求与合规性,这与以太坊“隐私 2.0”运动的目标是一致的:保护用户隐私,同时确保不法分子无法利用隐私基础设施执行不当行为。根据在以太坊研究上描述的EIP-7503的实现,采用EIP-7503的Rollup可以通过有选择地禁止已知黑客和诈骗者使用私有转账来防止重蹈Tornado Cash事件的覆辙。
为了达到这一属性,我们要求用户将黑名单地址列表(blacklist[]
)作为ZK-SNARK证明电路的输入。该电路检查接收ETH的用户地址在生成proof-of-burn时未存于黑名单中——转移至黑名单地址会自动失败,因为如果输入未满足所有有效性条件,则电路无法生成证明。
维护黑名单地址的注册引入了一定程度的中心化和潜在的审查向量。但如果我们接受社区主导的自我规范优于中心化的自我规范,确保遵守法规的这种工具可能是必要的。
透明性是DAOs(去中心化自治组织)的基石之一:与传统组织不同,传统组织的财务报酬细节对投资者和利益相关者是隐蔽的,而DAOs中贡献者的支付记录是公开的。这个链上的审计路径提供了大量的问责制,极大地减少了DAO管理员可能导致的财务管理失误的信息不对称。
然而,DAOs最终必定会发展,并开始像企业一样运作(不论好坏)——在这一点上,维持对贡献者补偿细节的私密可能变得很有吸引力。EIP-7503提供了DAOs需要的基础设施,以开始向核心贡献者、开发人员和独立承包商进行私人支付。在所有情况下,接收者只需要生成一个燃烧地址来接收付款,并提取到其选择的地址。
如果实施了私有贡献者/承包商支付,DAO成员将如何保持对管理员的问责?这取决于DAO期望获得的隐私程度以及DAO成员可以容忍的隐蔽程度。例如,为了证明AliceDAO确实向Alice支付了20 ETH作为DAO工作报酬,并且这笔资金没有用于其他目的,Alice可以提供一个证明,表明她生成了不可支配地址。
例如,Alice可能会透露用于创建不可支配地址的私钥 s。因为在铸造操作后,不可支配地址已被无效化,Alice可以在没有风险的情况下透露 s。第三方验证者将通过使用与Alice最初使用的相同密码哈希函数对 s 进行哈希来导出不可支配地址,并比较这两个地址。如果它们匹配,验证者将知道Alice在发送交易时能够访问燃烧地址。然而,它无法知道Alice用来接收铸造ETH代币的地址(在某种程度上保护了Alice的隐私)。
使用像Tornado Cash这样的混合器打破钱包地址之间的关联是有问题的,因为这会生成一种以邻为壑 的形式。请记住,混合器通过将不同用户存入的资金混在一起形成一个单一的基金,任何人都可以从中提取资金——而无需提供任何其他信息,只需认证一笔历史存款的证据。
投入隐私池的资金越多,外部观察者推测谁拥有什么就越困难;如果恶意行为者加入该池,诚实参与者可能无意中协助犯罪分子通过为协议的匿名集增添贡献而洗钱。这可能就是为什么OFAC制裁延伸(并仍在延伸)到与Tornado Cash互动的地址,即使这些地址并未与已知的不法分子相关联(例如,网络钓鱼团伙、国家资助的黑客和黑帽利用者)。
像Tornado Cash这样的混合器还会在可替代性上产生问题:从混合池中提取的代币可能会被标记为“污名化”,且无法1:1使用或兑换成立未经过混合器的“干净”代币。我推荐阅读关于“污名化资金”问题的Reddit精彩讨论。以下是来自该讨论的一些更具启发性的观点:
原文帖 (来源)
这可能会产生现实世界的后果:例如,以太坊社区中的许多知名个人发现自己无法与一些dapp前端互动,因为他们的钱包收到了来自Tornado Cash池的不请自来的ETH金额。EIP-7503被描述为“无合约混合器”,并通过使用常规EOA到EOA转移来燃烧ETH,并引入直接铸造便于从匿名池中提取资金(而不是使用智能合约)来规避上述问题。
无合约混合器的另一个好处是匿名集的大小。通过Tornado Cash(和类似协议如Railgun),匿名集较小——与参与者的数量相关,并随着时间的推移变小。相反,EIP-7503将以太坊上所有的_可支配_和_不可支配_地址组合到一个匿名集。考虑到这种大量的地址空间,可以肯定的是,针对想知道发送至私人转账接收方的ETH出自何处的链上侦探们面临艰巨任务。
找到沃尔多 > 作为链上侦探。
实施EIP-7503可能存在的一些潜在缺点:
虽然之前的分析表明,如果以太坊开始支持私人转账,则不太可能遭受与Monero和Zcash相同的命运,但实际上很难预测实施EIP-7503后会发生什么。以下是以太坊魔法师论坛上参与者对于监管者的讨论的一条评论:
作为以太坊的本地隐私解决方案,社区开始意识到在隐私/匿名性与监管合规性之间走钢索的重要性,特别是在对锁定Tornado Cash的制裁的后果之后。这一理念尤其影响着新一代隐私协议的设计,如隐私池和Nocturne:
基于智能合约的隐私解决方案,如Nocturne和隐私池,有能力实施细粒度控制,并选择性地排除被认为从事非法活动的用户。像EIP-7503这样的协议内隐私解决方案没有任何歧视,这虽然是一个理想的特征,但可能会导致问题并向不法分子滥用私有交易功能打开大门。
理论上可以通过添加前面提到的黑名单设备来改进EIP-7503,但这可能会打开潘多拉的盒子,带来一系列问题:
blacklistedAddresses
的DAO是什么?发布团队是否合同化Chainalysis、Elliptic和TRM Labs等取证公司的服务,以提供需要限制接收私有转账的地址信息?如果一家盈利公司决定如何在Rollup的基础层进行操作,会出现什么问题?这些问题只是在以太坊(或以太坊L2s)采用EIP-7503之前需要回答的一些。如果说加密仍然是未曾涉足的水域,那么在对协议长期生存产生重大影响的决策时,进行大量的墨菲思维,提前思考潜在的任何边缘案例都会是有帮助的。
不幸压得最重的往往是那些什么好运也不期待的人。 — 塞涅卡
实现EIP-7503需要对EVM进行升级,以支持一种新的交易类型,该类型接受燃烧收据并将先前交易中燃烧的ETH记入接收者余额。执行客户端也需要升级以支持用于存储nullifiers的Sparse Merkle Tree (SMT),并为用户实施生成和验证proof-of-burn的链下电路。
意识到这项升级可能不可行,EIP-7503的作者提出了一项备用提案,通过ERC-20代币合约实施EIP-7503。用户可保持与前面部分所述相同的工作流程(将资金发送到不可支配地址并生成nullifier),但在提交proof-of-burn后会铸造ERC-20代币,而非接收ETH代币。ERC-20合约通过与一个特殊的EIP-7503验证者合约集成,能够在链上验证燃烧证明(ERC-20合约也可以实施验证电路)。
虽然ERC-20合约简化了EIP-7503的实施,但这种方法重新引入了中心化和审查的问题。我们可以像Wrapped Ether (WETH)一样使ERC-20代币不可升级且无法治理,以消除中心化向量,但这不能解决交易所下架代币等问题。
此外,我们应注意,链上取证者更容易识别互动ERC-20合约的账户,并将这些地址列入黑名单——如果监管者决定追查在以太坊上流通的审核更严格的隐私币。由于这正是EIP-7503的设计目的,因此可能难以看到创建“私有ERC-20代币”的提案如何是一种改进。
另一方面,ERC-20代币将更容易实现阻止转账到黑名单地址的转账筛选功能。开发者只需在合约中存储blacklist[]
并修改transfer()
使其包含对收到交易代币的地址身份的检查。然而,这是一项我们无法在协议层面实现的功能,而不引入一些非常强大的信任假设。
实施者的迷因
同样重要的是要注意,像 ZK-SNARKs 这样的加密原语尚未经过足够的实战检验,以便协议开发人员能够以绝对的信心实施它们。举例来说,Zcash 在 2018 年修复了一个漏洞,该漏洞允许不诚实的用户提供伪造的资产所有权证明并 铸造无限数量的代币。我还讨论了 Tornado Cash 团队在 2019 年 从潜在攻击中侥幸逃脱 的情况。
EIP-7503 在以太坊上的实施中的一个漏洞会产生非平凡的影响。例如,用户意外发现一个漏洞,使其能够绕过电路验证证明(例如,燃烧地址的余额和无效Token的使用)所进行的关键检查,可能会利用这一知识铸造无限数量的以太币,并冲击 ETH 的市场价值。
另一个复杂的领域来自于 EIP-7503 验证器需要验证用户生成的证明中包含的区块头 B 的要求。EVM 存储最后 128-256 个区块的哈希,因此链上的验证器无法无信任地验证来自更长范围的区块头。
要验证旧区块的状态根,需要实现 EIP-210。EIP-210 提议创建一个系统级智能合约来存储历史区块哈希,并重构 BLOCKHASH
操作码,以便客户端能够读取该合约。
EIP-210 并不严格必要,因为用户至少有一个小时(14 秒 * 256 个区块
)来生成和提交可以用 EVM 验证的证明。尽管如此,给用户自由延迟将发送到燃烧地址的存款赎回,提高用户体验,并使提款过程更能抵御地址聚合及类似的分析技术。
另一种选择是集成一个预言机合约,要求(激励的)参与者向链上合约提交历史区块头。这比创建一个系统级智能合约和重构操作码要容易实现,但需要信任预言机操作员 (a) 发布正确的区块头 (b) 及时提交区块头。如果这两个假设都未能成立,诚实用户可能无法赎回存款,而不良行为者可能会发布错误的区块头以验证非存在的燃烧交易的 Merkle 证明。
当 EIP-7503 激活时,在区块 #11000 上铸造 ETH 的用户的匿名性集合将包括所有具有正 ETH 余额且没有发送交易的以太坊 EOAs。这对于匿名交易的不可追溯性属性至关重要:如果一笔交易燃烧 ETH,则无法将其识别为燃烧交易,因为不可支配的地址看起来像一个正常的以太坊地址。
然而,账户余额保持静态且没有发送交易的地址数量将减少到只有燃烧地址构成匿名性集合的程度。因此,匿名性集合开始看起来像基于合约的混合器(如 Tornado Cash)和新一代隐私工具(如 Privacy Pools 和 Railgun)的匿名性集合(这意味着 EIP-7503 的隐私保护逐渐减弱)。
唯一的例外是那些因发送者不小心将资金转移到不存在的地址而接收 ETH 的账户,这些账户将永远留在 EIP-7503 的匿名性集合中。我们可能希望将因账户所有者丢失私钥而导致的地址视为匿名池的一部分,但这(幸运的是和不幸的是)很少发生,这些账户通常至少有一笔或更多的外发交易。(很难想象一个新手用户在进行 任何 交易之前就会丢失私钥。)
尽管匿名性集合减少,EIP-7503 对于它提供的合理否认依然有用。假设某人在加密 Twitter 上扬起风潮,指控 Alice 故意燃烧 ETH(通过发送到一个不可支配的地址)以图后期将资金提取到新地址。Alice 有合理的否认,她可以反驳这一指控,声称:
这些主张可能未能说服,但这就是合理否认在现实世界中的表现。法律词典 是这样定义的:
“合理并不意味着可信、可能甚至很可能。合理意味着你可以得出某事可能发生或不可能发生的结论。但通常是以理论、表面的或者可疑的方式。它不一定得是一个‘合理’的结论。在其最广泛的意义上,这个术语通常指向缺乏证据。毕竟,无罪推定是我们法律系统的基础。”
因此,如果没有证据,就合理地可以否认。基本上,任何非法或不道德的行为,只要可以以 innocent 和 probable 的方式解释开来——无论是真是假——都属于合理否认。即使否认的可信性存疑。”
用户唯一可以与 EIP-7503 私密转账决定性联系的时刻是在向收款人地址处理转账的时刻。然而,用户可以采取措施减少或完全消除外部观察者将赎回交易与燃烧交易联系起来的可能性:
注意:第二种技术是对 EIP-7503 的提议扩展,似乎在当前设计中不可行。为了让用户能够拆分提款,有必要实现拆分无效Token的功能,使得 nullifier 1
授予铸造燃烧地址余额一部分的权利,nullifier 2
授予铸造余额另一部分的权利等等。
EIP-7503 是针对以太坊一个最被低估问题的解决方案:缺乏财务隐私。如果以太坊有一天要取代银行,它需要提供用户目前在现状中享有的隐私级别。低于这个水平,以太坊将无法达到大规模采用,因为放弃隐私——即使是为了获益而规避审查——也是大多数人无法承受的牺牲。
EIP-7503 仍在审核阶段,可能会经历变化和性能改进。除了未来支持部分金额提款外,一个有用的功能是允许用户将多个燃烧证明递归地合并为一个单一的 SNARK,以便在一个验证交易中验证对不同燃烧地址的存款。这个功能进一步增强了 EIP-7503 对希望保持每个用户存款唯一地址而不必为(可能成百上千个)燃烧地址单独提交燃烧证明的中心化交易所和商家的吸引力。
普通用户也可以通过将代币发送到多个燃烧地址(而不是发送到单一不可支配的地址),并提交汇总证明和无效Token的集合来完成私密转账。通过使用多个燃烧地址,发送者可以进一步随机化交易活动,并延迟追踪燃烧交易到某个人的尝试。这与 EIP-7503 已经提供的主要好处相辅相成,例如私密自我转账、私密点对点捐赠/支付和链上 DAO 的私密薪资管理。
如果你喜欢这篇文章,可以考虑与可能觉得这篇文章有用的人分享,并订阅 Ethereum 2077 以获取更多关于 EIP 生态系统中的提案深入分析。EIPs For Nerds 将继续关注以太坊的隐私解决方案,下周的文章将深入探讨 ERC-5564,这是一个在以太坊上生成隐秘地址和发送隐秘地址交易的标准。
- 原文链接: research.2077.xyz/eip-75...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!