Account abstraction 账户抽象

当前以太坊账户有两种类型:外部拥有账户(EOA)和合约账户(CA)。

外部拥有账户(EOA):常规的以太坊账户,创建和持有不需要任何成本,可以持有 ETH 和 ERC20/ERC721 等资产,可以发送 transaction 并支付交易的 gas 费。他的所有权仅靠一个私钥确定,拥有私钥等于拥有这个账户的所有权限,安全保管私钥是极重要的事情。

合约账户 (CA):通称位智能合约与 EOA 账户有些差异,CA 由智能合约代码决定其行为逻辑。合约代码储存在链上,创建它是需要成本的。它也可以持有 ETH 和 ERC20/ERC721 等资产,但是无法主动发起交易,必须有一个 EOA 地址从外部调用它。智能合约的所有权由其代码逻辑控制,不存在私钥。

账户类型 创建成本 所有权 资产管理 发起交易(机器人) 批量执行 消息签名 链的限制
外部拥有账户EOA 私钥 ETH、代币 可以 不可以 ECDSA 验签 不受限,在采用 ECDSA 的链上通用
智能合约CA 部署合约gas费 代码逻辑控制 ETH、代币 *不可以 可以 *调用合约钱包的验证签名方法验签 只有在链上部署钱包合约才能使用

*虽然合约自身不能主动发起交易,但是我们可以借助 OpenZeppelin\ AutoTasks_{[1]}Chainlink\ Automation_{[2]} 来发起自动调用。

*智能合约钱包需要定义一个验证签名的方法,去验证交易、消息的签名,在 EIP4337 中并没有针对消息签名做一些优化,只有验证 UserOperation 的 API

账户抽象 Account Abstract 的出现的目的是统一以太坊上面的两种账户类型,它有以下主要优点:

  • 原子批量执行
  • 支持聚合签名(如 BLS)
  • 非原生代币支付 gas

同样它也有两个主要的缺点:

  • 不能使用 ECDSA 的验证方式对消息签名进行验证,只能调用只能合约的签名验证方法验证,详见 EIP-1271_{[14]}
  • 在对应链上部署钱包合约才能去使用,没有部署的链无法使用

当前账户抽象 Account Abstract 主要有三种,

  • 一是 Argent Vault(非 Argent X 和 zkSync)的这种在 EIP4337_{[3]} 提案提出之前出现的智能合约钱包
  • 二是 Vitalik Buterin 在 2021 年 9 月 提出的 EIP4337 通过引入独立的 bundler 避免了共识层的修改,标准化的智能合约钱包
  • 三是 像 Starknet 这种原生支持 L2 的账户抽象,也是智能合约

Argent Vault(非 Argent X 和 zkSync)

Argent\ Vault_{[4]} 是 Argent 为管理 $50K plus 资产的客户提供的一个 L1 智能合约钱包解决方案。具备监护人批准的多重签名、无私钥和社交恢复等特性。

对于用户

在使用 Argent Vault 之前需要充值 ETH 到钱包中,Argent 在监控到 Vault 收到 ETH 后会对你的账户进行部署,约消耗 0.0061 Ether,这个过程是自动化的,在你进行第一次操作之前需要等待部署完成(Argent 帮你部署钱包 和 你的第一次操作 是两笔交易)。

在进行操作(转账、合约调用)之前,Argent Vault 会给你发送邮箱验证码及 SMS 进行验证这部分都是中心化的,然后才能发出交易。

交易会由 Argent Relayer 代为提交并收取交易费用。

目前 Argent Vault 可以通过 App 内适配的直接调用 Dapp 合约的 UI 和 WalletConnect 与 Dapp 交互,使用起来没有什么明显差异。

*受限与消息签名验证的问题,Argent 在 2022 年 2 月 25 日才支持与 OpenSea 交互_{[5]}

*因为 Argent 只部署在特定链,所以目前无法使用 mirror.xyz

对于开发者

因为 Argent Vault 实现了 WalletConnect 钱包端协议,所以开发者只需要在 Dapp 端接入 WalletConnect 即可与 Argent 用户交互。它有上述智能合约钱包的通病。

体验 Argent 的一些 transaction:https://etherscan.io/address/0x168d51e8e16bb77c6a2c5483575fc4e8f4fbf865#internaltx

EIP4337

EIP4337 是 Vitalik Buterin 等在 2021 年 9 月 29 日提出的一种不依赖于更高层的基础设施,完全避免共识层协议更改的帐户抽象提案,重点在去中心化(摒弃 Argent Relayer)和制定标准,它具备当下智能合约钱包的一切优点(批量执行、非 native 代币支付 gas)。

用户的操作被打包成 UserOperation 之后通过 bunder 的 RPC 端点提交给 bundler,由 bundler 进行验证和代提交,bundler 是去中心化的,人人都可以做 bundler。

对于用户

使用 EIP4337 的钱包跟普通的私钥钱包区别不大,只要钱包应用实现了 Injected Provider 或者 WalletConnect 交互起来跟普通钱包区别不大。

得益于 EIP4337 的优秀设计,用户在进行第一次操作之前无需提前部署钱包合约。

对于开发者

它也有上述智能合约钱包的通病。

