# Web3 合约钱包——Argent介绍

By [papara](https://paragraph.com/@papara) · 2022-08-01

---

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

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

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

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

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

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

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

背景 以太坊账户类型 Argent合约钱包 问题和局限 转移到L2？ 对比Gnosis Safe多签钱包 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](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账户的问题永远无法解决。

1.  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](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交互

1.  合约架构与实现逻辑 钱包创建：钱包的用户在他的移动设备上点击创建钱包，会私密地生成一个以太坊账户（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](https://etherscan.io/address/0x0b99a0945d830718ed7bf5842373487f7038c651#code)

Proxy Wallet合约

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

base执行合约：[https://etherscan.io/address/0xab00ea153c43575184ff11dd5e713c96be005573#code](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，除非满足以下任意一个条件：

the multicall由钱包所有者（owner）触发，the multi-call的每个交易：

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

\-转账或者授权资产（ETH、ERC20、ERC721、ERC1155）或者调用授权DApp

the multicall 由 owner和大多数guardians授权

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的元交易，实现了便利性，但带来了中心化与交易审查风险。

解决方案A：去中心化的中继网络，代付gas的中继网络，包括Biconomy等方式实现。

\*\*解决方案B：\*\*既然问题的本质是以太坊的交易规则限制（只能从EOA发起交易），因此修改协议本身-账户抽象-允许从合约开始发送交易。

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](https://mirror.xyz/0xAE623c8B158C3dF75b4f0f3886cA36b49b72f3e9/InJC_TMlw7fa71DEK3o6gB_-w86hsIFjthg-2IcqQR4)

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

[https://twitter.com/VitalikButerin/status/1540378345950842880](https://twitter.com/VitalikButerin/status/1540378345950842880)

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

[https://www.argent.xyz/blog/layer-2-recap/](https://www.argent.xyz/blog/layer-2-recap/)

[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可能的优化的方向？（探讨） 支持PC端及浏览器插件：用户将EOA私钥导出到不同设备，也可完成合约钱包的恢复 同时支持EOA钱包和合约钱包：用户可以把钱包当metamask用；也可以选择合约模式，将资金保管在合约钱包 中继模式可选：模式1自付gas与合约钱包交互，模式2通过中继（或者去中心化中继网络）代付gas提交交易到链上 支持多链网络？支持多链后，能否实现多链同地址？ 支持DApp交互便利，如内置浏览器可以链接任意的dapp 最后，如何体验？详细教程👇，你也可以自行下载app尝试体验，每一步都有提示

[https://mirror.xyz/xf0707.eth/6rHknbWJdW5RzHj0dKqu-WAlhRz1XaZZdXpJFNysgFE](https://mirror.xyz/xf0707.eth/6rHknbWJdW5RzHj0dKqu-WAlhRz1XaZZdXpJFNysgFE)

---

*Originally published on [papara](https://paragraph.com/@papara/web3-argent)*
