什么是 EIP-7702 委托?EOA 智能账户详解

更新时间 2026-10-30 06:09:35
阅读时长: 5m
EIP-7702 委托会将 EOA 的代码字段写入为 0xef0100 加上受委托地址,使该账户在保留自身地址和私钥的同时,在其自身上下文中运行受委托方的代码。类型为 0x04 的交易会携带授权元组,委托将持续有效,直至被覆盖或撤销。

EIP-7702 委托允许外部拥有账户(EOA)在不更改地址或交出私钥的情况下,将其执行逻辑交由另一份合约处理。代码字段会被设置为 0xef0100 加上委托地址,后续调用会在 EOA 自身的上下文中运行该代码,余额、Nonce 和存储仍归该账户所有。

本文适合已了解自托管钱包和 EVM 账户模型的读者。以太坊长期以来有两类账户:由私钥控制的 EOA,以及包含代码的合约账户;只有后者能够承载自定义验证逻辑,但代价是需要使用新地址。该功能随 Pectra 升级上线,将自定义验证从创建新账户转变为向已在使用的地址写入代码。

一个授权元组包含 6 个字段,委托标识符占用 23 字节:3 字节前缀加上 20 字节地址。写入路径、新能力的限制、与 ERC-4337 的分工,以及委托对象是否可信,共同决定了账户在签署该授权后能保留多少控制权。

关键要点

  • EIP-7702 委托会保留地址、私钥、余额和 Nonce,仅将代码字段指向委托合约。

  • 0x04 类型交易通过授权元组写入委托;签名消息不包含费用字段,交易发送者无需是账户所有者。

  • 委托没有到期时间;撤销会清除代码,但不会清除存储、代币授权或 Permit 签名。

  • 若委托合约不包含 receive() 或 fallback(),普通 ETH 转账会回滚;而 tx.origin 也不再意味着某个账户没有代码。

  • ERC-4337 构建了独立的账户体系,而 EIP-7702 为现有 EOA 添加代码,因此两者可以叠加使用。

EIP-7702 委托会如何改变外部拥有账户?

以太坊有两类账户:由私钥控制的外部拥有账户,以及包含代码的合约账户。

在 EIP-7702 中,变化的是代码字段,而不是账户身份,因为 EOA 可以在不更改地址的情况下临时指向合约代码。地址、私钥、余额和 Nonce 均保持不变;区别在于,该地址现在承载了从另一份已部署合约获取的可执行代码。

该字段保存一个 23 字节的委托标识符:0xef0100 前缀加上 20 字节地址。当调用指向该 EOA 时,EVM 会读取标识符并加载委托合约的代码。因此,该账户可以表现得像智能账户,同时私钥仍保持控制权,发送者、余额和存储也都会被读取为该 EOA 自身的状态。

委托合约无法看到自身状态;其执行逻辑从目标合约加载,而存储和发送者上下文仍属于 EOA,写入操作会依照相同逻辑写入 EOA 之前未使用过的存储空间。

签名仍由原始私钥生成,因此该账户不会变成多签账户。该设计是迈向账户抽象的一步,包括原生账户抽象,而非改变账户类型。

0x04 类型交易与授权元组:委托如何接入合约代码

写入操作需要一种新的交易类型 0x04,其交易体包含授权列表;每个元组均由账户持有人签名,而交易本身可由任何地址发送并支付费用。授权会指定该账户允许运行哪份代码。

该元组为 [chain_id, address, nonce, y_parity, r, s],签名消息为 keccak(0x05 || rlp([chain_id, address, nonce]));EIP-7702 规范使用 0x05 前缀将授权签名与普通交易签名区分开来,且该消息不包含 Gas 或费用字段。

签署的内容是代码应指向哪个地址,而不是某笔特定交易,因此部分系统会将授权与意图一并配对。账户也可以离线签署一次,再由赞助方预付 Gas。

节点验证分为 6 个步骤,其中 Nonce 绑定使一项授权只能在匹配的 Nonce 下使用一次。

授权列表以扩展交易格式的方式包含在交易体中,类似访问列表扩展交易格式:链 ID 为 0 或与本地链一致(0 表示在任何链上均有效);Nonce 小于 2^64–1;ecrecover 验证签名;账户代码为空或已处于委托状态;Nonce 与当前值一致;随后代码会被写为 0xef0100 || address,且 Nonce 递增。

撤销遵循相同路径,只需将地址设置为零地址,即可清除代码哈希,而不会对底层 EOA 产生永久性状态变更。

哪些账户属性保持不变?

