AkaFish

Posted on Jul 24, 2022Read on Mirror.xyz

Web3 合约钱包——Argent介绍

你能想象有一天,无需保管私钥/助记词,便可控制管理你的钱包吗?

你能想象有一天,即使“亲朋”偷走你的手机、黑客盗走你的私钥,你的资产依然安全吗?

你能想象有一天,你再也不需要担心:因为不小心授权,导致自己的NFT或其他代币资产被莫名转走吗?

这一天已经来了!O(∩_∩)O

上面的三个场景,正是V神在2021年1月提到的社交恢复的核心,目前已经在Argent实现,其实现的核心逻辑,就是资产账户与签名者的分离。

  • 在Argent,你创建钱包的全程没有私钥和助记词的出现,你只需要一个手机号和邮箱账户,即可完成创建。
  • Argent通过guardian机制,实现钱包的社交恢复。你可以为你的钱包添加guardian守护人(一个钱包账户),guardian不能触碰你的资产(不能发起转账等),只有在当你手机丢失、私钥被盗后,帮你实现无私钥恢复。
  • 不止如此,除了支持一切“正常”钱包(如metamask)所能进行的操作:如转账、Dapp交互,它还实现了类似银行账户的安全体验(交易限额、账户锁定、可信联系人等功能),支持Argent用户名转账(ens)、无需gas Token的元交易等。

最为重要的是,上述过程的实现,完全是非托管的,你的资产还是100%由你控制。

这篇文章会试着从背景、到原理、到合约实现介绍Argent是怎么做到的!以及Argent实现方案存在的问题及优化方向。

  1. 背景
  2. 以太坊账户类型
  3. Argent合约钱包
  4. 问题和局限
  5. 转移到L2?
  6. 对比Gnosis Safe多签钱包
  7. Argent可能的优化的方向?

如果你看到一半看不下去,可以先去下载Argent钱包app,自行体验钱包创建、Vault激活、钱包转账、DApp交互、添加guardian、钱包锁定及恢复等主要功能,再回来看介绍。

一、背景:

before 2020—-炒币在交易所、钱包需求较弱

用户主要在交易所买卖公链代币,钱包功能仅限于资产持有和转账,其它应用并不突出。

after 2020—-DeFi交互成为必须、钱包成为刚需

以太坊上DApp、NFT、Gamefi、Socialfi兴起,极大的赚钱效应导致交互成为必须,钱包已成为去中心化金融应用的入口

钱包存在的问题:对普通用户要求较高

  • 私钥单点失效问题:一个钱包对应只有一个私钥,一旦私钥失去控制,所有资产不可找回
  • 私钥保管问题:私钥易丢失(忘记)、被盗,失去私钥就失去全部资产

当前解决钱包安全、私钥保管的几个方法:

以上私钥保管方案存在各自的问题,并且未解决私钥单点失效问题,如硬件钱包:

  • 解决了私钥保管问题
  • 未解决单点失效风险(硬件钱包丢失、被盗)
  • 引入新问题:交互不方便(出门带硬件钱包?)