EIP4337 bundler 使用 paymaster 代付的 transaction:https://goerli.etherscan.io/tx/0xd3a90050e5b7ab026ebac9c030ae8ba25402bb6a1174466e4c3d96c2c04a35ed

StarkNet

StarkNet_{[6]} 是以太坊的一个 Layer 2 方案,它实现了原生账户抽象。合约账户是一类公民,如果进行直接的合约调用,智能合约取不到调用者信息(相当于 EVM 的 msg.sender 为 address(0))。

StarkNet 智能合约采用名为 Cairo_{[7]} 的类 Python 语言,同时提供了 Solidity\ to\ Cairo\ 转译器_{[8]}

StarkNet 采用 STARK\ Curve_{[9]} + Pedersen Hash_{[10]} 的 ECDSA 算法,而 Ethereum 采用的是 secp256k1 + sha256 的 ECDSA 算法。

*当前 StarkNet 的 paymaster 模型还未推出,还没有一个完善的交易费用代付方案_{[11]}

对于用户

在使用之前用户需要通过 bridge 将 L1 的资产存入 L2,想要回到 L1 上再次使用时需要从 L2 解锁资产。

在使用钱包之前需要持有 ETH(目前还没有成熟的 paymaster 方案),账户合约的合约地址是提前算出来的,将 ETH 转移到 L2 的地址之后,才能去部署和使用账户合约。

Ethereum 有 web3js,StarkNet 有 @argent/get-starknet_{[12]} 目前 Braavos 和 Argent 都是使用的 Argent 团队制作的 starknet.js wrapper,使用上跟 Ethereum 钱包一致。

对比 Ethereum 主网来说,L2 的成本更低,速度更快。用户可以将资产跨链到 L2 在 L2 中使用 L1 上面的资产。

对于开发者

对于只运行在 StarkNet 上的开发者来说,使用 @argent/get-starknet 开发即可达到 Ethereum Dapp 的体验。

智能合约只能使用 StarkNet 专用智能合约语言 Cairo。

StarkNet 提供在 L1、L2 智能合约之间传递消息的能力_{[13]},有很多可能性。

体验 StarkNet 的一些交易:https://testnet.starkscan.co/contract/0x0484739289de98e6012eEe2984610b7C19Aa8A7a0723Bf46F81feAEEB11f1997#transactions

总结

用户视角

方案 安全性 成本 生态与体验
Argent Vault 中(邮箱、SMS认证、Relayer 都是中心化) 高(L1) 中(只可使用 WalletConnect 或 Argent 团队自己脱离 Dapp UI 适配的 Dapp)
EIP4337 优(Bundler 去中心化) 高(L1) 未知(等待 EIP4337 钱包出现,跟钱包开发团队强相关)
StarkNet 优(原生账户抽象) 低(L2) 优(L2 上面生态虽然不如 L1,但存在像 dYdX 一样无可替代的应用)

开发者视角

这些方案可以做的事情基本一致,除非你需要 L2 上面的特定能力,用户在哪里,项目就到哪里。

Resources

  1. Autotasks - OpenZeppelin Docs. (2023). Retrieved 18 January 2023, from https://docs.openzeppelin.com/defender/autotasks
  2. Reliable, high-performance smart contract automation | Chainlink. (2023). Retrieved 18 January 2023, from https://chain.link/automation
  3. Proposals, E. (2023). EIP-4337: Account Abstraction Using Alt Mempool. Retrieved 18 January 2023, from https://eips.ethereum.org/EIPS/eip-4337
  4. Argent Vault. (2023). Retrieved 18 January 2023, from https://www.argent.xyz/vault/
  5. OpenSea now fully supports Argent on L1. (2023). Retrieved 18 January 2023, from https://www.argent.xyz/blog/opensea/
  6. StarkNet. (2023). Retrieved 18 January 2023, from https://starknet.io/
  7. Cairo. (2023). Retrieved 18 January 2023, from https://www.cairo-lang.org/
  8. GitHub - NethermindEth/warp: Warp - Bringing Solidity to StarkNet at warp speed. Warp is a Solidity to Cairo Transpiler, this allows teams to write/migrate Solidity to Cairo for easy onboarding into the StarkNet ecosystem. (2023). Retrieved 18 January 2023, from https://github.com/NethermindEth/warp
  9. STARK Curve :: StarkEx Documentation. (2023). Retrieved 18 January 2023, from https://docs.starkware.co/starkex/crypto/stark-curve.html
  10. Pedersen Hash Function :: StarkEx Documentation. (2023). Retrieved 18 January 2023, from https://docs.starkware.co/starkex/crypto/pedersen-hash-function.html
  11. Starknet Account Abstraction Model - Part 2. (2022). Retrieved 18 January 2023, from https://community.starknet.io/t/starknet-account-abstraction-model-part-2/839
  12. @argent/get-starknet. (2022). Retrieved 18 January 2023, from https://www.npmjs.com/package/@argent/get-starknet
  13. Interacting with L1 contracts :: StarkNet documentation. (2023). Retrieved 18 January 2023, from https://docs.starknet.io/documentation/getting_started/l1l2/
  14. Proposals, E. (2023). EIP-1271: Standard Signature Validation Method for Contracts. Retrieved 19 January 2023, from https://eips.ethereum.org/EIPS/eip-1271#specification

Comments