最后更新:
EIP-7702 是一项 以太坊 改进提案,它允许外部账户 (EOA) 在保留其地址和私钥的同时,将代码执行委托给现有的 智能合约。该提案由 Vitalik Buterin、Sam Wilson、Ansgar Dietrichs 和 lightclient 创建,并于 2025 年 5 月 7 日作为以太坊 Pectra 升级的一部分被激活。[1][2]
这种委托关系会一直持续,直到被替换或清除。它允许 EOA 在不转移资产或更改地址的情况下,使用由委托代码实现的功能,例如批量处理和赞助交易(sponsored transactions)。[1][3]
该提案于 2024 年 5 月 7 日作为 EIP-7702 “为 EOA 设置代码”发布,旨在为 EOA 带来账户层面的用户体验特性。其设定的优先事项包括批量操作、交易赞助以及限制子密钥的权限。[1]
EIP-7702 被描述为 EIP-3074 的继任者,旨在解决早期提案中提出的局限性和安全问题。[2] 该提案的作者更倾向于持久化委托,而非在每笔交易结束时清除代码的早期设计。他们认为,重复且简单的授权可能会鼓励将 EOA 脚本作为一种独立的用户体验模式,而不是促进其与智能合约钱包的融合。[1]
EIP-7702 将 EOA 指向已部署在另一个地址的代码,而不是在授权中放置任意字节码。作者估计,一个最小代理大约需要 50 字节,而地址指针仅需 20 字节,且后者不会为委托机制增加无用的功能。[1] 该提案不将初始化代码作为委托的一部分运行;设置必须在随后的调用中进行,这避免了引入新的执行模式,但也使得设置过程变为非原子性。[1]
该设计旨在与未来的账户抽象协同工作。委托代码可以指向现有的 ERC-4337 钱包代码,允许 EOA 通过现有的 EntryPoint 参与 ERC-4337 捆绑交易。EIP-7702 没有增加操作码,也没有将详细的 ERC-4337 或 RIP-7560 机制纳入协议本身。[1]
EIP-7702 引入了交易类型 0x04,称为设置代码交易(set-code transaction)。它包含常规交易字段、访问列表(access list)以及一个非空的授权列表;该交易类型排除了合约创建和 blob 交易,且目标地址为空(null)是无效的。[1] 每个授权项是一个由链 ID、委托地址、账户 nonce 和签名值组成的元组:[chain_id, address, nonce, y_parity, r, s]。[1]
授权方对授权参数的哈希值进行签名:keccak(0x05 || rlp([chain_id, address, nonce]))。链 ID 为零允许该授权跨链应用;特定链的 ID 则将其限制在该链。Nonce 将授权与账户的当前状态绑定,有助于防止重放攻击。[1][3]
在处理过程中,链会检查授权的链 ID 是否为零或与当前链匹配、其签名是否有效,以及授权方的 nonce 是否与签名的 nonce 匹配。授权方必须没有代码或已被委托。有效的授权会将授权方的代码设置为一个 23 字节的委托指示器,该指示器由前缀 0xef0100 和目标地址组成,然后增加其 nonce。[1] 指向零地址的授权会清除该指示器。处理过程中会跳过无效的授权并继续执行,如果多个有效授权涉及同一个授权方,则以最后一个授权决定其代码。[1][3]
该指示器使用 0xef 字节标记委托账户,EIP-3541 禁止在普通代码中使用该字节。当代码执行操作到达委托账户时,Ethereum 会从目标地址加载代码,但在授权方的账户上下文中执行。解析仅遵循一级委托指针,以防止委托链;如果目标是另一个委托账户,解析将停止,而指向预编译合约的目标将解析为空代码。[1]
委托不会导致代码检查操作将授权方视为拥有目标地址的代码。
例如,在授权方上执行 EXTCODESIZE 和 EXTCODECOPY 会观察到 23 字节的指示器,而 CODESIZE 和 CODECOPY 则指代当前正在执行的代码。[1] 即使外部交易执行随后失败,委托指示器仍会保留。[1]
基础授权成本为每个授权 12,500 gas,涉及空账户的授权最高额外收费 25,000 gas;当授权方已非空时,处理过程会退还 12,500 gas。从冷账户解析委托代码会增加 2,600 gas 的冷账户读取成本,热读取则为 100 gas。[1]
委托代码可以启用多种钱包功能。EIP-7702 支持在一个交易中原子化地批量执行多个操作,例如将授权(approval)与代币交换(token swap)结合。它还可以支持第三方支付交易费用、通行密钥(passkeys)等替代身份验证方式、支出限制以及无需更换新地址的账户恢复。[2][1]
授权本身并不强制执行细粒度的权限:该 EIP 警告称,委托代码对账户拥有不受限制的访问权限。诸如会话密钥或支出限制之类的限制必须由委托钱包代码或其模块来实现。[1][3] 在委托之后,EOA 的私钥仍保留完全控制权,因此将权限委托给多重签名钱包合约本身并不会将 EOA 变成多重签名账户;私钥仍然可以绕过该合约的签名策略。[3]
Ethereum.org 建议委托合约应符合账户抽象标准,并理想地支持 ERC-4337。它还建议避免依赖单一中继器(relayer),因为中继器的故障可能会导致账户无法使用依赖中继器的功能。EOA 可以自行执行批量操作,而 gas 抽象和隐私保护提现等功能则需要中继器。[3] 该指南推荐使用 EntryPoint 0.8 或更高版本的 ERC-4337 捆绑器(bundlers),理由是其具有标准化的中继接口、内置的支付主(paymasters)以及与未来开发的兼容性。[3]
对于 dApp 请求,Ethereum.org 指向了用于批量调用的 ERC-5792 wallet_sendCalls 接口(包括带有 gas 抽象的批量调用),以及用于会话密钥和恢复等模块化钱包功能的 ERC-6900。它推荐使用标准化的钱包接口,因为预计钱包会将委托合约列入白名单,且目前尚无 dApp 请求 EIP-7702 授权签名的标准化直接方法。[3]
Alchemy 的钱包 API 默认支持 EIP-7702 委托。其交易 API 可以准备授权、请求所需的签名,并将委托与预定调用一并提交;初始委托需要授权签名和交易签名,而后续交易仅需要交易签名。[4] 对于通过这些 API 创建的新账户,Alchemy 的默认委托对象是 Modular Account v2 v1.1.0;现有账户将保留其记录的委托,除非请求了不同的支持版本,且委托将一直保持直到被替换或清除。[4] Alchemy 还支持不使用 EIP-7702 的独立智能合约账户选项。[4]
EIP-7702 改变了关于 EOA 的假设。
被委托的 EOA 可以发起交易、接收调用并在一个交易中执行多个调用;其余额也可以通过源自另一个账户的交易进行更改。因此,该提案修改了 EIP-3607,后者此前限制带有代码的 EOA 发起交易。\[1\]\[3\]
由于委托执行可能使 msg.sender 在交易顶层帧之外的调用上下文中等于 tx.origin,因此合约不能安全地依赖该等式作为重入保护措施。Ethereum.org 建议使用显式保护,例如经过审计的 nonReentrant 修饰符或瞬态存储变量。\[1\]\[3\] EIP 作者将依赖 tx.origin 进行此类保护的行为定性为不良实践。\[1\]
委托代码可以对账户资产行使广泛的控制权,因此该提案和 Ethereum.org 都建议在签名之前仔细审查目标。易受攻击的初始化流程也可能被抢跑:如果初始化与委托耦合,获取授权的人可能会先使用修改后的参数调用初始化。建议的缓解措施包括要求对初始化参数进行签名,或将初始化限制在 ERC-4337 EntryPoint。\[1\]\[3\]
委托不会清除现有的 EOA 存储。如果新代码为早期代码使用的插槽分配了不同的含义,保留的数据可能会导致非预期行为;EIP 讨论了命名空间存储(如 ERC-7201),作为减少升级期间存储冲突的一种方法。\[1\]\[3\] Ethereum.org 还警告说,不受保护的代理初始化程序可能导致账户被接管,并建议使用极简、可审计的委托逻辑以及安全的构造函数和初始化程序。\[3\]
使用链 ID 为零的通用授权可以应用于各个以太坊虚拟机(EVM)链。因此,Ethereum.org 建议对此类委托使用不可变目标而非代理,并警告不要使用其代码在不同链上相同地址处可能存在差异的合约。\[3\] 它还建议钱包在签名期间清晰显示委托目标;硬件钱包 则可以考虑将委托限制在受信任合约的白名单内。\[3\]
赞助交易带来了额外风险。如果账户通过增加其 nonce 使授权失效,或转移了预定用于偿付的资金,中继者可能会在没有补偿的情况下消耗 gas;EIP 建议中继者考虑保证金或声誉系统。\[1\] 委托代码还可能以使其他待处理交易失效的方式更改余额或 nonce。该提案建议客户端对于具有非零委托指示符的 EOA,接受不超过一个待处理交易。\[1\]
在激活后的几周内,出现了一种专门的网络钓鱼方法。研究发现,以太坊 (Ethereum) 主网 (mainnet) 上大量的 EIP-7702 委托指向了旨在窃取钱包资金的恶意合约。[2]
币安学院 (Binance Academy) 报告称,MetaMask 等钱包提供商会标记可疑授权,并建议用户对待委托目标应像分享助记词 (seed phrase) 一样谨慎。[2]
Ethereum.org 警告称,使用中继器可能会泄露用户的 IP 地址,而公共内存池 (mempools) 会让人难以确定交易或 UserOperation 是源自传播它的 IP 地址,还是通过点对点网络转发的。[3] 它建议采用注重隐私的设计,例如使用 ERC-20 代币支付 Gas 费、一次性会话密钥以及在链上验证签名的离线授权委托。[3]
钱包支持情况各不相同。Alchemy 报告称,MetaMask 允许通过其界面委托给自己的合约,但不支持签署任意的 EIP-7702 授权有效负载;使用 MetaMask 的应用程序可能需要改用钱包原生功能,如 ERC-5792 批量处理。[4] 在 Monad 上,Alchemy 对 EIP-7702 的支持处于白名单状态,且根据文档条件,委托账户必须保持至少 10 MON 的余额。[4]