一文了解 zkSync 中的原生 Account Abstraction
本文主要介绍 Account Abstraction(AA、抽象账户)在zkSync这个 Layer2 Solution 的发展与相关内容。而重点会放在三个部分:
1.账户合约:账户型态,账户合约的重要 Entry Point 和相关重点
2.交易:AA 交易的验证方式和执行方式、流程
3.手续费:交易手续费、Paymaster
Image Source:zkSync Tweets
Author:ChiHaoLu(chihaolu.eth) @ imToken Labs
Special thanks toNIC Lin&Cyan Hofor reviewing this post.
本文同步发表于imToken Mirror Publication!
Table of Contents
·Intro
·Quick Look at the zkSync AA Contract
·Fee Model and Paymaster in zkSync Era
·Summary & Comparison
·Closing
Intro
Background
1.熟悉智能合约钱包与其常见的 features
2.大致了解 Ethereum 的交易如何运作
3.大致了解 EIP-4337 运作模式
4.大致了解 ZK(Validity)Rollup 运作模式
Quick Look at the zkSync
这边为了帮助大家在不需要深入理解 zkSync 的情况下阅读,快速的 recap 一下 zkSync 的基本信息,zkSync 主要有分两个版本,1.0(zkSync Lite)与 2.0(zkSync Era)。
zkSync 1.0 仅能使用 EOA 且不支援智能合约(只支援 token transfer 和 swap),而 zkSync 2.0 也就是 zkSync Era,属于 Native AA(原生账户型态都是合约,没有 EOA,也就是没有 Ethereum 中的 EOA 和 Contract Account 的差别),同时为 EVM-Compatible,支援使用 Rust、Yul、Vyper、Solidity 开发智能合约。
下文提到的 zkSync 若无特别指称,都指的是 zkSync 2.0,也就是 zkSync Era。
在 zkSync Era 中还有多个 System Contract,可以理解成是他们把 zkSync 一些重要 OS 功能实作在智能合约中。这些 System Contract 都是 precompiled contract,从未被部署(直接跑在节点里),但它们都具有一个正式地址。
执行 AA Protocol 时 zkSync 会透过一些 System Contract 来做逻辑运算和判断,例如验证 nonce 时是由 NonceHolder 来判断,而执行抽象账户的机制和收取手续费是由 bootloader 来判断,下文会一一介绍他们。
Recap Account Abstraction
Account Abstraction 的核心概念可以总结为两个关键点:Signature Abstraction(签章抽象)和 Payment Abstraction(支付抽象)。
Signature Abstraction 的目标是使各种账户合约能够使用不同的验证方案。这意味着使用者不受限于只能使用特定曲线的数位签章算法,而可以选择任何他们喜好的验证机制。
而 Payment Abstraction 旨在为使用者提供多种交易支付选项。例如,可以使用 ERC-20 代币进行支付,而不是使用原生代币,或者可以由第三方赞助交易,甚至是其他更特别的 payment model。
zkSync 2.0 中的账户可以发起交易,就像 EOA 一样,但也可以在其中利用可编程性实现任意逻辑,如 Contract Account。这就是我们所说的 Account Abstraction,它融合 Ethereum 中两种账户型态的优势,使 AA 账户的使用者体验更加灵活,进而达到上述的两种目标:Signature Abstraction 和 Payment Abstraction。
AA Mechanism in zkSync Era
zkSync AA 中最重要的角色分别为 bootloader,他是一个 System Contract,他主要用来处理交易以及执行 AA 的机制,对应着 4337 的 EntryPoint Contract。bootloader 无法被使用者呼叫(仅能被 Operator 触发),也从未被部署(直接跑在节点里),但它具有一个正式地址(可以用来收款)。
Operator 是 ZK rollup 中的一位重要角色,是中心化的 Off-Chain Server,与大家可能会看过的 Sequencer 同义,负责从外部触发 bootloader 等 System Contract。
原生的 Account Abstraction Protocol(e.g. StarkNet、zkSync)基本上都是参考 EIP-4337 进行设计,zkSync 的实现上用户会将交易送给 Operator,Operator 就会开始把交易送给 bootloader,并开始一系列的处理。
从区块的角度看:
当 bootloader 接收到来自 Operator 的输入,bootloader 会先替该区块定义一些环境变量(e.g. gas price、block.number、block.timestamp等)。之后 bootloader 会依序读取交易列表,先询问该账户合约是否同意该交易(也就是 AA 机制中的呼叫 validate function),再把他们放进区块中。
每一笔交易验证通过之后 Operator 会验证该区块是否足够大以便发送给证明者(或是否已超时)。如果够大或超时 Operator 就会关闭该区块,停止向 bootloader 添加新的交易,并完成交易执行。
从交易的角度看,bootloader 被 Operator 触发后会依序对每一笔交易:
1.确认用户 Account Contract Address 对应的 nonce 是否合法
2.呼叫用户 Account Contract 上的 validate function 进行验证
3.验证通过之后 Account Contract 会把 gas fee 汇进 bootloader 的地址(或透过 Paymaster,下文会介绍),bootloader 会检查自己是否有收到足够的款项。
4.呼叫用户 Account Contract 上的 execute function 执行交易
以上的前三步就是对应着 4337 的 Verification Loop,第四步则对应着 4337 的 Execution Loop。
这边主要做一个 overview 的介绍,每一步细节跟角色都会在之后详细说明。
Quick Look at the zkSync AA Contract
Nonce
zkSync 的账户 nonce 是记录在一个 System Contract —NonceHolder里面,以 mapping 记住一组又一组的(account_address, nonce)pair 是否有使用过来判断 nonce 是否合法。
从上文我们知道 bootloader 被 Operator 触发后第一步是检查 nonce,所以在每笔交易开始之前,NonceHolder会被用来确认当前使用的这组 nonce 是否合法(目前只检查有没有用过)。如果 nonce 合法,则进入到 Verification Phase,此时 nonce 就已经会被标记为 used;不合法则交易(验证)失败。
关于 zkSync 当前的 nonce 的重点:
·虽然当前使用者可以同时送出多笔不同 nonce 的交易到 Account 执行,但因为 zkSync 不支援平行化处理,所以不同 nonce 的交易还是会依序被处理。
·理论上用户可以使用任何 256-bit 的非 0 整数作为 nonce,但 zkSync 还是推荐使用incrementNonceIfEquals来作为管理 nonce 的方式,以确认他是依序递增的(当前 zkSync 的 AA 机制并不会确认依序递增,只确认没用过,但官方文件表示未来会会要求依序递增)。
Account Contract
在 zkSync 中的 Account Contract 有以下四个必要的 Entry Point,分别为:
·validateTransaction在 Verification Phase 被呼叫,以确认这次操作是被账户的拥有者授权的,用户可以在这边客制自己的验证逻辑(e.g. 各种签章算法、多签等)。
·payForTransaction,当交易手续费由这个账户支付(而非使用 paymaster)时,Operator 会呼叫这个函式来向bootloaderaddress 支付至少tx.gasprice * tx.gaslimit的 ETH。
·prepareForPaymaster当交易手续费会由 Paymaster 支付,Operator 会呼叫这个函式来完成一些与 paymaster 互动的前置动作。zkSync 提供的范例是 approve Paymaster 的 ERC-20 token。
·executeTransaction,在 Verification Phase 成功通过且成功收取手续费之后,此函式会用来完成用户想要达到的 operation(e.g. 跟合约互动、汇款等行为)。
关于 Paymaster、手续费数量(tx.gasprice * tx.gaslimit)等会在后面的章节解释。
在 zkSync 的 Account 中还有一个非必要(optional)的保险函式executeTransactionFromOutside,当没有办法执行函式时(例如 sequencer 没有反应或发现 zkSync 有监管风险时),可以有一个「逃跑机制」来提取资金到 L1。这个部分与 AA Protocol 没有太大的关系所以不耗费篇幅叙述,有兴趣的人可以查看官方文件与zkSync 的 spec.。
Keynotes and Limitations in Validate Function
在validateTransaction中可以实作各种客制化逻辑,例如如果 Account 有实作 1271 的话,可以直接把 1271 里的验证逻辑也套用在validateTransaction中,或参考 zkSync 官方文件的实作MultiSig Account Contract。
同时,在 4337 中的 Verification Phase 为了避免 DoS 威胁有一些限制(不能触及外部的 Opcodes 还有 Limited Depth 等),在 zkSync 也有同样的限制,例如:
1.合约逻辑只可以碰到自己的 slots(Account Contract 的地址若为地址 A):
·属于地址 A 的 Slots
·任何其他地址的 Slots A
·任何其他地址的 Slotkeccak256(A||X):同意直接使用地址作为 mapping 的 key(例如mapping(address=>value)),等同于同意碰触 slotkeccak256(A||X),以此方式进行扩增。例如 ERC-20 上的 token balance。
2. 合约逻辑不可以使用到 Global 变量,例如block.number
Keynotes and Limitations in Execute Function
executeTransaction需要注意的是如果要执行 System Call,需要确认有isSystemflag。因为这些 System Contract 对账户系统的影响非常大,例如增加 nonce 的唯一方式是与 NonceHolder 互动,要部署合约必须与 ContractDeployer 互动,藉由这个isSystemflag 可以确保账户开发者是有意识地要与 System Contract 互动。
然而实作上建议可以引用 SystemContractsCaller 这个 zkSync 提供的 Library 以避免自己处理isSystemflag,并使用其中的systemCallWithPropagatedRevert完成 System Call。
function _executeTransaction(Transaction calldata _transaction) internal{
address to = address(uint160(_transaction.to));
uint128 value = Utils.safeCastToU128(_transaction.value);
bytes memory data= _transaction.data;
if(to == address(DEPLOYER_SYSTEM_CONTRACT)) {
uint32 gas = Utils.safeCastToU32(gasleft());
// Note, that the deployer contract can only be called
// with a "systemCall" flag.
SystemContractsCaller.systemCallWithPropagatedRevert(gas, to, value, data);
} else{
bool success;
assembly {
success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)
}
require(success);
}
}
上面程序码的例子是与DEPLOYER_SYSTEM_CONTRACT互动,账户开发者最常碰到 System Contract 的情况就是我们要用账户去部署一个合约,此时必须要跟 ContractDeployer 这个 System Contract 互动。
Fee Model and Paymaster in zkSync Era
Fee and Gas Limit
zkSync 的费用模型与以太坊非常类似,Fee Token 也为 ETH,然而 zkSync 除了基本运算和写入 slot 的成本之外,和其他的 Layer2(Arbitrum、Optimism)一样需要考量发布到 L1 的额外成本(安全费用)。由于发布资料到 L1 上的 Gas Price 非常不稳定,所以在每个区块开启(开始收录交易)时,zkSync 的 Operator 会定义以下动态参数:
·gasPrice:以 gwei 为单位的 gas 价格,也就是前文提到的 transaction object 中的tx.gasprice
·gasPerPubdata:在以太坊上发布一个 byte 的资料所需的 gas 数量
此外,zkSync 不像 4337 一样需要定义三种 Gas Limits:verificationGas、executionGas和preVerificationGas,只单由一个gasLimit就包含以上所有的 fee cost,所以用户需要自行确认gasLimit足以涵盖 Verification Phase、Execution Phase 还有上传资料到 L1 的安全费用等全部 fee cost。这个就是前文提到的 transaction object 中的tx.gaslimit。
将两者相乘(tx.gasprice * tx.gaslimit)就能得到这笔交易所需要支付给 bootloader 的手续费数量。
Paymaster
Paymaster 主要在用户交易的支付手续费阶段时,代替 User 的 Account Contract 支付 ETH 给 bootloader,用户可以选择他们想要的 Paymaster 以及不同的 Payment Model 进行支付手续费,例如(但不限于):
1.在交易发起前或交易执行后支付 ERC-20 给 Paymaster
2.使用 Credit Card 储值进入 Paymaster Contract
3.Paymaster 会不断为 User 免费支付部分或全额手续费
用户要如何与 Paymaster 互动需要根据不同的协议而定,可以是中心化也可以是去中心化;可以在交易前,也可以在交易后;可以使用 ERC-20 也可以使用法币,甚至可以免费。
zkSync 的 Paymaster Contract 主要由两个函式构成,分别为validateAndPayForPaymasterTransaction(required) 与postTransaction(optional),两者都只能被 bootloader 呼叫:
·validateAndPayForPaymasterTransaction是整个 Paymaster Contract 中唯一必须实作的 function,当 Operator 收到的交易有附带 paymaster params 时,代表手续费不由 User 的 Account Contract 支付,而是由 Paymaster 支付。此时 Operator 就会呼叫validateAndPayForPaymasterTransaction来判断这个 Paymaster 是否愿意支付这笔交易。如果 Paymaster 愿意,这个函式会 send 至少tx.gasprice * tx.gaslimit的 ETH 给 bootloader。
·postTransaction是一个 optional 的函式,通常用于 refund(将未使用完的 gas 退还给发送者),但当前 zkSync 还不支援此操作。
zkSync 中的 Paymaster 有实作postTransaction才会执行postTransaction,这个部分有别于 4337,4337 如果在validatePaymasterUserOp没有回传context的话就不会呼叫postOp,反之则会。
综合以上,举例来说用户现在想要发送一笔手续费由 Paymaster 支付的交易,那流程如下:
1.藉由 NonceHolder 确认 nonce 是否合法
2.呼叫用户 Account Contract 上的validateTransaction进行验证,确认交易由账户拥有者授权
3.呼叫用户 Account Contract 上的prepareForPaymaster,里面可能会执行例如 approve 一定数量的 ERC-20 Token 给 Paymaster 或是不做任何事
4.呼叫 Paymaster Contract 上的validateAndPayForPaymasterTransaction确认 Paymaster 愿意支付并且收取手续费,同时 Paymaster 向用户收取一定数量的 ERC-20(前面 approve 的)
5.确认 bootloader 收到正确数量(至少tx.gasprice * tx.gaslimit)的 ETH 手续费
6.呼叫用户 Account Contract 上的executeTransaction执行用户想要的交易
7.如果 Paymaster Contract 有实作postTransaction且 gas 仍然足够(没有 out of gas error),那就执行postTransaction
最后一步即便 out of gas error 导致不能执行postTransaction,这笔 AA 交易也算是成功,只是省略掉呼叫postTransaction的动作而已。
更深入探究 zkSync 的 Paymaster 会发现它的 Verification Rules 和 4337 稍有不同(zkSync Paymaster 可以踩任何其他合约的 slot)、同时也有各种不同的 type(e.g.Approval-based),这部分由于比较细节所以有兴趣深入的人可以参考官方文件或我之前的实作。
Summary & Comparison
Recap the AA transaction in zkSync Era
经过上文的解释我们已经知道一个账户合约有哪些重点 Entry Point,以及他们的作用、相关限制,同时也知道 System Contract 是什么,接下来我们重新梳理一次一笔 AA 交易在 zkSync 中怎么从建置到完成,同时我也会附上更细节的 ref 让有兴趣深入了解的人可以参考:
1.用户在本地端使用 SDK 或钱包建置Transaction Object(e.g. from, to, data, value…)
2.用户对这个 Transaction 签章,这里的签章不一定真的是一个 EIP-712 格式且 ECDSA 曲线的签章,zkSync 也支援 2718 和 1559,且选择何种曲线或验证方式的重点是要通过 Account Contract 中的 validate function
3.将这个已签的 Transaction 透过RPC API送去给 Operator,这时会进入 Pending 状态,Operator 把这笔交易送给 bootloader(呼叫 bootloader contract 上的processL2Tx)执行一连串的 AA Protocol
4.booteloader 会检查 Nonce 是否合法(利用 NonceHolder)
5.booteloader 会呼叫 Account Contract 上的validateTransaction确认此笔交易是经过账户的拥有者授权的
6.booteloader 获取手续费的方式有两种,藉由何种方式来 collect fee 依照交易参数(组建 transaction object 时是否有附带上 paymaster params)而定:
7.「呼叫payForTransaction来跟 Account Contract 收取手续费」或者「呼叫prepareForPaymaster和validateAndPayForPaymasterTransaction来跟 Paymaster Contract 收取手续费」
8.检查 bootloader 有收到至少tx.gasprice * tx.gaslimit数量的交易手续费
9.booteloader 会呼叫 Account Contract 上的executeTransaction来执行交易
10.(optional)如果利用 Paymaster 来支付手续费,booteloader 会呼叫postTransaction,如果 Paymaster 没有实作postTransaction或 gas 已经耗尽就不会有这一步
以上的 4.~7. 步为 Verification Phase(定义在 bootloader 的l2TxValidation),第 8.~9. 步 Execution Phase(定义在 bootloader 的l2TxExecution)。
Comparison between EIP-4337, StarkNet and zkSync Era
基本上这三者的 AA 机制流程都相仿,皆为 Verification Phase → 手续费机制(由 Account Contract 支付或者 Paymaster)→ Execution Phase,主要差别有:
1.执行 AA 机制的角色是谁:在 zkSync Era 中最主要与其他两者 AA 的差别在于 Operator 需要和 bootloader(System Contract)一起配合,例如 bootloader 会开启一个新区块并且定义该区块的相关参数,接收 Operator 送来的交易们并且进行验证。在 4337 中这部分由 Bundler 与 EntryPoint 协作,而在 StarkNet 中这部分全部都由 Sequencer 负责。
2.Gas Cost 是否需要考量到 L1 安全费用:L2 的 AA 都需要考虑这个上传资料到 L1 的费用,不只是这边提到的 ZK(Validity)Rollups Native AA,在 Optimistic Rollups 实作 4337 时也需要算入 L1 安全费用(算在preVerificationGas中,细节可见Alchemy 相关文件)。
3.是否可以在 Account Contract 部署前送出交易:在 StarkNet 和 zkSync Era 中都没有像 4337 的 EntryPoint 有initCode这个 field 能让其替用户部署 Account Contract,所以都不可以在部署账户前送出交易。
Comparison
由于 StarkNet 尚无已实现的 Paymaster 机制、zkSync 也尚未完成 gas refund 机制的设计,所以一些比较细节的比较在这里就没有列出。
此外,目前的 4337 bundler 们并未完成 P2P mempool,且 zkRollups 的 Sequencer 和 Operator 也都还是唯一的官方 server,所以都有一定中心化的成分存在。
在开发流程上 zkSync 由于没有与各家 bundler 串接的问题(只需要与 Operator API 互动),所以使用起来相较 4337 容易,开发账户合约(SDK)的体验也会更好;同时 zkSync 可以使用 Solidity 作为合约开发语言,所以也不像在 StarkNet 开发需要跨过 Cairo 的门槛。
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
您可能感兴趣
-
解读CKB版 “闪电网络” Fiber Network:比特币可编程性扩展的另一种思路
作者:NingNing行业周期与宏观金融周期共振,加密行业正处在与 2019 年相似的整体性迷茫之中,现阶段不仅流动性枯竭,叙事貌似也在枯竭。市场不但对 VC 叙事兴趣阙如,对反 VC 的 Meme 叙事也已经疲倦。就像每次哲学危机,人们都会回归柏拉图寻找出路,当加密行业危机时,我们也需要回归比特币、回归中本聪。正如 CKB 生态 RGB++ 协议创始人 Cipher 在最新 Blog 里所阐述的,加密行业需要对以太坊 “链上计算” 的路径依赖进行反思,回归P2P经济学,让计算归于链下,让验证归于链上。因
-
面对NFL球员工会起诉,“退圈”的DraftKings竟主动承认NFT是证券?
作者:Zen,PANews近日,美国国家橄榄球联盟球员协会 (NFLPA) 指控数字体育娱乐和游戏公司DraftKings 逃避了其 NFT 球员许可协议的付款义务。在放弃NFT业务后,涉嫌出售未注册证券而遭到集体诉讼的DraftKings又背上了一起官司。而有趣的是,在与NFLPA的纠纷中,DraftKings的立场似乎已从反驳转变为积极承认“NFT就是证券”。放弃NFT业务:驳回集体诉讼的动议遭到否决今年7月底,Draftkings在给用户的电子邮件中表示:“经过慎重考虑,DraftKings 决定终
-
简析两种最新比特币智能合约实现方案:OP_NET与Arch有何区别?
作者:Cookie过去半个月,OP_NET 与 Arch 这两个比特币主网上的智能合约实现方案引发了较多的讨论。有意思的事情是,OP_NET 这个名字与大家熟悉的 OP_CAT 很像,都以「OP_」开头,具有很强的、让大家认为这哥俩差不多的迷惑性。所以,在开篇要和大家先提一嘴 OP_CAT。首先,OP_CAT 是比特币操作码,从去年开始有以「量子猫」Quantum Cats,也就是「大巫师」Taproot Wizards 的创始人 Udi Wertheimer 为首的社区力量一直在呼喊要「复活」OP_CA
-
争议不断,以太坊正在失去“万链之王”的权威
作者:Climber,金色财经近期围绕以太坊的话题和争议越来越多,不仅 Vitalik 本人需要下场解释观点,就连以太坊基金会也要发布公告来平息社区的质疑声。在本轮牛市周期中,以太坊的表现可谓平平。而美国以太坊现货 ETF 的通过也并未让 ETH 走势如投资者期待般爆发,相反却在币价方面越走越低。这就不免让有着「万链之王」美誉的以太坊逐渐失去投资者和社区的尊重,进而质疑起有关以太坊的方方面面。争议不断,以太坊亟需重塑权威最近一段时间以来社区成员对 Vitalik 言论观点、以太坊基金会乃至以太坊生态系统的
-
从《黑神话:悟空》谈起,GameFi何时能取得真经?
作者:YBB Capital Researcher Zeke前言本文是市场垃圾时间中的一些闲聊,需要对传统游戏市场有一定程度了解。大家可以把这篇文章当作日记或者随想观看,这些只是我在游玩《黑神话:悟空》之后对GameFi的一些粗浅思考,以及对这个赛道未来的看法。一、游戏科学的九九八十一难三天全网销量破千万、Steam玩家同时在线峰值破235万、多家品牌联名周边销售爆火、国家级媒体多次采访、多个游戏取景地可凭游戏通关记录终身免费进入、86版《西游记》YouTube观看量超400万。以上,是《黑神话:悟空》上
-
Gavin Wood:如何防止女巫攻击进行有效空投?
演讲:Gavin WoodGavin 近期一直在关注的女巫攻击(civil resistance)的问题,PolkaWorld 回顾了 Gavin Wood 博士在 Polkadot Decoded 2024 上的主题演讲,想要探究 Gavin 在如何防止女巫攻击上的一些见解。什么是女巫攻击?你们可能知道,我一直在研究一些项目,我在编写灰皮书,专注于 JAM 项目,也在这个方向上做了一些代码的工作。实际上,在过去的两年时间里,我一直在思考一个非常关键的问题,这个问题在这个领域中非常重要,那就是如何防止女巫
-
市场热议,链抽象将成加密新叙事?
2024年,加密货币领域的技术创新持续加速,链抽象(Chain Abstraction)逐渐成为行业内的焦点。链抽象技术的核心在于通过隐藏底层技术的复杂性,让用户能够更加便捷地在多个区块链之间进行操作。传统的区块链技术通常要求用户掌握不同链的操作流程,并需要应对跨链操作中的技术难题,这极大地吸引了新用户的进入。而链抽象的出现,则为这些问题提供了有效的解决方案,成为Web3建设不可忽视的重要一环。01、什么是链抽象及其作用链抽象能够将不同的区块链之间的差异整合在一个统一的操作界面中,使得用户只需一个账户即可
-
今日日报|马斯克和特斯拉赢得“被指控操纵狗狗币”的诉讼;稳定币支付平台Bridge完成5800万美元融资
今日要闻提示:马斯克和特斯拉赢得驳回指控他们操纵狗狗币的诉讼OpenAI和Anthropic已同意将其主要新AI模型在发布前共享给美国政府OKX将上线Hamster Kombat(HMSTR)现货交易X平台纽约总部将于9月13日关闭,预计将迁往得州萨尔瓦多总统布克尔成为《时代》杂志最新一期封面人物稳定币支付公司Bridge完成5800万美元融资数据:MATIC、SHIB、UNI代币头部地址持仓均超50%网龙今年上半年通过出售2.9亿元的加密货币,获利5100万元人民币监管消息美国众议院计划在9月举行多场加
- 成交量排行
- 币种热搜榜