你能想象有一天,无需保管私钥/助记词,便可控制管理你的钱包吗?
你能想象有一天,即使“亲朋”偷走你的手机、黑客盗走你的私钥,你的资产依然安全吗?
你能想象有一天,你再也不需要担心:因为不小心授权,导致自己的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已经基本支持,尽管还有可以优化和改进的空间)
二、从以太坊账户开始
区块链的交易模型大致分为两种,以bitcoin为代币的UTXO模型和以Ethereum为代表的Account模型。前者适合货币记账,后者适于智能合约。
而以太坊上有两种Account类型:
Externally Owned Accounts (EOA):即外部控制账户,由任何人通过私钥控制。
Contract Accounts (CA):即合约账户,部署在区块链网络上,由合约代码控制(没有私钥)。
EOA账户是绝大多数钱包(如Metamask)默认创建的,也是当前普通用户接触最多的。
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账户的问题永远无法解决。
EOA与CA字段比较
1)两种账户的关键区别:
EOA账户:
创建不需要成本
可以自行发起交易
EOA账户之间的交易只能是ETH/代币转账
-合约账户:
创建账户需要成本,因为你用到了网络存储
只能在收到交易后发送交易
CA代码可以自定义执行各种不同的动作,如转移代币,甚至创建一个新的合约。
2)CA合约账户的每一个动作需要EOA进行触发:
EOA账户可以自行创建和签署一笔交易来发送信息;CA账户只有在收到一条消息后,它的代码才会被触发,进而执行相应的操作。以太坊上的每一个动作都是由一个外部拥有的账户触发的。(这个也是写死在以太坊协议中的,相关改动涉及到账户抽象的概念。)
EOA与CA行为触发对比
总结:
以太坊上账户包括EOA和CA两种。EOA账户之间只能进行转账,而CA可以定义任意的执行逻辑,但CA的操作需要EOA账户的交易触发。
可不可以利用CA合约账户的强大功能,为普通用户带来更好的控制和管理资产,实现安全、易用的特性?
三、合约钱包-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交互
通过这个架构,任意的执行逻辑可以被添加到合约中,从而可以改善用户体验和钱包的安全性。例如钱包保护、可恢复、可转让、可锁定的和可升级等。
具体合约介绍:
第一组合约构成了部署或更新用户钱包所需的基础设施,以及披露确保钱包安全所需的链上信息。这些基础合约只需部署一次。
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,除非满足以下任意一个条件:
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该怎么办。”
L2的交易费用较低,且网络可以设计成账户抽象的(zksync\starkent),把EOA账户变成合约账户可以从协议层解决这个问题。
Argent去年已经开始支持zksync网络,并推出了支持StarkNet的AgentX;尽管Guardian等安全功能还不支持,但随着L2对账户抽象的实现,相信未来不远。
六. 对比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尝试体验,每一步都有提示