介绍 ERC-4337 和 Native AA 的概念,讨论它们之间的差异,并重点分析 L1 和 L2 的 4337 标准的主要区别。
2024 年 7 月 8 日至 11 日,以太坊社区会议(EthCC)在比利时布鲁塞尔举行,这是欧洲规模最大的以太坊年度活动,重点关注技术和社区。
本届以太坊社区会议(EthCC 7)共有超过 350 名活跃在区块链行业一线的意见领袖发表演讲, imToken Labs Alfred 受邀参与,并在大会上发表主题为「揭示未来:多链账户抽象解析」的演讲。
演讲概要速览:
账户抽象(AA)主要包括两个关键点:签名抽象和支付抽象。签名抽象让用户可以选择任何喜欢的验证机制,支付抽象则允许使用多种交易支付选项。这种灵活性提供了更安全、更优的用户体验。
在 ERC-4337 和原生 AA 中,「验证」阶段的入口点函数是固定的,而在「执行」阶段,只有原生 AA 中的入口点是固定的。验证交易的限制和执行交易的步骤在不同实现中有各自的特点和限制。
在 EVM 兼容链上实施 ERC-4337,有两个关键区别:Rollup 设计中的协议差异和地址计算方式的差异,导致在 L1 和 L2 之间实现 ERC-4337 时出现难以注意的开发细节。
以下为演讲全文:
大家好,我是 Alfred,现任 imToken Labs 的区块链开发人员。今天,我向大家介绍 ERC-4337 和 Native AA 的概念,讨论它们之间的差异,并重点分析 L1 和 L2 的 4337 标准的主要区别。
账户抽象(AA)主要包括两个关键点:签名抽象和支付抽象。
签名抽象:用户可以选择任何喜欢的验证机制,而不仅限于某些数字签名算法(如 ECDSA)。
支付抽象:用户可以使用多种交易支付选项,如使用 ERC-20 资产代替原生资产支付,或让第三方赞助交易。
这种灵活性提供了更安全、更优的用户体验。账户抽象的目标是通过多种方式实现这两个关键点。
目前,以太坊协议中的外部拥有账户(EOA)存在一些限制,例如固定的签名方法和支付设计。ERC-4337 通过引入更灵活的账户管理和交易处理方法来解决这些问题。
userOp 结构: 在 ERC-4337 中,用户将 userOp 结构发送到 Bundler。Bundler 收集多个 userOp,并通过调用 handleOps 函数将它们发送到 EntryPoint 合约。
EntryPoint 合约: 该合约像操作系统一样处理交易,主要功能包括:
调用账户合约中的 validate 函数,确保 userOp 获得账户所有者授权。
收取费用。
调用账户合约中的 execute 函数,执行 userOp 的目标操作。
在以太坊中,账户分为 EOA 和合约账户。然而,在原生 AA 中,每个账户都是一个合约,且交易处理机制直接嵌入到区块链协议中。
各区块链网络中的 AA 设计:
ERC-4337 账户抽象: 以太坊、Arbitrum、Optimism、Base、Linea、Scroll、Polygon PoS
原生账户抽象遵循 ERC-4337 : StarkNet & zkSync 时代
具有隐私设计的原生账户抽象: Aztec
如果你对 Aztec Native AA 或 EIP-3074、EIP-7702 感兴趣,今天我们将重点关注 ERC-4337 之后的原生 AA。详细信息请参考我写的文章,列在文末。
AA OS 需要回答以下问题:
谁决定 Gas 价格?
谁决定交易顺序?内存池在哪里?
谁触发入口点函数?
什么决定了交易处理的流程?
在 ERC-4337 中,这些角色通过 Bundler 和 EntryPoint Contract 协同完成。
在原生 AA 中,用户将其 userOps 发送给官方服务器的操作员/排序器,而不是 Bundler 和 EntryPoint Contract。
在 StarkNet 中,Sequencer 负责处理所有这些任务。
在 zkSync 中,Era 与其他 AA 实现的主要区别在于 Operator 需要与 bootloader(系统合约)配合工作。Bootloader 打开一个新块,定义其参数(包括块参数和其他 Gas 参数),并接收来自 Operator 的交易以进行验证。
由于三个步骤的存在,账户合约接口在不同实现中是相似的,这些入口点函数只能由 AA OS 调用:
ERC-4337: 验证用户操作
zkSync: 验证交易、交易支付、执行交易
StarkNet: execute、validate、validate_declare、validate_deploy
在 ERC-4337 和原生 AA 中,「验证」阶段的入口点函数是固定的,而在「执行」阶段,只有原生 AA 中的入口点是固定的。
由于验证交易没有成本限制(本质上,验证交易是调用视图函数),攻击者可以对内存池进行 DoS 攻击,从而破坏捆绑器(EIP-4337)或运算符/排序器(原生 AA)。
EIP-4337 定义了禁止哪些操作码以及如何限制存储访问。zkSync Era 放宽了一些 OpCode 的使用:
合约逻辑只能访问自己的存储槽。如果账户合约的地址是地址 A,它可以访问:
属于地址 A 的存储槽
属于任何其他地址A的存储槽
属于任何其他地址的存储槽 keccak256 (A || X):这意味着直接使用地址作为映射中的键(例如,映射 (address => value) ),相当于访问槽 keccak256 (A || X)。例如,ERC-20 合约中的资产余额。
合约逻辑无法访问全局变量,例如区块号。StarkNet 也不允许外部合约调用。
在 zkSync 中,执行系统调用需要确认系统标志的存在。例如,增加 nonce 的唯一方法是与 NonceHolder 交互,而部署合约则需要与ContractDeployer交互。系统标志确保账户开发人员有意识地与系统合约进行交互。
在 ERC-4337 和 StarkNet 中,执行阶段没有特殊限制。
在 ERC-4337 中,入口点随机数的设计区分了 192 位密钥值和 64 位随机数值。
在 zkSync 中,NonceHolder 系统合约管理 nonce,确保严格递增,即将随机数增加 1。
在StarkNet中,nonce 也是严格递增的,但是没有抽象的nonce来由特定的合约管理。
ERC-4337 在 userOp 结构中包含 initcode 字段,以在其第一个 userOp 中部署发送者(账户合约)。
在 StarkNet 和 zkSync 中,用户必须将第一笔交易发送给算子/排序器来部署账户合约。
如果你直接将 ETH 从以太坊 EOA 转移到 zkSync, 无需部署定制账户合约,你将收到一个具有相同地址的默认账户。该账户可以像以太坊 EOA 一样工作,并且也由相应的以太坊 EOA 的私钥控制。
这账户类型是版本 None 而不是 version1 。你不能调用DefaultAccount的函数,因为它没有在内核空间部署任何代码。
在 EVM 兼容链上实施 ERC-4337 有两个关键区别:协议差异和地址差异。
Rollup 设计中,L2 需要将数据上传到 L1 以进行安全和结算。在 ERC-4337 的背景下,与此上传过程相关的费用,例如 L1 安全费和 blob 费用,应该 被包括在内在预验证 Gas 中。确定预验证 Gas 中适当的上传费用是一个重大挑战。
zkSync ERA 的 create 函数中的地址编码方式与以太坊和 OP 汇总不同。此外,StarkNet 使用独特的哈希函数进行地址计算。在 EVM 兼容链上的 ERC-4337 背景下,我们通常假设地址计算在各链上是一致的。然而,有一个难以注意的细节可能会导致以太坊和 L2 中的 ERC-4337 实现之间的账户合约地址不同。
关键问题是在硬分叉中添加新的操作码。例如,如果 L2 链不支持上海硬分叉,并且在编译时未指定 EVM 版本,push0 的引入会导致字节码改变,即使 Solidity 代码是相同的。
以下是一些资源,供你了解更多有关账户抽象的信息。请随时联系我,如果你有任何疑问,可以在 Twitter 上找到我(@murmurlu)。
《Aztec 账户抽象介绍》,请查阅:
https://medium.com/@ChiHaoLu/introduction-of-aztec-account-abstraction-98535c9edf2e
《StarkNet 账户抽象介绍》,请查阅:
https://medium.com/taipei-ethereum-meetup/introduction-of-starknet-account-abstraction-2c343b561d6e
《zkSync 账户抽象介绍》,请查阅:
《Starknet 和 zkSync:比较分析》,请查阅:
https://medium.com/nethermind-eth/starknet-and-zksync-a-comparative-analysis-d4648786256b
关注我们 !
imToken X 平台(原 Twitter)中文账户已经正式开通了,欢迎关注: https://x.com/imTokenCN
更多未来计划、软件更新,请关注 imToken 唯一官网: https://token.im
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!