多签钱包目前是比较好的方案,但也存在问题诸多不便:

  • 解决了单点失效问题:比如你有一个2/3多签,只要任意两个密钥签名就可以发送交易。即便其中一个设备丢失或被盗,你也可以访问到自己的资金。
  • 没有解决私钥保管问题,
  • 引入新问题:需要保管的私钥更多,且交互不便((出门带两部手机?)

多签常见模式:两个易于访问但独立的密钥是由你掌握的(笔记本或手机),第三个是更安全但易访问的备份,其离线存放或由朋友或机构托管。

有没有一种方案,可以同时解决:私钥保管问题(无需保管私钥)、解决单点失效问题(丢失可找回)、又不影响交互便利性(一部手机搞定)?也就是V神所说的社交恢复?目前的以太坊账户体系,能很好的支持这种钱包吗?

(答案是肯定的,Argent已经基本支持,尽管还有可以优化和改进的空间)

https://twitter.com/VitalikButerin/status/1348394962103070720

二、从以太坊账户开始

区块链的交易模型大致分为两种,以bitcoin为代币的UTXO模型和以Ethereum为代表的Account模型。前者适合货币记账,后者适于智能合约。

而以太坊上有两种Account类型:

  • Externally Owned Accounts (EOA):即外部控制账户,由任何人通过私钥控制。
  • Contract Accounts (CA):即合约账户,部署在区块链网络上,由合约代码控制(没有私钥)。

EOA账户是绝大多数钱包(如Metamask)默认创建的,也是当前普通用户接触最多的。

1. EOA账户的私钥绑定关系,是问题的根源

一个EOA账户,包含以下3个字段:

  • An address:账户地址,类似银行账号、邮箱地址的概念
  • A balance:账户资产,类似银行卡余额
  • A nonce:nonce交易计数器,用来确保每个交易的唯一性

一个普通用户(Signer),通过固定的公私钥对来拥有EOA账户、控制账户中的资产(上面说的balance):Signer可以通过私钥签署交易,花费EOA账户上的资产。

“Not your key, Not your coin”

以上EOA账户的特点,正是前面背景中所述问题的根源:Signer和EOA账号一一绑定的关系,导致整个EOA账户的安全完全依赖用户管理的私钥:

  • 一旦你丢失了私钥,你就丢失了账户(及里面的资产)
  • 如果你的私钥被盗,那么你的账户(及里面的资产)也就被盗走了

EOA账户的特点是写死在以太坊协议里面的,除非对协议中的账户进行重新设计(账户抽象),把EOA账户变成合约账户,否则EOA账户的问题永远无法解决。

2. CA合约账户,比EOA账户更强大

CA合约账户不仅拥有EOA账户作为“钱包”的基本功能,比如可以持有和收发ETH及代币、与部署的合约交互,还可以CA账户可以自定义更多的功能和执行逻辑(CA账户比EOA账户多了存储和代码字段),比EOA更强大。

EOA与CA字段比较

1)两种账户的关键区别:

EOA账户:

  • 创建不需要成本
  • 可以自行发起交易
  • EOA账户之间的交易只能是ETH/代币转账

-合约账户:

  • 创建账户需要成本,因为你用到了网络存储
  • 只能在收到交易后发送交易
  • CA代码可以自定义执行各种不同的动作,如转移代币,甚至创建一个新的合约。

2)CA合约账户的每一个动作需要EOA进行触发:

EOA账户可以自行创建和签署一笔交易来发送信息;CA账户只有在收到一条消息后,它的代码才会被触发,进而执行相应的操作。以太坊上的每一个动作都是由一个外部拥有的账户触发的。(这个也是写死在以太坊协议中的,相关改动涉及到账户抽象的概念。)

EOA与CA行为触发对比

总结:

以太坊上账户包括EOA和CA两种。EOA账户之间只能进行转账,而CA可以定义任意的执行逻辑,但CA的操作需要EOA账户的交易触发。

可不可以利用CA合约账户的强大功能,为普通用户带来更好的控制和管理资产,实现安全、易用的特性?

三、合约钱包-Argent

1. Argent简介

  • Argent是一个移动端合约钱包。
  • Argent基于合约逻辑同时解决了:私钥保管问题(无需保管私钥)、解决单点失效问题(Guardian守护人机制、钱包丢失可找回)、同时几乎不损害交互便利性
  • Argent还实现了类似银行账户的安全体验(交易限额、账户锁定、可信联系人等功能),支持Argent用户名转账(ens)、无需gas Token的元交易等。
  • 当前使用情况:Argent 钱包数量70,798 个;ETH 钱包余额合计:14,451 ETH;ETH 累计存入总额:30,883 ETH;累计交易笔数:509,226。

https://dune.com/tschubotz/argent

1)无需私钥保管

你只需要一个手机号、邮箱,即可完成创建(没有私钥、助记词保管环节,跟创建web2账户体验类似)

