EIP-7702 vs 传统授权

深入对比分析两种授权机制的区别

概述

在以太坊生态系统中,授权机制是用户与智能合约交互的重要组成部分。传统的 ERC20 代币授权机制和新的 EIP-7702 授权机制在设计理念和实现方式上有着显著的差异。本页面将深入对比这两种授权机制的区别。

传统 ERC20 授权

传统的 ERC20 代币授权机制基于 approvetransferFrom 函数,需要两个独立的交易来完成授权和转账操作。

// 步骤1: 用户授权合约使用代币
await token.approve(spenderContract, amount);

// 步骤2: 合约使用用户的代币
await spenderContract.doSomething(); // 内部调用 transferFrom

EIP-7702 授权

EIP-7702 引入了一种新的授权机制,允许用户在一个交易中完成授权和操作,无需预先批准代币使用权。

// 单一步骤: 签署授权并执行操作
const authorization = await wallet.signAuthorization({
  contractAddress: BATCH_CALL_DELEGATION,
});

await wallet.writeContract({
  abi: batchAbi,
  address: account.address,
  functionName: "execute",
  args: [[{ to: token.address, data: transferData }]],
  authorizationList: [authorization],
});

工作流程对比

传统 ERC20 授权流程

用户调用 approve()
等待交易确认
合约调用 transferFrom()
等待第二笔交易确认

EIP-7702 授权流程

用户签署授权
提交授权和操作
合约以用户身份执行操作
交易确认完成

技术细节对比

特性 传统 ERC20 授权 EIP-7702 授权
授权存储 链上存储 (allowance 映射) 链下签名,交易时验证
msg.sender 合约地址 用户地址
授权撤销 调用 approve(0) 设置有效期或签署新授权
授权范围 特定代币和金额 合约的所有功能
Gas 成本 两笔交易的总和 单笔交易
实现层级 合约层面 协议层面
兼容性 所有 EVM 链 需要支持 EIP-7702 的链

核心区别:msg.sender 的处理

EIP-7702 和传统授权机制最关键的区别在于 msg.sender 的处理方式:

  • 传统授权:当第三方合约调用代币的 transferFrom 函数时,代币合约看到的 msg.sender 是第三方合约的地址。
  • EIP-7702 授权:当被授权合约执行操作时,其他合约看到的 msg.sender 是用户的地址,而不是合约地址。

这种区别使得 EIP-7702 可以直接调用 transfer 函数而不是 transferFrom 函数,从而避免了预先授权的需要。

视觉对比:交易数量

传统 ERC20 授权
2
所需交易数
  • 交易 1: approve(spender, amount)
  • 交易 2: spender.doSomething() → transferFrom()
EIP-7702 授权
1
所需交易数
  • 交易 1: 提交授权 + 执行操作
  • (链下签名不计入交易)

代码示例对比

传统 ERC20 授权和转账

// 步骤1: 授权批处理合约使用代币
await token.approve(batchContract.address, amount);

// 步骤2: 调用批处理合约执行转账
await batchContract.execute([
  {
    to: BOB,
    value: parseEther("1"),
    data: "0x"
  },
  {
    to: token.address,
    value: 0,
    data: encodeFunctionData({
      abi: tokenAbi,
      functionName: "transferFrom",
      args: [account.address, BOB, amount]
    })
  }
]);

使用 EIP-7702 的授权和转账

// 签署授权
const authorization = await wallet.signAuthorization({
  contractAddress: BATCH_CALL_DELEGATION,
});

// 一步执行批量转账
await wallet.writeContract({
  abi: batchAbi,
  address: account.address,
  functionName: "execute",
  args: [
    [
      {
        to: BOB,
        value: parseEther("1"),
        data: "0x"
      },
      {
        to: token.address,
        value: 0,
        data: encodeFunctionData({
          abi: tokenAbi,
          functionName: "transfer", // 注意这里是 transfer 而不是 transferFrom
          args: [BOB, amount]
        })
      }
    ]
  ],
  authorizationList: [authorization],
});

优缺点分析

传统 ERC20 授权

优点

  • 广泛兼容所有 EVM 链
  • 成熟稳定,经过大量实践验证
  • 可以精确控制授权金额
  • 无需协议层支持

缺点

  • 需要两个交易,用户体验差
  • Gas 成本较高
  • 无限授权带来安全风险
  • 批量操作复杂

EIP-7702 授权

优点

  • 单一交易完成授权和操作
  • Gas 成本更低
  • 可以轻松实现批量操作
  • 无需预先授权代币
  • 保持 EOA 的身份

缺点

  • 需要网络支持 EIP-7702
  • 授权范围较广,安全风险需要评估
  • 新技术,尚未经过大规模实践验证
  • 用户需要理解新的授权模型

适用场景

传统 ERC20 授权适合:

EIP-7702 授权适合:

结论

EIP-7702 提供了一种全新的授权机制,相比传统的 ERC20 授权机制,它具有显著的用户体验和 Gas 效率优势。通过允许合约临时获得用户的身份,EIP-7702 消除了预先授权的需要,简化了与智能合约的交互流程。

然而,EIP-7702 也面临着兼容性和安全性方面的挑战。随着以太坊 Pectra 升级的推出,我们可以期待看到更多基于 EIP-7702 的创新应用和用例。

无论是传统授权还是 EIP-7702,选择哪种授权机制应该基于具体的应用需求、安全考虑和目标用户群体。在某些情况下,两种机制可能需要并存,以满足不同的使用场景。