4 项属性保持不变,只有代码和存储发生变化:代码会从 0x 变为委托标识符,未使用的存储槽开始接受写入,且这些值在撤销后仍会保留。规范还单独列出了 3 项不再成立的链上不变量,涉及余额、Nonce 和调用者身份;风险部分将对此展开说明。

  1. 地址:保持不变,因此历史记录、代币授权和名称记录仍指向同一地址。

  2. 私钥:保持不变,既可签署普通交易,也可签署用于覆盖或撤销委托的新授权。

  3. 余额:保持不变,因为委托不会转移任何资产,账户仍直接持有这些资产。

  4. Nonce:持续递增,因为授权会消耗一个 Nonce,从而阻止同一签名被重放。

被委托账户还能正常接收 ETH 吗?

默认情况下不能。账户一旦承载代码,普通 ETH 转账就会进入代码执行路径;如果委托合约既未实现 receive() 也未实现 fallback(),转账将回滚,资金会退回发送者。

这一问题可能出现在交易所提现、薪资发放和空投等常见支付流程中。钱包软件通常只会显示失败,而不会说明委托合约是原因。签署前,请确认目标合约实现了接收函数,或通过携带 calldata 的调用接收付款;钱包软件也应更清晰地向用户提示这一原因。

EIP-7702 委托写入路径:EOA 签署授权元组,0x04 类型交易写入 0xef0100 委托代码,后续调用在 EOA 上下文中运行委托代码

图 1. EIP-7702 写入路径:EOA 签署授权元组,0x04 类型交易将代码设置为 0xef0100 加上委托地址,后续调用在 EOA 自身上下文中执行该代码。

被委托账户可以做什么?批处理、Gas 赞助与恢复

委托可将只能签署交易的 EOA 转变为能够为日常用户提供智能账户体验的账户,最明显的优势体现在批处理、Gas 赞助和基于规则的恢复。

批处理是最具体的优势:授权和兑换可以在一笔交易中完成。赞助方也可以通过在合适时机于后台协助完成多个步骤,优化新用户引导或批处理流程,从而让一次签名完成结算,避免中间留下未使用的授权。

Gas 赞助源于签名与发送者的分离:第三方支付费用,账户无需预先持有 ETH;若使用 ERC-4337 paymaster,费用可由应用承担。这也意味着部分应用可以通过后台处理来承担 Gas 或优化新用户引导,但开发者应避免在用户仅请求其他功能时提示其进行委托。

恢复和会话密钥依赖委托合约自行验证签名,例如使用通行密钥、监护人集合或消费限额来替代单一私钥。委托合约还可以围绕转账或签名者使用实施策略类功能。

边界很明确:持有私钥的人始终可以签署新的授权来覆盖委托,因此这里的恢复机制弱于原生智能账户,只能降低私钥丢失的成本。

委托没有到期时间。它会一直有效,直到被新的授权覆盖或被零地址撤销,因此该权限具有长期性,需要主动管理;从安全角度而言,应审查委托代码能够访问和控制的范围。

EIP-7702 委托与 ERC-4337 及账户抽象有何不同?

EIP-7702 为现有 EOA 添加代码,而 ERC-4337 构建独立的账户系统;作为账户抽象的互补方法,二者可以叠加使用,而非相互替代。

维度 EIP-7702 委托 ERC-4337 智能账户
地址来源 复用现有 EOA 地址 由工厂和 Salt 确定的新部署合约
代码载体 代码字段中的 23 字节标识符 账户合约自身的字节码
与 EntryPoint 的关系 无;通过普通交易执行 通过 EntryPoint 打包的 UserOperation 执行
迁移成本 无;一次授权即可 部署后再迁移资产和授权
签名流程 私钥签署元组;任何人均可发送 合约中的自定义验证,由 bundler 打包

ERC-4337 从新部署的合约开始,因此资产和授权需要迁移;7702 则从原始地址开始并添加代码,使现有账户无需先部署独立钱包,即可使用智能合约行为,从而避免迁移。

两者结合后,7702 账户可以作为 ERC-4337 的账户实现,开发者可在 7702 委托账户之上构建兼容 4337 的流程。这会重新引入初始化竞态:从委托生效到初始化完成之间,任何人都可以调用初始化函数并将自己设置为所有者。

有两种修复方式:使用 initWithSig,将签名绑定到初始化参数;或将初始化限制为仅由 EntryPoint 执行。

委托对象是否可信?如何验证其不可变性

应仅委托给通过标准 CREATE2 initcode 部署的不可变合约;验证机制应优先选择没有升级路径的目标,因为代理合约、可升级合约以及包含自毁路径的合约都不是理想目标。