2)社交恢复——钱包丢失可以找回

你可以为钱包添加guardian守护人,可以是你的metamask、硬件钱包,也可以是你家人、朋友、第三方服务机构的钱包;当你钱包丢了,你可以联系guardian帮你进行恢复。

默认情况下,钱包会将Argent官方设置为一个Guardian(可以移除)。因此当你钱包丢失后,通过手机短信和邮箱验证后,便可以恢复钱包,类似web2一样无需私钥的体验(如果guardian超过3个,需要不少于n/2个guardian批准)。

添加Guardian

3)便利性:支持转账、swap代币,可以与DApp交互

  • 内置的DApp,包括lido、Aave、compound、balancer、yearn、UniswapV2;
  • 通过walletconnect链接的DApp,完成相关defi操作需要手机端钱包授权。

DApp交互

2. 合约架构与实现逻辑

  • 钱包创建:钱包的用户在他的移动设备上点击创建钱包,会私密地生成一个以太坊账户(EOA账户),当用户选择创建合约钱包(手机前端称作Argent Valut)时,合约工厂会为用户创建一个ProxyWallet合约,并将Owner设定为用户手机端的EOA账户。用户的资产(如ETH、ERC20、ERC721或ERC1155代币)存储在这个ProxyWallet智能合约上。
  • 代理-执行分离:ProxyWallet智能合约是轻量级代理合约,它会将所有调用委托给一个类似Base Wallet库的合约,这样代理-执行的设计模式可以降低每个新钱包的部署成本。
  • 交易处理:EOA账户作为owner可以签名交易信息,并由 agrent relayer 代为提交至链上并“代付”gas费,之后CA钱包把gas费refund 给argent relayer。
  • 钱包功能:钱包的不同功能封装在模块中。每个模块合约被所有钱包用来处理特定的一组操作(比如,添加或撤销guardians,做multicalls等)。模块化结构便于升级钱包(只需添加或删除模块)。

通过这个架构,任意的执行逻辑可以被添加到合约中,从而可以改善用户体验和钱包的安全性。例如钱包保护、可恢复、可转让、可锁定的和可升级等。

具体合约介绍:

第一组合约构成了部署或更新用户钱包所需的基础设施,以及披露确保钱包安全所需的链上信息。这些基础合约只需部署一次。

  • Multisig Wallet:定制化的多签钱包是大多数基础合约的owner。因此对基础合约的所有调用,需要经过多签持有人批准。
  • Wallet Factory:Wallet Factory 用来通过CREATE2创建代理钱包并将钱包分发给用户。
  • ENS Manager:ENS Manager负责注册ENS子域名(比如,akafish.argnet.xyz)并将他们分配给钱包。
  • ENS Resolver:The ENS Resolver保持ENS子域名和地址之间的关联,并允许双向解析。
  • Module Registry:The Module Registry 维护着一份可用于用户钱包的已注册Module合约列表。它还维护着一个已注册upgrader合约列表,用户可以用它来迁移他们钱包中使用的模块。
  • Token Registry:可以安全交易的ERC20代币的链上注册表
  • Dapp Registry:由Argent授权的Dapps注册表。The DappRegistry 目前支持2个注册表。

Argent合约调用流程

第二组合约——实现钱包的功能:

  • Proxy Wallet:轻量级代理合约,将所有调用委托给一个类似Base Wallet库的合约。每个钱包会部署一个代理合约。注意,使用代理-执行设计模式并非是为了实现钱包的可升级(Argent使用可升级模块/功能来实现这一点),而是为了降低每个新钱包的部署成本。

    一个钱包的代理合约(示例):https://etherscan.io/address/0x0b99a0945d830718ed7bf5842373487f7038c651#code

Proxy Wallet合约

  • Base Wallet:The Base Wallet是一个简单的类似库的合约,(通过委托调用)实现代理钱包使用的钱包基础功能,预计不会发生改动。这些功能包括更改钱包的owner,授权或取消模块授权,执行(携带价值的)内部交易到第三方合约。

    base执行合约:https://etherscan.io/address/0xab00ea153c43575184ff11dd5e713c96be005573#code

