Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-5003: 通过AUTHUSURP将代码插入EOA

允许通过部署代码来代替外部拥有账户,从而摆脱ECDSA。

Authors Dan Finlay (@danfinlay), Sam Wilson (@SamWilsn)
Created 2022-03-26
Discussion Link https://ethereum-magicians.org/t/eip-5003-auth-usurp-publishing-code-at-an-eoa-address/8979
Requires EIP-3074, EIP-3607

摘要

本EIP引入了一个新的操作码AUTHUSURP,它在EIP-3074授权的地址上部署代码。对于外部拥有账户(EOA),结合EIP-3607,这有效地撤销了原始签名密钥的权限。

动机

目前,EOA在以太坊区块链上持有大量用户控制的价值,但协议在各种关键方面对其进行了限制。这些账户不支持轮换密钥以提高安全性、批量处理以节省 gas 或赞助交易以减少持有以太币的需求。拥有合约账户或账户抽象还有无数其他好处,例如选择自己的身份验证算法、设置支出限制、启用社交恢复、允许密钥轮换、任意地和传递地委派能力,以及我们能想到的几乎所有其他事情。

新用户可以使用智能合约钱包来获得这些好处,并且新的合约可以采用最新的标准来启用应用层账户抽象(例如 EIP-4337),但是这些会忽略绝大多数现有以太坊用户的帐户。这些用户今天存在,他们也需要一条实现其安全目标的途径。

这些额外的好处主要来自 EIP-3074 本身,但有一个明显的缺点:原始签名密钥对账户具有最终权限。虽然 EOA 可以将其权限委托给一些_额外_的合约,但密钥本身会继续存在,继续提供攻击向量,以及一个持续令人恐惧的问题:我是否被泄露了?换句话说,EIP-3074 只能将权限授予其他参与者,但永远无法撤销它。

今天的 EOA 无法选择轮换其密钥。泄露的私钥(无论是通过网络钓鱼还是意外访问)都无法撤销。谨慎的用户如果担心其密钥安全,可能会迁移到新的助记词,但这最多需要每个资产进行一次交易(使其非常昂贵),而且在最坏的情况下,某些权力(例如智能合约中的硬编码所有者)可能根本无法转移。

我们知道 EOA 无法提供理想的用户体验或安全性,并且社区中存在将规范更改为基于合约的账户的愿望,但是如果在设计该过渡时没有考虑到当今绝大多数用户(对于他们而言,以太坊始终意味着 EOA),我们将不断努力支持这两个用户群。本 EIP 提供了一条不是为了强化 EOA,而是为了彻底摆脱它们的迁移路径。

该提案与 EIP-3074 很好地结合在一起,但又与它不同,后者提供了可以使任何外部拥有账户 (EOA) 将其签名权限委托给任意智能合约的操作码。它允许 EOA 授权合约账户代表其行事_而不放弃其自身权力_,而本 EIP 提供了摆脱 EOA 原始签名密钥的最终迁移路径。

规范

本文档中的关键词“必须”,“禁止”,“需要”,“应该”,“不应该”,“推荐”,“可以”和“可选”应解释为 RFC 2119 中所述。

约定

  • top - N - EVM堆栈上第N个最近推送的值,其中top - 0是最近的值。
  • 无效执行 - 无效的执行,必须立即退出当前执行帧,消耗所有剩余的 gas(与堆栈下溢或无效跳转的方式相同)。
  • 空账户 - 余额为0,nonce为0且没有代码的账户。

AUTHUSURP (0xf8)

一个新的操作码 AUTHUSURP 应在 0xf8 创建。它应获取两个堆栈元素并返回一个堆栈元素。

输入

堆栈
top - 0 offset
top - 1 length

输出

堆栈
top - 0 address

行为

AUTHUSURP 的行为与 CREATE (0xf0) 相同,但如下所述:

  • 如果 authorized (如EIP-3074中所定义) 未设置,则执行无效。
  • 如果 authorized 指向一个空帐户,则 static_gas 仍然是 32,000。否则,static_gas 应为 7,000。
  • AUTHUSURP 不检查 authorized 帐户的 nonce。
  • initcode在地址 authorized 运行。
  • 如果 initcode 没有返回任何字节,则必须恢复其执行帧,并且 AUTHUSURP 返回零。
  • 在执行 initcode 之后,但在部署返回的代码之前,如果帐户的代码为非空,则必须恢复 initcode 的执行帧,并且 AUTHUSURP 返回零。
  • 代码被部署到地址为 authorized 的帐户中。

理由

AUTHUSURP 不检查 authorized 帐户的 nonce,因为它必须与之前已发送交易的帐户一起使用。

当使用 AUTHUSURP 时,如果 initcode 部署一个零长度合约,则将无法阻止以后再次使用 AUTHUSURP

必须在部署之前立即检查帐户的代码,以捕获 initcode 尝试在同一地址 AUTHUSURP 的情况。这对于其他部署指令是不必要的,因为它们会递增并检查帐户的 nonce。

向后兼容性

AUTHUSURP 与 EIP-3607 撤销了原始 ECDSA 签名从帐户发送交易的权限。这是一种全新的行为,尽管它与 CREATE2 操作码有些相似。

安全注意事项

在交易之外使用 ECDSA 签名的合约不会意识到被篡夺的帐户不再受私钥控制。这意味着,例如,私钥将_始终_有权访问令牌合约上的 permit 函数。这可以—并且应该—通过修改 ecrecover 预编译合约来缓解。

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

Dan Finlay (@danfinlay), Sam Wilson (@SamWilsn), "EIP-5003: 通过AUTHUSURP将代码插入EOA [DRAFT]," Ethereum Improvement Proposals, no. 5003, March 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5003.