仅需 16 分钟,带你跑通「外部账户→智能账户」的完整流程
什么是 EIP-7702
EIP-7702 作为 账户抽象 的最新进展,可以简单理解为:让普通钱包地址一下子就能“长出”智能合约的能力。主网完成 Pectra 升级后,0x04 交易的这一特性已经可以即时体验。
核心关键词:EIP-7702、0x04 交易、账户抽象、智能账户、批量交易、Gas 代付、Foundry 测试、Viem 签名
本文目标
- 解释 0x04 交易的结构与原理
- 用 Foundry 从零部署一个支持「批量交易 + Gas 代付」的 智能账户实现合约
- 通过本地节点与测试脚本验证 EIP-7702 的所有关键功能
- 提供常见问题解答,确保你能自己举一反三
0x04 交易为什么与众不同
传统以太坊交易只能:
- 从 EOA 转账
- 调用已有智能合约
- 交易内无法自行组合多条指令
而 0x04 交易允许你把一段 一次性生效的智能合约代码 直接绑定到 EOA 上,事件结束后地址又恢复成普通账户。
作用一目了然:
- 批量事务(一次性完成代币授权 + Swap + 转账)
- Gas 代付(第三方可帮你付 Gas,无需自己持有 ETH)
- 分级权限(短时授权、单签名任务、社交恢复)
流程概要
- 用户先用私钥签署一条 授权消息(chainId、
nonce
、目标实现合约地址、签名三部分) - 这笔签名随 0x04 交易广播,链上会临时把实现合约代码「挂载」到用户地址
- 执行时段内,用户地址的行为完全受实现合约逻辑控制
- 事务结束后,若未续签,则地址自动恢复,不留痕迹
快速上手:本地测试环境
前提准备
- 已安装最新版 Foundry
- 熟悉 Solidity 语法与单元测试流程
- VS Code / IntelliJ 任意文本编辑器
1 拉取示例项目(推荐)
git clone https://github.com/quiknode-labs/qn-guide-examples.git
cd qn-guide-examples/ethereum/eip-7702
或想手动初始化:
forge init eip-7702-project && cd eip-7702-project
2 安装依赖
forge install foundry-rs/forge-std
forge install OpenZeppelin/openzeppelin-contracts
3 配置兼容 Pectra
在 foundry.toml
的 [profile.default]
加一行:
evm_version = 'cancun'
代码速览:实现合约 BatchCallAndSponsor.sol
本合约示范三大模块:批量执行、签名验证、重放保护。
数据结构
struct Call {
address to;
uint256 value;
bytes data;
}
批量执行关键代码
function execute(Call[] calldata calls) external payable {
require(msg.sender == address(this), "Invalid authority");
_executeBatch(calls);
}
只有「自己被授权后的地址」才能触发,彻底防止越权调用。
重放保护
uint256 public nonce;
function _executeBatch(Call[] calldata calls) internal {
uint256 currentNonce = nonce;
nonce++;
...
}
Gas 代付通道
function execute(
Call[] calldata calls,
bytes calldata signature
) external payable {
// ECDSA 签名验证
bytes32 digest = keccak256(abi.encodePacked(nonce, encodedCalls));
require(ECDSA.recover(digest, signature) == address(this), "Invalid sig");
_executeBatch(calls);
}
赞助商 Bob 可使用同一份签名,在本地节点直接把交易广播。
在 Viem 里发送 0x04 交易
import { createWalletClient, http } from 'viem'
import { eip7702Actions } from 'viem/experimental'
const wallet = createWalletClient({...}).extend(eip7702Actions())
// 1. 先签署 delegation
const auth = await wallet.signAuthorization({ contractAddress })
// 2. 构造交易:to=自己地址,data=执行 batch calls
const txHash = await wallet.sendTransaction({
authorizationList: [auth],
data: encodeFunctionData({...}),
to: wallet.account.address
})
👉 想在线体验 Viem 对 0x04 交易的原生支持?点此抢先观摩最新示例!
Foundry 测试一览
项目 test/
目录中完整覆盖 4 个场景:
- 直连执行:Alice 直接调用自己的临时合约,批量转账 ETH+ERC20
- 代付执行:Bob 通过 Alice 的签名替他支付 Gas 完成交易
- 错误签名:模拟恶意签名,交易回滚
- 重放保护:同一签名二次使用直接失败
运行测试:
forge test -vvv
若全部绿色 PASS,则 EIP-7702 功能链路跑通。
FAQ:开发者最关心的 6 个问题
Q1:0x04 交易会对主网 Gas 水平有多大冲击?
A:EIP-7702 只是新增交易类型本身,复杂逻辑发生在实现合约内,部署、授权、执行阶段与常规合约交互成本相当,不会带来显著网络拥堵。
Q2:我能否把已授权的合约随时“卸载”?
A:可以,只要再发起一次 0x04 交易,把 delegation designator
设为 0(或换另一个实现合约地址)即可,上一笔授权即时失效。
Q3:如何避免实现合约作恶?
A:只在经过社区审计的实现合约上签名授权;对于高价值资产,可采用「限时授权」或「可撤销签名」的机制。
Q4:本地节点无法识别 0x04 交易?
A:请确认 Foundry 版本 ≥ 0.2.0,并在启动 anvil
时添加 --hardfork prague
。
Q5:ERC-4337 与 EIP-7702 冲突吗?
A:不冲突。ERC-4337 解决长期账户抽象,而 EIP-7702 是一次性「外挂」式增强。未来二者可组合:用户可先用 7702 完成临时需求,再平滑迁移到 4337 智能钱包。
Q6:同一个授权签名能在多链复用吗?
A:不能。消息里包含 chainId
字段,跨链直接失效,天然防止跨链重放。
部署脚本与运行
# 1. 启动本地链
anvil --hardfork prague
# 2. 另开窗口
forge script ./script/BatchCallAndSponsor.s.sol \
--tc BatchCallAndSponsorScript \
--broadcast \
--rpc-url http://127.0.0.1:8545
成功后查看 broadcast/
目录,即可取证每一笔包含 authorizationList 的交易哈希。
进阶:玩出更多花样
- 将
Call[]
阵列升级为带权重排序的 事务队列 - 引入 时间锁,7 天内可撤销授权
👉 立即访问合约库,解锁完整复制-粘贴级方案! - 把签名打包进 QR Code,线下扫码即可完成委托交易,用于活动现场 Gas 代付
总结
通过本文,你已经掌握了:
- EIP-7702 与 0x04 交易的底层原理
- 用 Foundry 快速部署并测试实现合约
- 用 Viem 向智能账户发起授权与批量交易
- 实际项目落地中常见的 6 大坑与应对策略
剩下就交给你的想象力:积分空投、低门槛拉新、链游一键领奖……都可以用 0x04 交易实现 「没有前端也可以玩的 DeFi」。祝你开发顺利!