base wallet合约

  • Modules:钱包的不同功能封装在模块中。每个模块合约被所有钱包用来处理特定的一组操作(比如,添加或撤销guardians,做multicalls等)。已注册的模块可以被钱包的owner添加或者移除来实现对钱包功能的更新,但钱包只是要有一个模块。模块被分组成bundles,并且每个bundle都有一个独立的版本号。钱包通常会由他的owner使用特定的模块bundle(即版本号)进行升级。
  • Storages:一些模块将部分状态存储在专门的存储合约中。

3. 具体功能

1)Guardians 安全机制

Argent钱包的安全机制是基于添加guardians(守护人)的能力实现的。这里的guardian指的是一个账户(EOA或者智能合约),这个账户被Argent钱包的owner授权,可以在其钱包上执行某些特定的操作。

guardians可以锁定钱包、解锁钱包、触发钱包恢复流程、批准对陌生账户的交易执行以及创建session key

guardians的类型没有限制,可以是朋友的Argent 钱包、朋友的EOA账户、一个硬件钱包或者是付费第三方服务账户。

添加guardian是由钱包的所有者(owner)触发的行为。虽然,第一个guardian是在钱包创建时被立即添加的,后续添加guardian必须等待36-48小时的确认窗口期。在确认窗口期内,一旦钱包被锁定或者恢复,添加guardian行为将被取消(失效)。

移除guardian同样是由钱包的所有者(owner)触发的行为。移除同样存在一个36-48小时的确认窗口期。在确认窗口期内,钱包的合法所有者在对他们的移动设备失去控制的情况下,拥有足够的时间注意并阻止任何非法的guardian移除行为。

2)钱包锁定

如果钱包的所有者怀疑他的账户(即设备)被破坏(丢失、被盗…),他可以要求任何一个guardian将钱包锁定5天。一旦钱包被锁定,只能进行特定的受限操作:钱包恢复流程、解锁流程或者撤销guardians。所有其它操作(添加guardian、资产转移…)都会被阻止。

要想在安全期结束前解锁钱包,需要任意一个guardian触发钱包解锁。

通过电脑端的安全中心完成对argent的锁定、解锁、恢复、取消回复、添加Guardian等操作;通过metamask、ledger、trezer批准交易也需要在电脑端链接安全中心进行签名。

3)钱包恢复

钱包恢复是一个由宣称拥有一个钱包而没有owner 私钥的用户发起的请求。钱包恢复会将一个新账户设定为钱包owner。这个过程由钱包的guardians来执行,因此钱包至少要有1个guardian。一旦恢复被执行,除非中间被取消,否则它将在48小时后被最终确定。

执行一个恢复的签名数不小于 n/2,n是guardians的总数。

【钱包恢复】需要的guardians批准数量

一个恢复在被最终确认前可以被取消。取消恢复的签名数(owner和/或guardians)需要不小于(n+1)/2,n是执行恢复时的guardians的总数。

【取消钱包恢复】需要的guardians批准数量

一旦恢复开始,钱包会被自动锁定。钱包只能在恢复最终确认后或取消进行中的流程后才能解锁。也就是说,guardians在恢复过程中不能解锁。

4)所有权转移

除了恢复之外,在仍然控制着移动设备的情况下,用户还可以将其钱包的所有权转移到新设备上。这种转移时即时的(以避免服务中断),但必须经过guardians的批准。

执行所有权转移的签名数不小于1owner+n/2,第一个签名是owner,n是guardians的总数。

【钱包Owner转移】需要的guardians批准数量

5)Multi-Call

钱包可以通过multi-call与以太坊生态进行交互,例如发送资产或者与DApp上的智能合约交互。一个multi-call是一个由钱包逐个执行的交易序列,如果其中任何一个交易失败,multi-call就会失败。

