这篇文章探讨了以太坊生态系统中的隐私问题,并详细阐述了隐匿地址(stealth addresses)的机制及应用。文章介绍了隐匿地址系统的工作原理、与现存技术的比较、实现细节、以及潜在的隐私和安全问题,并讨论了量子计算对其影响及未来可能的解决方案。整体结构清晰,内容丰富。
关于隐秘地址的不完整指南
特别感谢 Ben DiFrancesco、Matt Solomon、Toni Wahrstätter 和 Antonio Sanso 提供的反馈和审阅
以太坊生态系统中最大未解决的挑战之一是隐私。默认情况下,任何共享至公有区块链的信息都是公开的。这不仅仅意味着金钱和金融交易,还包括 ENS 名称、POAPs、NFTs、灵魂绑定代币等。实际上,使用整个以太坊应用程序套件需要公开生活中的重要一部分,以供他人查看和分析。
改善这种状况是一个重要问题,大家普遍认同。然而,到目前为止,关于提高隐私性的讨论主要集中在一个特定的用例上:隐私保护转账(通常是自我转账)ETH 和主流 ERC20 代币。本帖将描述一类不同工具的机制和用例,这些工具可能在其他多种情况下改善以太坊的隐私状态:隐秘地址。
假设 Alice 想要向 Bob 发送一项资产。这可能是某种数量的加密货币(例如 1 ETH,500 RAI),也可能是一份 NFT。当 Bob 接收到资产时,他并不希望全世界都知道是他收到了它。隐藏转账发生的事实是不可能的,尤其是在链上只有一份的 NFT,但隐藏_收件人是谁_可能要更加可行。Alice 和 Bob 也很懒:他们希望支付流程与今天完全相同。Bob 将某种“地址”编码发送给 Alice(或在 ENS 上注册),该信息足以让 Alice(或其他任何人)向他发送资产。
注意,这与 Tornado Cash 提供的隐私性质不同。Tornado Cash 可以隐藏主流可替代资产(例如 ETH 或主要 ERC20s)的转账(尽管它最容易用于私下发送给自己),但在提高不常见的 ERC20s 的转账隐私方面效果很差,且根本无法为 NFT 转账提供隐私保护。
隐秘地址提供了这样的方案。隐秘地址是一个可以由 Alice 或 Bob 生成,但只能由 Bob 控制的地址。Bob 生成并保留一个 支出密钥,并用这个密钥生成一个 隐秘元地址。他将这个元地址传递给 Alice(或在 ENS 上注册)。Alice 可以在这个元地址上执行计算,生成一个属于 Bob 的 隐秘地址。然后,她可以向这个地址发送她想发送的任何资产,Bob 将完全控制这些资产。与此同时,她在链上发布一些额外的加密数据(一个 临时公钥),帮助 Bob 确定这个地址属于他。
换个角度看,隐秘地址提供了与 Bob 为每一笔交易生成新地址相同的隐私特性,但不需要 Bob 进行任何交互。
隐秘地址方案的完整工作流程可以如下所示:
m
) 和 隐秘元地址 (M
)。M
作为 bob.eth
的隐秘元地址。bob.eth
。Alice 在 ENS 上查找他的隐秘元地址 M
。r
,并且她只使用一次(用于生成这个特定的隐秘地址)。这一切依赖于密码学的两种技巧。首先,我们需要一对算法来生成 共享密钥:一个使用 Alice 的秘密(她的临时密钥)和 Bob 的公钥(他的元地址)、另一个使用 Bob 的秘密(他的根支出密钥)和 Alice 的公钥(她的临时公钥)。这可以通过多种方法实现;Diffie-Hellman 密钥交换 是现代密码学的开创性成果之一,刚好实现了这一目标。
但是,仅仅有共享密钥是不够的:如果我们仅使用共享密钥生成私钥,那么 Alice 和 Bob 都能从这个地址支出。我们可以就此止步,让 Bob 将资金转移到新地址,但这样效率低下,且不必要地降低了安全性。因此我们还添加了一个 密钥模糊机制:一对算法,通过该算法 Bob 可以将共享密钥与他的根支出密钥相结合,而 Alice 可以将共享密钥与 Bob 的元地址结合,以便 Alice 能够生成隐秘地址,而 Bob 能够生成该隐秘地址的支出密钥,所有这一切都不会在隐秘地址与 Bob 的元地址之间(或一个隐秘地址与另一个隐秘地址之间)创建公开链接。
使用椭圆曲线密码学的隐秘地址最初是在比特币上下文中由 Peter Todd 在 2014 年 提出的。这一技术的工作原理如下(假设你对基本的椭圆曲线密码学具有先验知识;请参见 这里、这里 和 这里 的一些教程):
m
,并计算 M = G * m
,其中 G
是为椭圆曲线约定的生成点。隐秘元地址是 M
的编码。r
,并发布临时公钥 R = G * r
。S = M * r
,而 Bob 也可以计算出相同的共享密钥 S = m * R
。P = M + G * hash(S)
。p = m + hash(S)
。这满足了我们上述所有的要求,并且相当简单!
甚至存在一个 EIP,试图为以太坊定义一个隐秘地址标准,该标准既支持这种方法又给用户开发其他方法(例如,支持 Bob 拥有单独的支出和查看密钥,或使用不同的密码学来实现抗量子安全)提供空间。现在你可能会认为:隐秘地址并不是太复杂,理论基础已经扎实,推广它们只是一个实现细节。然而,问题在于,真正有效的实现需要克服一些比较大的实现细节。
假设有人给你发送了一份 NFT。出于隐私考虑,他们将其发送到你控制的隐秘地址。在扫描链上的临时公钥后,你的钱包会自动发现这个地址。你现在可以自由证明 NFT 的所有权或将其转移给其他人。但是,有一个问题!该账户中的 ETH 为零,因此没有办法支付交易费用。即使 ERC-4337 代币付款人 也无法使用,因为这些仅适用于可替代的 ERC20 代币。而且你无法从主钱包向其发送 ETH,因为这样会建立一个公开可见的链接。
有一种“简单”方法来解决这个问题:只需使用 ZK-SNARKs 转移资金以支付费用!但这会消耗大量Gas,仅仅完成一次转账就会增加数十万的Gas费用。
另一种巧妙的方法涉及信任专门的交易聚合器(在 MEV 术语中称为“搜索者”)。这些聚合器允许用户一次性支付购买一组“票据”,这些票据可以用于支付链上的交易。当用户需要花费一个仅包含 NFT 的隐秘地址时,他们向聚合器提供其中一张票,由此以 Chaumian 模糊化 方案进行编码。这是上世纪80年代和90年代提出的中心化隐私保护电子现金方案中使用的原始协议。搜索者接受这张票并重复将交易包含在他们的捆绑中,直到交易成功地在区块中得到确认。由于涉及的资金数量较小,并且只能用于支付交易费用,因此在信任和监管问题上的复杂性远低于这种中心化隐私保护电子现金的“完全”实现。
假设 Bob 不仅仅拥有一个可以做所有事情的单一主“根支出密钥”,而是想要拥有一个单独的根支出密钥和查看密钥。查看密钥可以查看 Bob 的所有隐秘地址,但不能从中进行支出。
在椭圆曲线网络中,这可以通过一个非常简单的密码学技巧来解决:
M
现在采用的形式是 (K, V)
,编码 G * k
和 G * v
,其中 k
是支出密钥,v
是查看密钥。S = V * r = v * R
,其中 r
仍然是 Alice 的临时密钥,R
仍是 Alice 发布的临时公钥。P = K + G * hash(S)
,私钥为 p = k + hash(S)
。注意到,第一次巧妙的密码学步骤(生成共享密钥)使用的是查看密钥,而第二步巧妙的密码学步骤(Alice 和 Bob 的并行算法来生成隐秘地址及其私钥)使用的是根支出密钥。
这有许多用例。例如,如果 Bob 想要接收 POAPs,那么 Bob 可以将他的 POAP 钱包(甚至是一个安全性不高的网络界面)给予他的查看密钥,以便扫描链并查看他的所有 POAPs,而不需给予该界面支出这些 POAPs 的权限。
为了简化扫描总的临时公钥集合,可以使用一种技术为每个临时公钥添加一个 查看标签。在上述机制中实现此功能的一种方法是,使查看标签成为共享密钥的一个字节(例如,S
的 x 坐标模 256,或 hash(S)
的第一个字节)。
这样一来,Bob 只需对每个临时公钥进行一次椭圆曲线乘法以计算共享密钥,且只有在 1/256 的时间内需要进行更复杂的计算来生成和检查完整地址。
上述方案依赖于椭圆曲线,这很棒,但不幸的是对量子计算机存在脆弱性。如果量子计算机成为一个问题,我们将需要切换到抗量子的算法。有两个自然候选:椭圆曲线同态和格。
椭圆曲线同态 是一种与椭圆曲线不同的数学构造,具有线性性质,使我们能够进行类似于上述的重要密码学技巧,但巧妙地避免构造可能对量子计算机存在离散对数攻击脆弱的循环群体。
同态密码学的主要弱点在于其复杂的基础数学结构,以及可能的攻击在这一复杂性下隐藏的风险。去年的一些基于同态的协议 被攻破,但 其他协议仍然安全。同态的主要优点是相对较小的密钥大小,以及直接迁移多种基于椭圆曲线的方法的能力。
格 是一种涉及比椭圆曲线同态更简单的数学构造,并能够实现某些强大的功能(例如,全同态加密)。隐秘地址方案可以基于格构建,尽管设计最佳方案仍然是一个开放问题。然而,基于格的构造通常具有更大的密钥大小。
第三种方法是从通用黑盒原理构建隐秘地址方案:很多人由于其他原因需要的基本成分。方案的共享密钥生成部分直接映射到 密钥交换,这是公钥加密系统中的一个、呃... 重要 组件。更困难的部分是并行算法,这些算法允许 Alice 仅生成隐秘地址(而不生成支出密钥),并允许 Bob 生成支出密钥。
不幸的是,你无法用比构建公钥加密系统所需的成分更简单 的成分来构建隐秘地址。对此有一个简单的证明:可以用隐秘地址方案构建公钥加密系统。如果 Alice 想加密一条消息给 Bob,她可以发送 N 笔交易,每笔交易发往 Bob 的隐秘地址或发往她自己的隐秘地址,Bob 可以查看他收到的交易来读取消息。这一点很重要,因为 数学证明 表明仅仅用哈希无法实现公钥加密,而利用哈希可以 实现零知识证明;因此,隐秘地址无法仅使用哈希来实现。
以下是一种确实使用相对简单成分的方法:零知识证明,它可以由哈希构成,和(隐藏秘钥)公钥加密。Bob 的元地址是一个公钥加密密钥加上一个哈希 h = hash(x)
,而他的支出密钥则是对应的解密密钥加上 x
。为了创建隐秘地址,Alice 生成一个值 c
,并将 c
作为她的临时公钥发布,内容是 Bob 可以解读的加密信息。该地址本身是一个 ERC-4337 账户,其代码通过要求交易附带零知识证明来验证,证明这两个值 x
和 c
的所有权 علاقة مكان_k = hash(hash(x), c)(其中
k是账户代码的一部分)。了解
x和
c` 后,Bob 可以自己重建该地址及其代码。
c
的加密信息除了 Bob 谁也无法得知,而 k
是个哈希,所以它几乎不会透露有关 c
的信息。钱包代码本身仅包含 k
,而 c
的隐私性意味着 k
无法追溯到 h
。
然而,这要求使用 STARK,而 STARK 是相当庞大的。最终,我认为量子计算之后的以太坊世界可能涉及许多应用需要使用许多 STARKs,因此我会倡导一种聚合协议, 如这里所述 将所有这些 STARKs 组合成一个单一的递归 STARK 以节省空间。
我一直以来都是 社交恢复钱包 的粉丝:那些具有多重签名机制的钱包,密钥在某种组合中共享于机构、你的其他设备和朋友之间,只要这些密钥的超级多数可以在你丢失主密钥的情况下恢复对你帐户的访问。
但是,社交恢复钱包与隐秘地址的配合并不理想:如果你必须恢复帐户(意味着更换控制帐户的私钥),你还必须执行某些步骤来更改你的 N 个隐秘钱包的帐户验证逻辑,这将需要 N 交易,花费高额费用、降低便利性和隐私。
在一个多层协议的世界中,社交恢复的互动存在类似的担忧:如果你在 Optimism、Arbitrum、Starknet、Scroll 和 Polygon 上有账户,并且这些滚动中可能有数个平行实例以进行扩展,而你在每个实例上的账户更改密钥可能会是一项非常复杂的操作。
一种方法是咬紧牙关,接受恢复是稀少的,并且恢复的过程比较昂贵和痛苦也没关系。也许你可以设计一些自动化软件在两周的时间内随机间隔将资产转移到新隐秘地址,以减少以时间为基础的链接的效果。但这远远不算完美。另一种方法是通过秘密分享根密钥,而不是使用智能合约恢复。然而,这会削弱去停用 一个看护人在协助恢复帐户时的权力,因此从长远来看是有风险的。
一种更复杂的方法涉及零知识证明。考虑上述基于 ZKP 的方案,但按如下逻辑进行修改。帐户不会直接持有 k = hash(hash(x), c)
,而会持有一个关于 k
在链上位置 的(隐藏)承诺。从该账户支出时,必须提供一个零知识证明,证明 (i) 你知道匹配该承诺的链上位置, (ii) 那个位置的对象包含某个值 k
(你不揭示),以及你有一些 x
和 c
的值,使得 k = hash(hash(x), c)
。
这使得多个帐户,即使跨越多个层协议,可以由某个值 k
在某处(在基础链或某个层级)控制,这样更改该值即可更改所有账户的所有权,而无须揭示帐户之间的链接。
基本的隐秘地址可以在今天相对快速地实现,并可能极大地推动以太坊的用户隐私。这确实需要在钱包方面做一些工作以支持它们。也就是说,我认为钱包应该开始朝着更本地化的多地址模型(例如,为每个交互的应用程序创建新地址可能是一种选择)迈进,出于其他隐私相关的原因。
然而,隐秘地址确实引入了一些长期的可用性担忧,例如社交恢复的难度。现在可能还挺好,简单接受这些担忧,例如通过接受社交恢复要么会降低隐私,要么会在将恢复交易缓慢释放给各种资产(这可以通过第三方服务处理)方面有两周的延迟。从长远来看,这些问题可以解决,但长远的隐秘地址生态系统似乎确实会非常依赖于零知识证明。
- 原文链接: vitalik.eth.limo/general...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!