委托会将执行权限交给该代码,账户持有人不会收到代码变更通知。可升级目标意味着升级权限持有人掌握所有委托至该目标的账户的执行权;不可变目标至少会预先固定攻击面,并可接受审计。若委托代码可在授权后发生变化,安全风险将上升。

不可变代码、非代理、可复现部署这 3 项标准,会在区块浏览器中转化为钱包和开发者应在授予委托前验证的 4 项检查:

  1. 读取实现和管理员存储槽:以 0x360894 开头的非零 EIP-1967 存储槽表明存在代理或升级路径。

  2. 将链上字节码与已验证源代码进行比较,确认构造函数参数和部署字节码一致。

  3. 搜索 selfdestruct 和 delegatecall,确认不存在可清除代码或将执行转发至其他位置的分支。

  4. 根据 initcode 和 Salt 重新计算 CREATE2 地址,确认部署者无法在其他地址替换为另一份合约。

EIP-7702 委托有哪些风险?

风险主要存在于 3 个方面:委托合约中的漏洞、委托改变的账户语义,以及一次性签名的不可逆性。它既是安全权衡,也是功能升级;核心问题在于,一旦授予授权,代码可控制账户的范围非常广泛。

风险 触发条件 后果与应对措施
委托合约存在漏洞 任意调用或提现路径 资产可能被转走;仅委托给经过审计的合约
普通转账回滚 没有 receive() 或 fallback() ETH 转入失败;通过携带 calldata 的调用转入资金
存储冲突 随时间使用不同实现 旧存储被错误读取;切换前检查存储槽布局
chain_id 设置为 0 签名时将链 ID 写为 0 签名可在其他链上有效;应按链签署
tx.origin 假设失效 基于 msg.sender == tx.origin 的重入保护 代码可在调用栈中间运行;应使用重入锁

tx.origin 这一项的影响范围最广。被委托账户可在调用栈中执行代码,因此 msg.sender == tx.origin 不再表示调用者没有代码,基于该比较构建的保护措施将失效;nonReentrant 或瞬态存储锁不依赖调用者身份。

在实际使用中,如果钱包未清晰展示授权详情,用户可能会批准其原本无意审查的访问权限。Pectra 文档中的 EIP-7702 指引对此进行了单独说明。

chain_id 为 0 会扩大第 3 类风险:同一签名可在其他 EVM 链上有效,因此账户可能会在持有人从未考虑过的链上被写入代码。签名设备通常不会显示链 ID,这正是在冷钱包上启用委托所涉及的权衡所在。

如何检查和撤销委托?

检查只需读取一次代码:eth_getCode 返回 0x 表示不存在委托;返回以 0xef0100 开头的 23 字节数据表示该账户是已委托的外部拥有账户;任何其他字节码则表示它是合约账户。

委托属于链级状态,因此一个地址可以在某条链上处于委托状态,而在另一条链上未发生变化,每条链都需要单独检查;最后 20 字节是委托对象,钱包或平台可以跨链自动执行这些检查,并保留状态检查或变更日志,以便审计和监控。

如需进行快速人工检查,检查和撤销委托提供了操作流程。

撤销在钱包内进行:使用地址字段设为零地址的新授权进行签名,节点会清除代码哈希,使账户恢复为普通 EOA。外部 dApp 通常无法代持有人执行此操作;若钱包团队支持撤销流程,任何代表持有人操作的请求仍应获得持有人本人的批准。

撤销会移除委托代码,但不会移除之前授予应用的智能合约授权或其他访问权限。OpenZeppelin 的 EOA 委托说明明确了这一边界。

总结

EIP-7702 通过一次签名为 EOA 带来可编程性:地址和私钥保持不变,代码字段指向委托对象,执行在账户自身上下文中进行。

其代价是语义变化和长期权限:普通入账可能失败,tx.origin 不再代表 EOA,chain_id 为 0 的签名可跨链使用,而撤销仅会清除代码。

常见问题

EIP-7702 会将我的钱包变成多签钱包吗?

不会。委托仅改变代码字段,签名仍由原始私钥生成,因此单一私钥持有人可以独立发起交易,也可以通过新授权覆盖委托。即使委托合约要求多个签名,也可以被该私钥绕过。

如何检查我的钱包是否已在 EIP-7702 下被委托?

对该地址调用 eth_getCode。返回 0x 表示不存在委托;返回以 0xef0100 开头的 23 字节数据表示已被委托,其中最后 20 字节指明委托对象;其他字节码表示该账户是合约账户。