根据设计,钱包会阻止一个multi-call,除非满足以下任意一个条件:

  1. the multicall由钱包所有者(owner)触发,the multi-call的每个交易:

    -转账或者授权资产(ETH、ERC20、ERC721、ERC1155)到可信联系人

    -转账或者授权资产(ETH、ERC20、ERC721、ERC1155)或者调用授权DApp

  2. the multicall 由 owner和大多数guardians授权

  3. the multicall 由有效的session key签署执行

6)可信联系人

Argent钱包拥有由钱包owner管理的可信地址清单。添加地址到该清单的行为需要由钱包owner触发,在36小时后生效。移除地址由owner触发且可以立即生效。

与可信联系人交互,比如发送资产,可以由钱包owner触发,并不需要额外的授权。

7)DApp 注册表

除了可信联系人,Argent钱包还支持2个已被Argent授权的地址注册表。

第一个注册表是对所有钱包都默认启用的(opt-out),包含了所有原生集成在Argent客户端应用程序中的DApps(Pareswap、Compound、Maker、Aave等)。第二个注册表是默认关闭的(opt-in),包含了一个精选DApps的列表,用户可以通过walletconnect访问。

每一个注册表中的条目都是一个授权地址和过滤器之间的映射,过滤器包含了从Agent钱包到授权地址的交易需要满足的一系列条件。在注册表中添加或删除一个条目的行为,是一个只能由Argent多签发起的带有时间锁的操作。时间锁被设置为7天,一旦用户不批准新的添加,用户有足够的时间来禁用相应的注册表。

启用或禁用一个钱包的支持表是通过multi-call实现的,并且需要guardian批准。需要的签名数不小于1owner+n/2,第一个签名由owner签署,n是guardians的总数。

与授权DApp的交互,比如在DeFi协议中投资,可以由owner触发,只要相应的注册表是启用的,并且交易通过了相关的过滤。

8)Guardian 批准交易

只要获得guardian的批准,钱包owner可以执行任何的交易(multi-call)。需要的签名数不小于1owner+n/2,第一个签名由owner签署,n是guardians的总数。

【执行Owner发起的交易】需要的guardians批准数量

9)Session

用户如果在特定时间窗口需要执行许多交易,而希望只需要他们的guardians批准一次,就可以通过创建session来实现。一个session定义了一个临时session key,只要session key在期间有效,就可以用来执行任何multi-call。Session的持续时间由owner在创建session时定义,session key将在session结束时自动失效。

启动一个session需要的签名数为1owner+n/2,第一个签名由owner签署,n是guardians的总数。

钱包的owner可以在过期前随时关掉一个session。

10)升级

Argent钱包是可以升级的,因此可以增加新的功能和修复潜在的bugs。至于选择是否升级钱包是由钱包owner决定。特别是,像Argent这样的中心化的主体不可能强制升级钱包并改变一个被认为是owner不可改变的实现。

11)ETH-less(无需以太)账户

owner和guardians可以不需要支付交易费和拥有ETH的情况下执行钱包操作,即他们是ETH-less账户。这是通过让账户签署执行信息、并允许第三方relayer代为执行交易和支付费用。签署交易的一方可以指定,钱包是否应当将执行交易所需的gas(部分或全部)退还给第三方relayer。这种模式被称为元交易(EIP-1077)。

Guardian可以执行的操作总结:

四、问题与局限

1)Argent官方默认为Guardian的安全风险

  • 无需私钥恢复钱包的体验,得益于中心化托管。

官方本身作为一个guardian身份:在用户通过手机、邮箱验证,官方行使guardian的相关权力,帮你恢复钱包;本质上,官方相当于帮你托管了一个guardian私钥,尽管可以移除。

官方作恶或者托管的guardian私钥泄露风险:在只有官方guardian或你设置了1个guardian的情况下,官方是可以把你的钱包恢复出来的(尽管有48小时的窗口期),尽管我们默认官方不会这么操作,但也存在被黑客攻击和利用的风险

2)依赖中心化Relayer处理交易:

