接入EIP-7702:使用 ZeroDev 将 EOA 升级为智能账户

EIP-7702 允许将 EVM 代码附加到 EOA,使其同时具备 EOA 和智能合约账户的功能。本文介绍了如何使用 ZeroDev SDK 将 EOA 升级为智能账户,并发送 gasless 的批量交易。主要步骤包括生成 7702 authorization、设置 ZeroDev SDK,以及使用 SDK 发送 gasless 批量 UserOp。文章还提供了完整的代码示例和安装包信息。

快速入门 -- EIP-7702

EIP-7702 是即将到来的以太坊升级,它允许将一段 EVM 代码附加到 EOA,从而有效地将其变成一个“双重账户”,可以同时作为 EOA 和智能账户运行。

实际上,这意味着 EOA 用户现在可以享受 AA 的大部分好处,例如 gas 赞助、交易批量处理、会话密钥、链抽象等等。请注意,由于该账户既是智能账户又是 EOA,因此真正的“密钥轮换”是不可能的,因为 EOA 密钥将始终保持对该账户的 root 访问权限。

在本例中,我们将 EOA 升级为 ZeroDev 智能账户(Kernel),并从中发送一个无 gas 的批量交易。

完整示例

这是完整的代码示例,供你在学习时参考。

安装包

你将使用以下包:

npm i @zerodev/sdk @zerodev/ecdsa-validator viem

为兼容 7702 的网络创建一个项目

在本例中,我们将使用 Sepolia 测试网,但你可以使用任何兼容 7702 的网络,例如 Holesky 和 Odyssey。

  • 前往 ZeroDev 仪表板 并为 Sepolia 创建一个项目。
  • Gas Policies 下启用 Sepolia 的 gas 赞助。
  • 创建一个 .env 文件,如下所示:
PRIVATE_KEY=
ZERODEV_RPC=

使用仪表板中的 ZeroDev RPC。私钥可以是任何测试 EOA 密钥。

签署 7702 授权

要将 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

现在你有了授权,你可以继续设置 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

现在你可以像往常一样使用 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
zerodevapp
zerodevapp
江湖只有他的大名,没有他的介绍。