本文回顾了账户抽象,介绍了StarkNet 原生账户抽象(AA)机制、同时比较了 StarkNet 钱包与EIP-4337 钱包体验。
原作者: ChiHaoLu (chihaolu.eth) @ imToken Labs
特别感谢 NIC Lin & Cyan Ho 对本文的审阅。
本文将重点介绍 StarkNet 原生账户抽象(Account Abstraction 本文简称 AA)、StarkNet 钱包体验以及与 EIP-4337 钱包体验的的比较。
同时,本文也发布在 imToken Mirror 上发布!
如果你了解以下背景知识,本文会更容易理解。
账户抽象的本质可以归纳为两个关键点:签名抽象和支付抽象。
签名抽象的目标是使各种账户合约能够利用不同的验证方案。这意味着用户不仅限于使用特定的数字签名算法,而是可以选择他们喜欢的任何验证机制。
与此同时,支付抽象旨在为用户提供一系列交易支付选项。例如,可以使用 ERC-20 代币进行支付,而不是使用本机代币,或者由第三方赞助交易。
当用户发送交易时,首先会遇到 Sequencer。作为 Layer2 解决方案,StarkNet 没有类似于过去矿工的角色,这就是 Sequencer 发挥作用的地方。Sequencer 必须:
负责这些任务的个体被称为 Sequencer。在 StarkNet 的背景下,账户抽象机制在 Sequencer 中定义(使用 StarkNet OS)。具体而言,StarkNet AA 受到 EIP-4337 的启发,并遵循交易处理的四个阶段来验证交易、收取费用并执行交易。
一旦用户的交易被接收,Sequencer 将验证 nonce 是否有效,并通过调用账户合约中的“validate”函数来验证交易是否得到账户所有者的授权。
由于 StarkNet 采用 AA 账户系统,用户可以在验证函数中实现他们喜欢的验证逻辑,而不是像以太坊中那样仅限于 ECDSA。我们将在 AA 特性部分更详细地探讨这一特性。
一旦验证成功完成,Sequencer 将从账户合约收取费用。如果交易在此失败,将不会收取任何费用。
接下来,Sequencer 将在 StarkNet OS 中执行交易,其功能类似于 EVM。
在此过程中,Sequencer 生成一个 trace,这是执行过程的记录,而不是函数的输出。然后将 trace 发送给 Prover 进行进一步处理。
在前一节中,我们了解了在 StarkNet 中执行交易所涉及的步骤。在本节中,我们将把注意力转向 StarkNet 中账户合约的实现,并探讨其关键方面。
在 StarkNet 中,账户合约作为用户与区块链进行交互的主要实体。除了执行用户发送的交易外,它主要负责:
这些入口点与 4337 账户合约是不同的。
账户合约必须实现这些强制性接口,这些接口是账户合约的主要入口点:
__validate_declare__()
__validate_deploy__()
__validate__()
__execute__()
无论执行何种操作(例如调用、声明或部署合约),都会首先调用相应的__validate__()
函数系列。
例如,如果你希望在 DEX 上将 ETH 兑换为 USDC,Sequencer 将首先调用__validate__()
来验证交易是否得到你的授权,然后调用__execute__()
来完成兑换。
因此,__validate__()
的输入参数将与__execute__()
的输入参数相同。
StarkNet 不支持 EOA,因为所有账户都被视为合约。
要创建一个新账户,必须部署一个合约。账户合约可用于 StarkNet 中的各种活动,包括转账、兑换和使用任意数据调用其他合约。
创建账户涉及以下步骤:
deploy_account
类型的交易以部署此账户。AA 钱包与 EOA 钱包之间的部署体验区别
用户可能会发现使用 AA 钱包有些困惑,因为 EOA 无需部署任何内容,可以简单地存入 ETH 并使用 EOA 钱包进行各种交易。然而,在 StarkNet 中,每个用户都必须首先部署他们的账户,这可能会导致困惑,不明白为什么AA钱包需要支付费用来“建立钱包”。
ArgentX 通过隐藏用户视角中的账户部署交易,为此提供了出色的 UX 解决方案。用户可以创建钱包,存入足够的以太币,并进行各种交易,而无需意识到账户部署交易。在幕后,ArgentX 将在发送用户的第一笔交易之前为用户启动账户部署交易。
因此,用户将不会意识到账户部署交易已经发生。
敏锐的用户可能会注意到第一笔交易的交易费比预期高。这是因为 ArgentX 在第一笔交易中收取了部署费用。
与 EOA 钱包的其他 UX 差异呢? 使用 StarkNet AA 钱包的用户体验与使用以太坊 EOA 钱包的体验没有显著差异,除了账户部署过程。
与其他 4337 钱包用户体验差异?
4337 钱包允许用户在部署钱包合约之前发送 UserOp,并且入口点合约将使用嵌入在 UserOp 中的initCode
部署钱包合约,在 StarkNet 中,你必须先部署账户合约,然后再向其发送任何交易。
EIP-4337 也共享相同的特性。
现在我们了解到用户可以定义其账户的功能,我们可以看到账户合约可以执行简单的签名检查并调用目标,或者可以编程实现几乎任何功能。
通过将一系列调用(例如 ERC-20 中的approve()
和transferFrom()
)包装为 MultiCalls 并提交给账户合约,我们可以在单个交易中执行多个操作。这样,如果它们作为独立交易进行,我们可以避免为每个单独调用签名和支付基本交易费用。
我们可以在验证函数中设计自己的验证机制。例如,我们可以使用各种算法(如 Stark Curve、secp256k1、secp256r1)验证签名,甚至可以使用多重签名机制。此外,这些签名算法也可以是量子抗性和 Gas高效的 。
账户合约还可以实现插件机制,允许未来扩展。你可以添加一个插件,该插件可在验证和执行函数中使用,以扩展账户的功能。
StarkNet 当前的交易费用与以太相关联。但是在未来,StarkNet 将允许用户选择如何支付交易费用。为了实现这一点,StarkNet 遵循 EIP 4337 中制定的指南,并允许交易指定一个特定的合约,即paymaster ,来支付其交易。
在验证阶段,Sequencer 需要验证 paymaster 是否有足够的资金来支付交易。
一旦验证完成并成功,Sequencer 将请求 paymaster 在执行交易之前支付交易。
用户可以选择在发送交易之前使用 ERC-20 或信用卡支付 paymaster,或者允许paymaster 在交易执行后从账户合约请求 ERC-20 费用。
从前一节中,我们了解了这两个目标的含义:
EIP-4337 和 StarkNet Native AA 之间的主要区别是:
TEM Medium 2023 有獎徵稿 TEM Medium 目前正在進行有獎徵稿!詳情請參考: https://medium.com/taipei-ethereum-meetup/validity-rollup-posting-state-diff-30cf70614af
StarkNet 交易和状态
StarkNet AA
我之前在以太坊 AA 上的文章
本翻译由 DeCert.me 协助支持, 在 DeCert 构建可信履历,为自己码一个未来。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!