委托按链记录,因此请检查每一条链;钱包或管理系统也可能保留这些检查记录以供审查。简而言之,不同钱包的界面细节可能不同,但底层代码检查方式相同。

如何撤销 EIP-7702 委托?

在钱包内使用地址字段设为零地址的新授权进行签名,验证通过后,节点会清除代码哈希。只有账户持有人可以签署该授权,外部 dApp 通常无法代表其操作。

委托会到期吗?之前的代币授权在撤销后是否仍然有效?

委托没有到期时间,会持续有效,直至被覆盖或撤销。撤销仅清除代码,存储、ERC-20 授权和 Permit 签名均不会受到影响。

我的私钥从未泄露——恶意的 EIP-7702 授权仍然可以转走账户资产吗?

可以。该签名属于权限转移:攻击者可利用它写入指向恶意合约的委托,并获得对账户的广泛访问权,在无需接触私钥的情况下转移资产。

请检查元组中的链 ID 和目标地址,并仅为不可变合约签名;钱包团队在代表组织授予内部委托相关批准前,也应验证签名者的职责范围。

作者: Jayne
免责声明

* 投资有风险,入市须谨慎。本文不作为 Gate 提供的投资理财建议或其他任何类型的建议。

* 在未提及 Gate 的情况下,复制、传播或抄袭本文将违反《版权法》,Gate 有权追究其法律责任。

相关文章

浅谈合并:什么是以太坊2.0?
中级

浅谈合并:什么是以太坊2.0?

一场可能影响整个加密生态的升级
2022-12-14 03:56:45
stETH 代币经济学解析:Lido 如何分配质押收益与捕获价值
新手

stETH 代币经济学解析:Lido 如何分配质押收益与捕获价值

stETH 是由 Lido DAO (LDO) 发行的流动性质押代币,用于表示用户在以太坊网络中质押的 ETH 资产及其所产生的质押收益,并允许用户在质押期间继续使用资产参与 DeFi 生态。Lido DAO 的代币经济体系由两个核心资产构成:stETH 与 LDO。其中,stETH 主要用于捕获质押收益与提供流动性,而 LDO 负责协议治理与关键参数调整,两者共同构成流动性质押协议的双代币模型。
2026-04-03 13:38:12
Lido DAO 的治理机制如何运作?LDO 代币作用解析
新手

Lido DAO 的治理机制如何运作?LDO 代币作用解析

Lido DAO (LDO) 是负责管理 Lido 流动性质押协议的去中心化自治组织,通过 LDO 代币持有者投票,决定协议参数、节点运营策略以及生态发展方向。作为流动性质押赛道的重要基础设施,Lido DAO 的治理机制直接影响协议的安全性、收益结构与长期发展路径。
2026-04-03 13:37:05
如何质押 ETH?
新手

如何质押 ETH?

随着以太坊合并正式到来,共识机制将从 PoW 的算力挖矿证明过渡到 PoS 权益证明,将采用质押 ETH 的方式来维护网路正确性,以使质押者获得奖励。而质押前需做好事前准备,包括选择各种质押方式与质押服务商。 随着以太坊合并正式到来,以太坊共识机制将从 PoW 工作量证明转换到 PoS 权益证明,采用质押 ETH 的方式来维护区块链网路,以使质押者获得奖励。而质押前需做好事前准备,包括选择各种质押方式与质押服务商。那么,什么是ETH质押,如何质押ETH?
2026-04-09 07:26:15
Solana(SOL)与 Ethereum 的核心差异是什么?公链架构对比解析
中级

Solana(SOL)与 Ethereum 的核心差异是什么?公链架构对比解析

解析 Solana(SOL)与 Ethereum 在架构设计、共识机制、扩展路径与节点结构上的本质差异,建立清晰可复用的公链对比认知框架。
2026-03-24 11:58:38
什么是 CoW Protocol(COW)?一文了解 CoW Protocol 的交易机制、COW 代币与生态价值
新手

什么是 CoW Protocol(COW)?一文了解 CoW Protocol 的交易机制、COW 代币与生态价值

CoW Protocol 是一种基于批量拍卖与订单匹配机制的去中心化交易协议,通过将用户订单进行统一撮合与优化执行,减少滑点、降低 MEV 风险,并提升链上交易效率。与传统自动做市商(AMM)或 DEX 聚合器不同,CoW Protocol 通过“Coincidence of Wants”机制,让交易者之间直接匹配订单,从而降低交易成本与链上摩擦。
2026-04-09 11:26:17