EIP-7702 演示

以太坊智能合约授权的革命性变化

什么是 EIP-7702?

EIP-7702 是以太坊改进提案,它允许外部拥有账户(EOA)临时获得智能合约的功能。这项提案将在以太坊的 Pectra 升级中实现,预计在2025年推出。

EIP-7702 解决了一个关键问题:如何让用户的普通钱包(EOA)能够执行复杂的智能合约操作,而无需多次交易或预先授权。

主要优势

传统 ERC20 授权 vs EIP-7702

特性 传统 ERC20 授权 EIP-7702 授权
所需交易数 2 (approve + transferFrom) 1 (单次交易)
授权机制 链上 approve() 调用 链下签名授权
msg.sender 合约地址 用户地址
批量操作 需要多次授权 单次授权可执行多个操作
Gas 成本 较高(多次交易) 较低(单次交易)

EIP-7702 工作原理

用户签署授权
提交授权和交易
EOA临时获得合约代码
以用户身份执行操作

在 EIP-7702 中,用户签署一个特殊的授权消息,指定一个合约地址。当交易执行时,用户的 EOA 临时获得该合约的代码,使其能够执行智能合约功能。关键是,当这个合约与其他合约交互时,msg.sender 仍然是用户的地址,而不是合约地址。

// 签署授权,允许批处理合约代表用户执行操作
const authorization = await wallet.signAuthorization({
  contractAddress: BATCH_CALL_DELEGATION,
});

// 使用授权执行批量操作
await wallet.writeContract({
  abi: batchAbi,
  address: account.address,
  functionName: "execute",
  args: [
    [
      // ETH 转账
      {
        data: "0x",
        to: BOB,
        value: parseEther("1"),
      },
      // 代币转账
      {
        data: tokenTransferData,
        to: TOKEN_ADDRESS,
        value: 0n,
      },
    ],
  ],
  authorizationList: [authorization],
});

交互式演示

以下是 EIP-7702 如何简化代币转账的交互式演示。在这个例子中,Alice 将同时向 Bob 转账 ETH 和代币,只需一次交易。

>>> 演示已初始化,请点击"签署授权"开始。

为什么 EIP-7702 不需要传统的代币授权

在传统的 ERC20 代币交互中,如果一个合约要代表用户转移代币,用户必须先调用 approve() 函数授权该合约使用一定数量的代币,然后合约才能调用 transferFrom() 函数。

而使用 EIP-7702,情况完全不同:

关键区别: 当使用 EIP-7702 授权执行交易时,代币合约看到的 msg.sender 是用户的地址,而不是批处理合约的地址。这意味着从代币合约的角度来看,就好像是用户自己直接调用了 transfer() 函数。

这就是为什么使用 EIP-7702 时,批处理合约可以直接调用代币的 transfer() 函数而不需要事先获得授权的原因。批处理合约只是作为一个代理,它不持有任何代币,也不需要被授权使用代币,它只是代表用户执行操作。

实际应用场景