EIP explained

EIP-7702: 让普通钱包(EOA)拥有智能合约能力

以太坊上的账户主要分为两类:

  • EOA(Externally Owned Account):由私钥控制的普通钱包,只能发交易收款。
  • 合约账户(Contract Account):拥有代码逻辑,可以自动执行操作,例如多签钱包、DeFi 合约等。

传统上,EOA 没有能力执行智能合约逻辑,这限制了用户体验和 UX 创新。EIP-7702 的目标就是让普通 EOA 也可以“半智能化”,无需迁移到合约钱包。


为什么需要 EIP-7702?

尽管智能合约钱包越来越强大,普通用户大多仍使用 EOA,但这导致以下限制:

  1. 批量操作困难
    例如 ERC-20 approve + swap,需要两笔交易。
  2. 无法代付交易
    DApp 项目方或第三方无法为用户支付 gas。
  3. 权限管理有限
    例如限制子 key 只能操作部分资产或交互特定 DApp。

EIP-7702 提供了针对 EOA 的 短期功能扩展,解决这些痛点。


核心功能

1. 批量交易(Batching)

通过一次交易执行多个操作,例如:

1. ERC-20 approve
2. ERC-20 transferFrom

传统上需要两笔交易,现在可以一次完成,减少用户操作和 gas 成本。

2. 代付交易(Sponsorship)

允许第三方账户为 EOA 支付交易费,例如:

  • DApp 项目方替用户支付 gas
  • 用户签名授权,第三方代付

3. 子权限(Privilege De-escalation)

允许用户签署子 key,限制其权限范围,例如:

  • 每日最多消费账户余额的 1%
  • 仅可在指定 DApp 上操作
  • 只能消费 ERC-20,不能操作 ETH

技术实现原理

EIP-7702 引入了 新交易类型Set Code Transaction(类型 0x04)。

交易结构如下:

rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit,
     destination, value, data, access_list, authorization_list, signature_y_parity,
     signature_r, signature_s])

核心流程

  1. EOA 发送交易,附带授权列表(authorization list)。
  2. 系统将 EOA 的代码替换为 Delegation Indicator
0xef0100 || target_address
  1. 执行交易时,EOA 会“跳转”去执行目标合约逻辑。

如果目标地址为 0x0,表示清空委托,恢复普通 EOA。


Delegation Indicator 工作机制

  • 0xef0100 是保留 opcode,用于标识委托。
  • CALL、DELEGATECALL 等操作会执行目标合约逻辑。
  • EXTCODE* 指令只访问委托指示本身,避免假装账户拥有不同代码。
  • 循环委托:只执行第一层,避免无限循环。
  • 不允许委托到预编译合约。

安全与注意事项

  1. 破坏旧假设
    • tx.origin == msg.sender 只在顶层交易成立,可能影响依赖此检查的合约。
  2. 委托合约必须安全
    • 防止重放攻击
    • 限制 gas、value、调用目标
    • 防止恶意控制 EOA
  3. 代付者风险
    • 如果授权被撤销或账户清空,代付者可能白付 gas

Gas 成本

  • 每个授权约 12500 gas
  • 交易本身继承 EIP-2930 的基础成本
  • 访问冷账户增加 COLD_ACCOUNT_READ_COST

交易发送者支付所有授权 gas,无论授权是否有效


简单示例(伪代码)

// 目标合约
contract Logic {
    function greet() external pure returns (string memory) {
        return "Hello from delegated EOA!";
    }
}

// EOA 设置委托
SetCodeTx tx;
tx.authorization_list = [
    [chainId, eoaAddress, nonce, yParity, r, s] // 签名授权
];
sendTransaction(tx);

// 调用 EOA 执行逻辑
call(eoaAddress.greet()); // 实际执行 Logic.greet()

好处

  • 普通 EOA 拥有批量操作、代付、子权限能力
  • 保持 EOA 易用性,同时向合约钱包过渡
  • 与未来 ERC-4337(账户抽象)兼容

风险与限制

  • 安全复杂度增加,钱包和 DApp 开发者需谨慎
  • 依赖 tx.origin 的合约可能需要调整
  • 不允许执行 initcode 或直接部署新合约

总结

EIP-7702 是 EOA 的“半智能化升级”

  • 提升用户体验:批量操作、代付、权限管理
  • 保持易用性:无需部署合约即可使用
  • 面向未来:兼容账户抽象和智能合约钱包

想象一下,普通钱包也能拥有“半合约钱包”的魔法,而用户无需额外部署合约。

参考
EIP:https://eips.ethereum.org/EIPS/eip-7702

功能实现PR: https://github.com/ethereum/go-ethereum/pull/30078

Subscribe for New Articles!

Leave a Comment

Your email address will not be published. Required fields are marked *