EIP-7702 允许将 EVM 代码附加到 EOA,使其同时具备 EOA 和智能合约账户的功能。本文介绍了如何使用 ZeroDev SDK 将 EOA 升级为智能账户,并发送 gasless 的批量交易。主要步骤包括生成 7702 authorization、设置 ZeroDev SDK,以及使用 SDK 发送 gasless 批量 UserOp。文章还提供了完整的代码示例和安装包信息。
EIP-7702 是即将到来的以太坊升级,它允许将一段 EVM 代码附加到 EOA,从而有效地将其变成一个“双重账户”,可以同时作为 EOA 和智能账户运行。
实际上,这意味着 EOA 用户现在可以享受 AA 的大部分好处,例如 gas 赞助、交易批量处理、会话密钥、链抽象等等。请注意,由于该账户既是智能账户又是 EOA,因此真正的“密钥轮换”是不可能的,因为 EOA 密钥将始终保持对该账户的 root 访问权限。
在本例中,我们将 EOA 升级为 ZeroDev 智能账户(Kernel),并从中发送一个无 gas 的批量交易。
这是完整的代码示例,供你在学习时参考。
你将使用以下包:
npm i @zerodev/sdk @zerodev/ecdsa-validator viem
在本例中,我们将使用 Sepolia 测试网,但你可以使用任何兼容 7702 的网络,例如 Holesky 和 Odyssey。
Sepolia
创建一个项目。Gas Policies
下启用 Sepolia 的 gas 赞助。.env
文件,如下所示:PRIVATE_KEY=
ZERODEV_RPC=
使用仪表板中的 ZeroDev RPC。私钥可以是任何测试 EOA 密钥。
要将 EOA 升级为智能账户,第一步是生成一个“7702 授权”,这是一个签名消息,指定应“复制”到 EOA 中的智能合约的地址。实际上,为了最大程度地降低复制成本,此智能合约将是指向实际智能账户实现的代理,在我们的例子中是 Kernel。
在此示例中,我们将升级从私钥生成的 EOA,但它可以是任何 EOA(例如现有钱包),只要 EOA 能够签署 7702 授权。如果你是现有 EOA 钱包的开发人员,并且不知道如何更新你的签名逻辑以支持 7702,请联系我们。
要生成授权,我们使用 Viem:
import { createWalletClient, Hex, http } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
import { sepolia } from 'viem/chains'
import { eip7702Actions } from 'viem/experimental'
import { KERNEL_V3_3_BETA, KernelVersionToAddressesMap } from '@zerodev/sdk/constants'
const kernelVersion = KERNEL_V3_3_BETA
const signer = privateKeyToAccount(process.env.PRIVATE_KEY as Hex)
const chain = sepolia
console.log("EOA Address:", signer.address)
const walletClient = createWalletClient({
chain,
account: signer,
transport: http(),
}).extend(eip7702Actions())
const authorization = await walletClient.signAuthorization({
contractAddress: KernelVersionToAddressesMap[kernelVersion].accountImplementationAddress,
delegate: true,
})
现在你有了授权,你可以继续设置 ZeroDev SDK。
import { createPublicClient } from 'viem'
import { getEntryPoint, KERNEL_V3_1 } from '@zerodev/sdk/constants'
import { createKernelAccountClient } from '@zerodev/sdk'
import { createKernelAccount } from '@zerodev/sdk/accounts'
import { signerToEcdsaValidator } from '@zerodev/ecdsa-validator'
const entryPoint = getEntryPoint("0.7")
const publicClient = createPublicClient({
chain,
transport: http(process.env.BUNDLER_RPC),
})
const ecdsaValidator = await signerToEcdsaValidator(publicClient, {
signer,
entryPoint,
kernelVersion,
})
const account = await createKernelAccount(publicClient, {
plugins: {
sudo: ecdsaValidator,
},
entryPoint,
kernelVersion,
// 设置 7702 授权
eip7702Auth: authorization,
// 将智能账户的地址设置为 EOA 地址
address: signer.address,
})
const paymasterClient = createZeroDevPaymasterClient({
chain,
transport: http(process.env.PAYMASTER_RPC),
})
const kernelClient = createKernelAccountClient({
account,
chain,
bundlerTransport: http(process.env.BUNDLER_RPC),
paymaster: paymasterClient,
client: publicClient,
})
如果代码不太容易理解,请不要担心 -- 你可以在这里阅读有关设置过程的更多信息。
与正常的设置过程相比,主要有两个区别:
设置 Kernel 账户时,指定 eip7702Auth: authorization
,以便 SDK 可以使用你的授权来处理升级。
设置 Kernel 账户时,指定 address: signer.address
以显式地将智能账户的地址设置为 EOA 地址。否则,SDK 将从其初始化数据中计算智能账户地址,这是智能账户通常的工作方式。但是,使用 7702 时,账户地址是 EOA 地址。
现在你可以像往常一样使用 ZeroDev SDK。例如,要发送一个无 gas 的批量 UserOp:
const userOpHash = await kernelClient.sendUserOperation({
callData: await kernelClient.account.encodeCalls([
{
to: zeroAddress,
value: BigInt(0),
data: "0x",
},
{
to: zeroAddress,
value: BigInt(0),
data: "0x",
},
]),
})
await kernelClient.waitForUserOperationReceipt({
hash: userOpHash,
})
console.log("UserOp 完成")
恭喜!你刚刚使用 EOA 发送了你的第一个无 gas 的批量交易。你可以通过在Sepolia 浏览器上查找你的帐户来查看它。请注意,你可能需要在“内部交易”下查找,因为 UserOp 不会显示为常规交易。
很简单,对吧?现在探索 ZeroDev 文档的其余部分,看看你可以用你的“智能 EOA”做什么。
- 原文链接: github.com/zerodevapp/do...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!