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已经基本支持,尽管还有可以优化和改进的空间)

二、从以太坊账户开始

区块链的交易模型大致分为两种,以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”
“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字段比较
EOA与CA字段比较

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

EOA账户:

  • 创建不需要成本

  • 可以自行发起交易

  • EOA账户之间的交易只能是ETH/代币转账

-合约账户:

  • 创建账户需要成本,因为你用到了网络存储

  • 只能在收到交易后发送交易

  • CA代码可以自定义执行各种不同的动作,如转移代币,甚至创建一个新的合约。

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

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

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
https://dune.com/tschubotz/argent

1)无需私钥保管

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

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

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

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

添加Guardian
添加Guardian

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

  • 内置的DApp,包括lido、Aave、compound、balancer、yearn、UniswapV2;

  • 通过walletconnect链接的DApp,完成相关defi操作需要手机端钱包授权。

DApp交互
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合约调用流程
Argent合约调用流程

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

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

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

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

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

base wallet合约
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批准数量
【钱包恢复】需要的guardians批准数量

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

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

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

4)所有权转移

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

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

【钱包Owner转移】需要的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批准数量
【执行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该怎么办。”

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

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

https://www.argent.xyz/argent-x/
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自己尝试创建,每一步都会有提示。

参考资料:

Subscribe to AkaFish
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.
Author Address
0xAE623c8B158C3dF…6cA36b49b72f3e9
Content Digest
ERgzcfuIa9vArb0…BIH7rTb4l_bFgus