本文详细介绍了以太坊的两个提案ERC-5564和ERC-6538,它们旨在引入隐匿地址以增强用户在公链上的隐私性。文章深入探讨了隐匿地址的历史、现有隐匿地址协议的演变,以及ERC-5564和ERC-6538的具体实现及其带来的隐私保护优势。尽管这些协议在隐私方面显著提高了以太坊的能力,但文章也提及了可能存在的一些缺陷和挑战。
随着对公共账本上交易隐私需求的日益增加,以太坊提出了 ERC-5564 和 ERC-6538 的提案,旨在引入 隐秘地址 以增强用户隐私。
ERC-5564 于 2022 年 8 月 13 日正式提出,ERC-6538 于 2023 年 1 月 24 日提出。这些增强功能代表了在不改变以太坊核心协议的前提下,确保私密交易的重要步骤。ERC-5564 被称为隐秘地址协议(Stealth Address Protocol,SAP),ERC-6538 则名为隐秘元地址注册(Stealth Meta-Address Registry),详细内容可以通过各自的提案查阅,分别在 ERC-5564 和 ERC-6538 。
许多用户天真的认为可以依赖加密地址的无权限特性来保持匿名。然而,从本质上看,区块链的设计是公开运作的,整个交易历史对任何人都是公开可见的。这意味着,例如,任何技术能力足够的人都可以扫描一个地址的历史,并做出关于该地址拥有者的合理猜测。此外,所有交易的转账金额和目的地也都是公开的。
正是这个问题导致了门罗币(Monero,约在 2014 年 4 月)和 ZCash(约在 2016 年)的出现。与以太坊和比特币不同,门罗币和 Zcash 通过隐秘地址、环签名和零知识证明(ZKPs)等各种方法提供协议层面的隐私保护。
今天,以太坊(和比特币)依然没有在协议层面提供此类隐私功能。相反,寻求财务隐私的用户必须使用像 TornadoCash 这样的协议,以在以太坊上实现私人转账。
虽然这些隐私协议在原生 ETH 和知名 ERC20 代币上运作良好,但它们通常缺乏对 NFT 和不太知名的 ERC20 代币的支持。此外,在 TornadoCash 上,你无法自由调整希望转移的代币数量,而是必须选择 0.1、1、10、100 这四个数字之一。而且,需要注意的是,每个数值所提供的匿名性是不同的。
引入 隐秘地址 为想要在以太坊上私密交易的个人提供了更好的用户体验。
ERC-5564 是一项新提案,旨在将隐秘地址引入以太坊,并为在以太坊上构建隐私保护的金融基础设施和支付网络解锁新的机会。与其他提案(如 EIP-7503)不同,ERC-5564 并不需要修改以太坊核心协议,能够在应用层实施。
ERC-5564 提出了一个模块化的隐秘地址协议(SAP),显著改善了以前隐秘地址的方案,并给予实现者更大的灵活性。这使其成为改善以太坊财务隐私的理想解决方案。本文将深入概述 ERC-5564(隐秘地址)和 ERC-6358(隐秘元地址注册)。
具体来说,我们将:
隐秘地址 的最简单且可能是最早的例子出现在 2011 年的一篇 BitcoinTalk 论坛帖子中:
在这篇帖子中,用户名为 ByteCoin 的用户表达了他对比特币交易可追踪性的 dissatisfaction。为解决此问题,他提出了一种创新的对 Diffie-Hellman 密钥交换 的改编,该方法传统上用于在公共频道上安全地交换加密密钥。
这种改编让我们可以生成隐秘地址。隐秘地址通过让发件人为每个交易接收者生成一个独特的、基本上是一次性地址,从而提高了隐私,有效地掩盖了接收者在公共账本上的真实身份。
在详细探讨由 ByteCoin 最初提出的基础隐秘地址协议(BSAP)之前,理解基础密钥对生成过程至关重要。以下是简要回顾,以确保顺利过渡到 BSAP 的机制和重要性:
比特币(和以太坊)使用 Secp256k1 曲线和 椭圆曲线密码学 来创建 密钥对。该曲线的参数(a、b 和 p)和生成点(G)是公共信息(可以在 这里 看到)。
任何人都可以根据这些信息生成有效的密钥对。
在数学上,私钥 k、公钥 K 和生成点 G 之间的关系可以用以下表达式表示:
随着这一理解的建立,我们可以来看 ByteCoin 提案的实现。
假设 Bob 想将代币转移给 Alice,但他们希望以匿名方式进行。Bob 和 Alice 都有各自的密钥对:
BSAP 提议通过以下方式实现匿名转账:
首先,Bob 和 Alice 独立 创建一个 共享秘密。他们通过各自的私钥与对方的公钥相乘,然后对结果进行哈希处理来实现。
对于 Alice:
共享秘密(S) = Hash(a · B)
对于 Bob:
共享秘密(S) = Hash(b · A)
由于 ecMULs 是 可交换的,这意味着乘法的顺序不会改变结果(即,A × B = B × A),Alice 和 Bob 将始终获得相同的 共享秘密,尽管是独立计算的。重要的是,只有 Alice 和 Bob 可以通过各自使用对方的公钥计算此 共享秘密,从而确保他们交互的隐私和安全。
这个 共享秘密 成为隐秘地址的私钥,对应的公钥则照常推导。
共享秘密(S) = [Hash(b · A)]
隐秘地址 = S · G
隐秘地址 = [Hash(b · A)] · G
Bob 现在将其付款发送到这个隐秘地址。
在他的那一方,Alice 进行以下操作:
完成前面的步骤后,Alice 可以检查付款是否已到达,并且如果需要,可以使用 共享秘密(同时也是私钥)将资金转移到自己的钱包或其他地方。
BSAP 非常有效,但也面临一系列挑战,主要包括:
不满于 BSAP 的不足,Monero 的创建者 Nicolas Van Saberhagen(化名)在其 2013 年的 CryptoNote 白皮书 中提出了解决方案。Nicolas 基本上使用与 BSAP 相同的算法,但引入了一个关键的新变化:添加了一对 临时密钥对 来防止隐秘地址保持不变,并将控制权转移离发送者。在下一部分中,我们将探讨这种创建隐秘地址的方法。
我们将继续使用相同的例子,说明 Bob 如何将代币转移给 Alice,以解释改进的隐秘地址协议(ISAP)是如何工作的。正如前面所提到的,ISAP 与 BSAP 带有相似性 - 不同之处在于隐秘地址创建过程中添加了一对临时密钥对。该协议描述如下:
Alice 拥有一对密钥(a , A), Bob 拥有一对密钥(b, B)。与先前方法不同:
**(r, R ∋ R = r . G)**
,然后进行 ecMUL 以计算 Alice 的公钥和隐秘私钥,以生成 共享秘密。共享秘密(S) = Hash(r · A)≡ Hash(r · a · G)
共享秘密(S) = Hash(a · R) = Hash(a · r · G)
使用 临时密钥对 生成 共享秘密 允许为每次转账创建不同的隐秘地址。为了推导隐秘地址的公钥,Bob 在推导隐秘地址时将 Alice 的公钥纳入公式:
公钥(隐秘地址) = [Hash(r · A) · G] + A
这样,Bob 就有效地为自己与 Alice 之间的下一次转账生成了一个新的隐秘地址。你可能会注意到其中的微妙美妙:通过椭圆曲线乘法将 共享秘密 乘以 G(基点)可以得到曲线上的一个点,该点本质上就是 共享秘密 的公钥。另一方面,得益于数学和椭圆曲线密码学,在将表达式封装在 G(基点)括号内并简化后,我们可以找到私钥:
请注意:
共享秘密 = Hash(r · A) = Hash(a · R) = Hash(a · r · G)
A = a · G
s(私钥)· G(基点) = G · (共享秘密 + a)
s(私钥) = 共享秘密 + a
如最终操作所示,找到对应于 Bob 发送地址的私钥的惟一方法是知道 Alice 的私钥。这消除了 Bob 在以前方法中对发送资产的控制权,意味着现在只有 Alice 能控制发送的资产。
通过 ISAP,Nicolas Van Saberhagen 改进了 BSAP 的设计,并提供了一个更可用的协议。然而,这种生成和使用隐秘地址的新方法也存在一些缺点:
前述问题显著限制了这种方法的实际可用性。为了解决这个问题,一位化名开发者 rynomster/sdcoin 开发了一种新的协议称为 ShadowSend。ShadowSend 与 ISAP 非常相似,但使用多个密钥对,因此被称为“双密钥隐秘地址协议”。
双密钥隐秘地址协议(DKSAP)并不从根本上改变或添加太多内容到 Nicolas 的改进隐秘地址协议(ISAP)。
正如前面所提到的,显著变化在于将责任分为两个不同的密钥对:一个用于查看隐秘地址(查看密钥对,V = v · G),另一个用于支配转移到隐秘地址的资产(支出密钥对,S = s · G),而不是使用单一密钥对管理所有事情。
这不仅解决了私钥过度使用的问题,从而降低了暴露风险,它还允许你在不放弃资金控制权的情况下委托追踪隐秘地址。接下来,以 Alice 和 Bob 的例子继续说明 DKSAP 是如何工作的(记住,Bob 试图在不泄露 Alice 身份的情况下向她发送资金)。
隐秘地址生成过程保持不变。不过,Alice 现在有两个密钥对:一个查看密钥和一个支出密钥;两个密钥都可以用数学符号表示如下:
V = v . G
,其中 v 是查看私钥。S = s . G
,其中 s 是支出私钥。以下是 Bob 如何使用 DKSAP 向 Alice 进行隐秘支付的简要描述:
E = e . G
)。然后,他使用 Alice 的查看公钥和他随机生成的临时私钥来计算一个 共享秘密:共享秘密 = Hash(e · V)= Hash(e · G · v)= Hash(E · v)
接收者的隐秘地址 = (共享秘密(私钥)· G(基点)) + S(支出公钥)
通过运用之前相同的数学技巧,我们确保只有 Alice 能控制这些资金。Bob 然后可以使用这个地址向 Alice 发送资产,而不会透露她的身份。
DKSAP 与先前协议(ISAP)之间的重要区别在于,使用查看公钥来生成 共享秘密,并用支出公钥计算隐秘地址。这种设置使得一个密钥能够生成和控制 共享秘密,而另一个密钥则能够持有和管理资金,实质上,你的查看密钥对保持隐私,而你的支出密钥对则控制所有权。
要跟踪隐秘地址转账,你需要在一定时期内监视链上转账并检查它们所有的 共享秘密。正如你所想象的,这可能会很麻烦,不太友好。因此,该协议允许你委托对向你进行的转账进行跟踪,从而消除失去控制资金的风险。不过,必须小心,因为执行这一任务的实体显而易见能够看到每笔转账的接收者,这可能会将你的匿名性置于风险之中。
到目前为止,我们讨论了不同的隐秘地址协议设计方法。虽然像门罗币这样的区块链实现了隐秘地址,但以太坊上隐秘地址的使用仍然有限,除了像 Umbra Cash 这样的应用。Umbra Cash 于 2020 年推出,使用 DKSAP,允许用户在以太坊上进行隐秘支付;自上线以来,Umbra Cash 促进了大量私人付款,突显了对以太坊上隐私保护交易的需求。
尽管 Umbra Cash 是一次成功的实验,但由于缺乏生成和与这些地址交互的标准化,隐秘地址在以太坊的采用受到限制。ERC-5564 针对这些挑战,通过标准化隐秘地址的非交互式生成来解决。
这一增强显著提升了隐私能力,使得交易在发送者可以使用仅由他和接收者知道的 共享秘密 生成隐秘地址的情况下进行。只有持有必要私钥的接收者可以访问这些资金,确保观察者无法将隐秘地址与接收者的身份联系起来。
ERC-5564 引入了以下功能:
在接下来的部分中,我们将更详细地探讨 ERC-5564 的规范。
ERC-5564 是一种合约标准,利用双密钥隐秘地址协议(DKSAP)和(可选)改进的隐秘地址协议(ISAP)。该标准允许地址将其隐秘元地址 - 包括支出和查看公钥 - 存储在合约中,使其他人可以在无需解密其身份的情况下向它们进行转账。有趣的是,根据 ERC-5564,你并不一定需要将隐秘元地址分为支出和查看组件;契约可以仅用一个密钥管理一切。然而,未来对隐秘地址的使用可能会涉及双密钥配置。
ERC-5564 与以往标准的一个主要方法差异是,在试图确定转账给你的内容时使用了一个变量称为 查看标签。这个 查看标签 通过选取生成的共享秘密的最高有效字节获得,并在转账时包含在 公告 事件中。对于一个普通用户尝试通过手动测试 公告 来解密其转账,通常需要进行五个操作:
有了 查看标签,用户只需执行 1 次 ecMUL 和 1 次哈希操作即可识别正确的转账,从而使分析(或转账识别)阶段的速度提高六倍。尽管使用 查看标签 显示出 共享秘密 的 1 字节,将 128 位安全级别降低到 124 位,但它让用户免于在 255 次中执行剩下的三次操作(ecMUL、HASH 和 ecADD)。减少 4 位仅稍微影响隐私,并不会影响 隐秘地址 的生成。
与其他标准相比,合约标准的实现并不复杂,主要由一个持有密钥的映射、一个创建隐秘地址的函数和一个 公告 事件组成。让我们来看一下每个组成部分:
创建功能,顾名思义,简单地代表 Bob 执行双密钥和改进隐秘地址协议的步骤,为他生成一个转发给 Alice 的隐秘地址。
合约中的 公告 事件在向隐秘地址进行转账时触发。这使链下参与者能够监控这些 公告 以检查是否有转账发送给他们。
除了这些实现细节外,ERC-5564 还引入了一种新地址格式,以区分隐秘地址与普通地址:
s t :< s h o r t N a m e >: 0 x < s p e n d i n g P u b K e y >:< v i e w i n g P u b K e y >
在这里,“shortName” 指定生成隐秘地址的网络,指示转账将在哪里发生。尽管加密规则和方程在各种网络中保持不变,但用户可以依据网络随意更改其隐秘元地址,因此在格式中包含网络变量变得至关重要。其余字段代表公钥,其中前 n 字节管理资金,后续字节用于验证你是转账的受益人。
ERC-5564 的另一个显著特征是支持通过 schemeIDs 使用多种椭圆曲线。虽然 ERC-5564 主要支持流行的 Secp256k1 曲线,但支持多条曲线的灵活性确保协议具有前瞻性,为用户提供选择,从而提高了协议的可用性和接受度。
ERC-6538 与隐秘地址相关,但并不引入创建隐秘地址的逻辑;相反,它主要充当登记处。这意味着它便于存储隐秘元地址。
这个登记处至关重要,因为它使发送者能够访问这些元地址,让他们为接收者生成正确的隐秘地址,确保交易既私密又正确地指向。尽管 ERC-5564 已经包括了用于存储密钥的映射,ERC-6538 的不同之处在于允许实体在不进行链上交互的情况下代表用户注册隐秘元地址,仅使用用户的签名。
在链上交互通常被委托给像 Bundlers (在 ERC-4337 中)这样的参与者的时代,由于用户体验方面的考虑,用户直接注册他们的隐秘元地址并不理想。因此,通过签名注册隐秘元地址的能力是一项有价值的特性。显然,ERC-6538 并不是一个独立的 EIP,而是对 ERC-5564 的扩展,增强了其功能。
如 Nocturne、Railgun、Umbra Cash 和 Fluidkey 等现实世界的实施示例展示了落实隐秘地址协议(如 ERC-5564 和 ERC-6538)所带来的好处。这些应用在以太坊区块链上提供了可观的隐私、安全性和可用性增强:
这些实现突显了隐秘地址协议的实际好处。它们提高了隐私性,使用户能够在不泄露个人身份的前提下进行交易。
此外,它们还解决了一些关键的用户关注问题,如在服务离线时能够恢复地址、处理多个地址时最小化交易费用,以及确保与去中心化应用的无缝交互。通过纳入这些功能,这些平台展示了 ERC-5564 和 ERC-6538 能显著改善区块链交易的隐私和可用性。
正如所述,ERC-5564 通过隐秘地址实现私人转账。这些地址利用一个系统,其中交易在合约中被宣布,而每个公告包含一个称为 “查看标签” 的唯一标识符。观察者可以监控这些公告以探测转账何时发生。虽然这在一定程度上确保了交易隐私,但也引入潜在的漏洞。
为简化监控过程,用户可能会依赖一个集中的实体来管理用于解读来自查看标签的交易细节的 “查看密钥”。然而,这种集中的管理会带来重大风险。如果这样一个实体 - 可能是像 Metamask 或 Rabby 这样的主要钱包供应商 - 获得了对查看密钥的垄断控制,它将能够有效地追踪和索引每一笔交易。
这种集中管理不仅与区块链技术固有的去中心化原则相悖,同时也妨碍了隐秘地址的隐私,因为该实体将能够观察其管辖下所有用户之间的转账。
另一方面,若选择不授权第三方来承担查看密钥的责任,你必须亲自验证所有转账,这对于大多数最终用户而言可能不是一个吸引人的任务。而且,由于每次请求的测试依赖于公告数量,存在恶意敌手可能通过成千上万的链上公告事件来淹没系统以减缓你的风险。
虽然这一问题对于数字-only 的转账可能不是问题,但在使用隐秘地址进行实体购买时可能会显得不切实际 - 没有人希望在结账时等待 10 分钟。正如 ERC-5564 所述,实施各种收费和抵押方法可能有助于缓解这一攻击向量。
另一个重要的问题是,如果隐秘地址用于 NFT 或其他 ERC-20 代币,这些地址不能持有原生 ETH,意味着它们不能进行交易。若由接收者自己的地址向隐秘地址发送少量 ETH,then, 这将完全破坏其匿名性。因此,ERC-5564 中所述的最合理解决方案似乎是由发送者通过发送少量 ETH 来资助交易。
总之,ERC-5564 和 ERC-6538 通过使用 DKSAP 和 ISAP,为以太坊提供了宝贵的贡献,使转账给接收者的身份得以隐讳,同时不受金额或资产类型的限制。
这些协议试图通过基于合约的隐秘地址解决方案,向以太坊引入类似于门罗币和 Zcash 的隐私级别,而这在协议层面上并不原生支持。尽管存在一些显著的缺点,这些缺点预计会随着时间的推移而得到解决。
谢谢你阅读到这里。期待在下一期的《EIPs for Nerds》中再次讨论更多相关内容。
- 原文链接: research.2077.xyz/erc-55...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!