以太坊智能合约授权的革命性变化
EIP-7702 是以太坊改进提案,它允许外部拥有账户(EOA)临时获得智能合约的功能。这项提案将在以太坊的 Pectra 升级中实现,预计在2025年推出。
EIP-7702 解决了一个关键问题:如何让用户的普通钱包(EOA)能够执行复杂的智能合约操作,而无需多次交易或预先授权。
| 特性 | 传统 ERC20 授权 | EIP-7702 授权 |
|---|---|---|
| 所需交易数 | 2 (approve + transferFrom) | 1 (单次交易) |
| 授权机制 | 链上 approve() 调用 | 链下签名授权 |
| msg.sender | 合约地址 | 用户地址 |
| 批量操作 | 需要多次授权 | 单次授权可执行多个操作 |
| Gas 成本 | 较高(多次交易) | 较低(单次交易) |
在 EIP-7702 中,用户签署一个特殊的授权消息,指定一个合约地址。当交易执行时,用户的 EOA 临时获得该合约的代码,使其能够执行智能合约功能。关键是,当这个合约与其他合约交互时,msg.sender 仍然是用户的地址,而不是合约地址。
以下是 EIP-7702 如何简化代币转账的交互式演示。在这个例子中,Alice 将同时向 Bob 转账 ETH 和代币,只需一次交易。
在传统的 ERC20 代币交互中,如果一个合约要代表用户转移代币,用户必须先调用 approve() 函数授权该合约使用一定数量的代币,然后合约才能调用 transferFrom() 函数。
而使用 EIP-7702,情况完全不同:
关键区别: 当使用 EIP-7702 授权执行交易时,代币合约看到的 msg.sender 是用户的地址,而不是批处理合约的地址。这意味着从代币合约的角度来看,就好像是用户自己直接调用了 transfer() 函数。
这就是为什么使用 EIP-7702 时,批处理合约可以直接调用代币的 transfer() 函数而不需要事先获得授权的原因。批处理合约只是作为一个代理,它不持有任何代币,也不需要被授权使用代币,它只是代表用户执行操作。