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