依赖Relayer监听owner的链下签名信息并将其提交到链上,这种设计可以支持无需gas Token的元交易,实现了便利性,但带来了中心化与交易审查风险。

3)体验上的不便:

  • 高昂的交易成本:

合约钱包的交易费用高,上面两个解决方案AB都没解决交易费用问题,相反因为使合约更加复杂而带来更高的成本。

  • 目前只能在手机端:EOA的私钥是私密保管在手机,目前没有导出按钮,可能出于特殊考虑
  • 支持的链有限:目前vault只有Ethereum,zksync、starknet只是单纯的类似EOA的账户,还不支持Vault的特殊安全功能

五、转移到二层网络?

对于未来的发展方向,Mirror CTO表示,未来所有的交易所、应用及钱包广泛的迁移或支持L2网络,这是应该是影响 web3成为主流的关键

“如今,你使用万事达卡还是维萨卡并不重要。所有的支付处理器都可以处理其中任何一个,并且它们抽象了差异。L2 网络也需要发生同样的事情,钱包很可能需要承担这项任务。

不同的产品将在不同的 L2 上推出。如果我们期望用户浏览所有不同的 L2 会很麻烦,因此钱包(Coinbase Wallet、Rainbow、Argent 等)需要抽象 L2 并提供在它们之间无缝桥接的方法。用户不需要担心:他们拥有 Arbitrum ETH 代币却想使用 Optimism 上的 Mirror该怎么办。”

https://mirror.xyz/0xAE623c8B158C3dF75b4f0f3886cA36b49b72f3e9/InJC_TMlw7fa71DEK3o6gB_-w86hsIFjthg-2IcqQR4

L2的交易费用较低,且网络可以设计成账户抽象的(zksync\starkent),把EOA账户变成合约账户可以从协议层解决这个问题。

https://twitter.com/VitalikButerin/status/1540378345950842880

Argent去年已经开始支持zksync网络,并推出了支持StarkNet的AgentX;尽管Guardian等安全功能还不支持,但随着L2对账户抽象的实现,相信未来不远。

https://www.argent.xyz/blog/layer-2-recap/

https://www.argent.xyz/argent-x/

六. 对比Gnosis Safe多签钱包

钱包控制逻辑差异:

Argent在手机本地生成并私密存储EOA账户私钥,并通过该EOA账户控制合约钱包;私钥不能导出,只有移动端

Gnosis Safe是可以导入或本地生成EOA账户,将其设置成合约钱包的owner;本地生成的EOA私钥可以导出,作为普通EOA钱包使用;因此Gnosis可以支持移动端和PC端及插件

核心定位的差异:

Argent更侧重于钱包的易用性及安全:使用体验更像是Web2的微信,微信、邮箱注册,即可拥有和控制资金的钱包,对于加密用户新人来说门槛低,易用性强;但也存在诸多功能上的限制。

Gnosis更强调多签:使用范围更多的是项目方、大的加密资产管理方;支持的各种模块及组件更开放多元。

七. Argent可能的优化的方向?(探讨)

  1. 支持PC端及浏览器插件:用户将EOA私钥导出到不同设备,也可完成合约钱包的恢复
  2. 同时支持EOA钱包和合约钱包:用户可以把钱包当metamask用;也可以选择合约模式,将资金保管在合约钱包
  3. 中继模式可选:模式1自付gas与合约钱包交互,模式2通过中继(或者去中心化中继网络)代付gas提交交易到链上
  4. 支持多链网络?支持多链后,能否实现多链同地址?
  5. 支持DApp交互便利,如内置浏览器可以链接任意的dapp

最后,如何体验?详细教程👇,你也可以自行下载app尝试体验,每一步都有提示

https://mirror.xyz/xf0707.eth/6rHknbWJdW5RzHj0dKqu-WAlhRz1XaZZdXpJFNysgFE

参考资料:

https://ethereum.org/en/developers/docs/accounts/

https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf

https://vitalik.ca/general/2021/01/11/recovery.html

https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap

Web3