摘要: 理解以太坊钱包的历史、所用的模块,以及它们对未来的 dApp 开发和用户体验的影响我曾经讲解过去中心化应用(dApp)的产品可组合性,当然,用的是非常简单的层叠示意图:
实际上,有两个层级被我省略掉了,就是钱包和 SDK;而且,还可以再加上有关 “链” 的一层:
本文我准备谈谈,为什么这些额外的复杂性会导致人们的视角发生转变:可组合的钱包会对用户和开发者两端都产生越来越重要的影响。一般来说,在走到产品开发的 “最后一公里” 的时候,也就是开发团队要决定接入尽可能多的钱包时,人们才会想起还有钱包这回事(假设这个团队既负责产品的智能合约后端,也负责前端)。目前来说这没什么大问题,因为大多数 dApp 在用户交互上都是很简单的(即,授权 + 存入、拍卖/买入,以及互换)。在互动的 前/后 没有太多需要管理或表示的东西。
但我们的生态还会变得更加复杂的,那时候怎么办呢?在可预见的未来,我们都要着手管理自己的以 token 形式体现的数字身份,比如 skills、credit scores、social circles,等等。这就会在接入我们今天所用的标准协议前产生额外的一个交互步骤、要管理更复杂的网路和用户关系,以及相应的市场。思索这个前景,我们会自问:每个产品都要自己管理一个特定的前景,这合理吗?Web 2.0 时代的方法就是创建另一个 应用市场/网站,但我觉得我不会喜欢再有一个网站来跟踪我怎么管理自己的身份和自己所用的网络。我认为,这样私人的东西应该在钱包层完成处理,因为在这个环境中,个人自主和隐私性是第一位的。
虽然我不介意为了使用不同的协议而跳转到不同的网站,但我也不希望为了管理我的链上交互的不同部分而使用多个钱包。这样很蠢,而且每多一个就多一些安全风险。但如果我只使用一种钱包,那我就把自己跟这个钱包背后的开发团队的内在风险绑定起来了 —— 更不用说总会有他们还没开发的新功能。请记住,我们已经身处一个迅猛发展的世界中,没有哪个团队可以样样精通。
这就是为什么我们需要钱包的可组合性。虽然我想直接开始,但我还没讲到钱包是由哪些部分组成的。在谈到 DeFi 和 许多以太坊 dApp 时,我们已经有了 “货币积木” 这个词;因此我准备把钱包的可组合性模块称为 “通道积木(access lego)”。
四个层级中的每一个都应允许用户灵活地选择产品,而每个层级都应由产品提供者提供定制化的积木。
这里有很多东西可以深挖,所以我们先快速回顾下密码学货币钱包的历史,以便更好地理解这些积木,以及我们今天所用的先进钱包服务是如何得来的。
以太坊钱包简史
第一个以太坊钱包的灵感来自 Bitcoin Qt 钱包,是由 Mist 团队做出来的。
- 图片来源 -
Mist 钱包看起来跟 Qt 非常像,都是一个需要下载的软件,然后可以导出交易数据,也支持 区块同步/区块浏览:
- 图片来源 -
这个钱包其实是想把一个以太坊节点能够做到的事情都装进一个软件里 —— 那就需要安装大量依赖,整体的用户体验也不好。到 2016 年,MetaMask 出现,是最早的基于浏览器的钱包之一。自此,dApp 可以从钱包中解耦出来,只需嵌入钱包的连接方式即可。这一点随着生态系统的成长变得非常重要,因为此前单个团队想跟踪所有 EIP 的进展和发展出来的 token/协议 是非常困难的(现在也仍然如此)。我想指出的是,虽然这增加了 dApp 产品的可组合性,这还不是上面的 “通道积木示意图” 中所指的钱包内的智能合约集成。这一部分一直到新的集成方式如 WalletConnect 出现之后才有所改变。
- 钱包连接方式嵌入示例 -
这样一来,钱包的一些责任和负担就移除了,现在它的重点变成了交易构建、签名以及维持与区块链的连接。我不想深究细节,但交易构建意味着要从 dApp 处接收一些交易参数、并且其它参数要保证完全在钱包控制之下。这使我们走向了对钱包(也可称为 “提供者”)可用的 RPC 调用,最早由 EIP-1193 定义。dApp 可以发送一些参数如目标地址、数据、gas limit/price、数值给钱包,但 无法控制链 ID、发送者地址以及 nonce 等涉及钱包安全的参数。
有了这种新型钱包之后,我们又多了两种复杂的用户体验:
记住 其他用户/朋友 的地址是很困难的,不安全,而且容易发生人为的错误
交易附带的字节码是不可阅读的,除非你非常熟悉函数选择器以及 数据/参数 的哈希值。要是你没有合约的 ABI,那就有你好看的了。
为了解决第一点,ENS 在 2016/2017 年月 EIP-137 一起推出,成为了我们的第一块社交积木。现在,大家都可以用一个网站域名来表示自己的以太坊地址(比如 vitalik.eth),在 消息/转账 中使用即可免去输入长长的地址。这只是社交智能合约层的一部分;其余部分要花更大的精力来 解耦/实现可组合性。
关于第二点,Parity 创建了一个 “方法注册表”,被广泛用户在钱包的签名界面给出人类可读的信息。EIP-712 在此发挥了重要作用,尽管它到最近才获得更多关注。不过,即使有了这些设置,还是很难保证你的浏览器没有被黑或被欺骗从而显示出不真实的 交易/信息。这是使用热钱包(即总是连接到互联网、并且没有与你的计算机环境的其余部分隔离开来的钱包服务)的最大问题之一。
常见的解决方案是一个硬件钱包,开拓者是 Ledger,从 2014 年起步。MetaMask 在 2018 年首日添加硬件钱包支持,正式地解耦了安全层和 交易层/连接层。我们后面还会再回顾这一点,因为 Ledger 作为冷存储钱包固然很棒,但一些新产品也有很大改进。
- 正上方的即是一个 Ledger 钱包 -
于此同时,我们看到,许多复杂的协议在 2020 年夏天开始在 DeFi 世界里领一时之风气(其中大部分都开发了超过 2~3 年)。这给了我们越来越多的代币,学会安全管理也变得越来越重要。为了帮助大家跟上圈子的进步,人们创建了一种新的 RPC 端点,让 dApp 可以在钱包所跟踪的代币列表中添加种类。更多管理资产的工具被创建出来,比如 Argent vaults 和 Gnosis multi-sig safes(我还认为这两款产品与社交层有关,因为他们都有多用户机制以及 DAO 机制)。人们还给 dApp 的数据分享创建了 “许可连接” 标准(EIP-2255),以防止对钱包的恶意访问。资产管理/资产聚合器、分析器,也因为 Zerion 和 Zapper 而从钱包中解耦了出来(下一章节我们还会回头讲解这两个产品)。
自 2019 年开始,手机钱包也出现了增长。Rainbow wallet 是最佳范例之一,他们的用户体验设计得非常好。但要讲到无缝集成,他们也才刚刚开始。
大多数其它手机钱包(比如 MetaMask 手机版和 Coinbase Wallet)都尝试并且在应用内开发了一个 dApp 浏览器,依赖于 deeplink 而非直接集成。这些 deeplink 无法提供很好的用户体验,但在以太坊上开发的产品又多到钱包团队无法设计出一个可以与所有产品交互的大一统接口。假设每个钱包应用团队都专门为一个应用场景(消息、NFT/市场、DeFi,等等)做优化 —— 那么,我的安全风险都跟我所用的钱包数量成正比。也许它们都是最小化的,因为安全模块已经完全解耦 —— 但因为市场已变得碎片化,开发者就必须为进入不同的系统排定优先级。Rainbow 钱包团队一开始想做 钱包聚合器/管理器(基于他们 从 2019 开始构建的早期 GitHub 库),所以我认为他们已经考虑过这个问题了。也就是说,我们可以看到,智能合约的接口已经是半解耦的了,但这一集成还不能自由组合,因为钱包团队正是瓶颈。换句话说,所有 dApp 都可推送到某个钱包来使用,但一个钱包并不能保证所有 dApp 都支持他们。<
用戶喜愛的交易所
已有账号登陆后会弹出下载