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
- Autotasks - OpenZeppelin Docs. (2023). Retrieved 18 January 2023, from https://docs.openzeppelin.com/defender/autotasks
- Reliable, high-performance smart contract automation | Chainlink. (2023). Retrieved 18 January 2023, from https://chain.link/automation
- Proposals, E. (2023). EIP-4337: Account Abstraction Using Alt Mempool. Retrieved 18 January 2023, from https://eips.ethereum.org/EIPS/eip-4337
- Argent Vault. (2023). Retrieved 18 January 2023, from https://www.argent.xyz/vault/
- OpenSea now fully supports Argent on L1. (2023). Retrieved 18 January 2023, from https://www.argent.xyz/blog/opensea/
- StarkNet. (2023). Retrieved 18 January 2023, from https://starknet.io/
- Cairo. (2023). Retrieved 18 January 2023, from https://www.cairo-lang.org/
- 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
- STARK Curve :: StarkEx Documentation. (2023). Retrieved 18 January 2023, from https://docs.starkware.co/starkex/crypto/stark-curve.html
- Pedersen Hash Function :: StarkEx Documentation. (2023). Retrieved 18 January 2023, from https://docs.starkware.co/starkex/crypto/pedersen-hash-function.html
- Starknet Account Abstraction Model - Part 2. (2022). Retrieved 18 January 2023, from https://community.starknet.io/t/starknet-account-abstraction-model-part-2/839
- @argent/get-starknet. (2022). Retrieved 18 January 2023, from https://www.npmjs.com/package/@argent/get-starknet
- Interacting with L1 contracts :: StarkNet documentation. (2023). Retrieved 18 January 2023, from https://docs.starknet.io/documentation/getting_started/l1l2/
- Proposals, E. (2023). EIP-1271: Standard Signature Validation Method for Contracts. Retrieved 19 January 2023, from https://eips.ethereum.org/EIPS/eip-1271#specification