1 min read

Web3 小程序?MetaMask Snaps 解读

撰文:gin-lsl,ZAN Team

来源:ZAN

Web3 小程序?MetaMask Snaps 解读

MetaMask Snaps

MetaMask Snaps 是一个有很长远理想的项目。不过,抛去它所披着的「理想」的外衣,笔者更愿意称它为 Web3 世界的小程序。或者给它取一个花哨点的名字:dApplet。

作为开发者,特别是中国国内的开发者,应该对它的概念并不陌生。我们近些年常会听到「生态打造」、「超级 App」之类的互联网黑话,商业巨头们总是想要将互联网打造的越来越封闭,以便让自己从服务提供者的角色转变为标准制定者的角色。

现在,这股风潮似乎也开始慢慢向 Web3 领域飘荡了。

到今天(2024 年 6 月),虽然 Snaps 已经出现了快要一年时间了,从概念提出更是至少 4 年了,但是普通用户对它的了解却几乎没有。笔者身边有一些非常关注加密货币市场的朋友,每天打开 MetaMask 就像吃饭睡觉一般自然,却仍然连 MetaMask Snaps 是什么都不知道。不过,在笔者向他们解释「就像小程序那样」之后,脸上也总是会立马出现一抹难以言喻的微笑(他们都是开发者,大部分是前端开发者)。

这场景莫名让人联想到微信小程序刚出来时的境况,由于功能入口不明显,使用量很是低微。后来将入口改到在首页下拉出现小程序列表后,使用量才开始大幅增长。MetaMask 既然想打造生态,那么如何吸引用户进入生态大门,恐怕会成为一个亟待解决的重要问题。

小程序从出现开始,在互联网行业就争议不断。前端工程师普遍对它的出现嗤之以鼻,认为它就只是互联网巨头为了垄断流量、封锁生态的商业工具,对于技术发展并没有太多贡献。Web3 的 Snaps 不知又能对社区有多少贡献呢?浏览 MetaMask 提供的文档,愈来愈觉得未来的 Snap 开发者将会饱尝带着镣铐跳舞的艰辛。

从 MetaMask 开启 Snaps 的公共测试版到目前已有将近一年的时间,然而其官网列出的可用的 Snaps 数量其实还不是很多,截止 2024 年 6 月,满打满算也只有 68 个。要知道,在正式公测之前,早在 2020 年左右,官方就已经提出了 Snaps 的概念,Web3 公司与开发人员其实已经有相当长一段时间来对它进行充分的了解。

Web3 小程序?MetaMask Snaps 解读

一些 Snaps

笔者还没有见过专职开发 Snaps 的开发人员,不过身边 Web2 中的小程序开发者还是有不少的,对小程序的普遍看法就是开发体验比较差。小程序开发使用的依然是前端生态,但却是阉割版的,厂商因为各种各样的原因对开发者实际能做的事情进行限制。并且各厂商的技术能力、提供的文档质量参差不齐,导致开发者要在各种平台踩过各种奇奇怪怪的坑之后,才能被人称赞一句「有经验」。

再回到 Web3,出于安全等因素考虑,Snaps 极有可能面临着相似的状况,它不得不在一个隔离的安全上下文中运行,所使用的是「安全 ECMAScript】,实际上是对 JavaScript API 做了一些限制,例如无法访问 DOM、Node.js、浏览器插件 API 等。

由于可理解的安全考量,一个最基本的 Snaps 其实做不了太多事情。它的大部分功能都需要先具有相应的权限,所以 Snaps 在安装时就需要向用户申请相关的权限。可用的权限包括生命周期、交易、签名、CRON 等:

https://docs.metamask.io/snaps/reference/permissions/#eth_accounts

所以,相比于繁荣的 Web3 生态,目前可用的 Snaps 少的可怜,MetaMask 将它们做了一些分类。

Snaps 类型

按照 MetaMask 官网的分类,大致能分为 4 种类型: 账户管理(Account Management)

这类 Snaps 主要通过 MPC(Multi-Party Computation,多方计算,https://blog.usecapsule.com/what-is-mpc/)技术,提高私钥的安全性。

想想我们平时是怎样保护私钥的呢?大概很多人会将助记词保存在某个地方,笔者猜普遍是自己的电脑或者手机上,哈哈。当然,如果你非常富有,钱包中的资金非常多,那么你确实可能会使用保密性更强的方式,例如使用硬件钱包。但是大多数人,说真的,仅仅是将他们的助记词粘贴在某个自己很方便就能找到的地方,以避免自己完全忘记。

这种保存方式可能会造成一些问题: 如果你忘记把助记词放在哪里了,那么你大概率是要和自己钱包中的资产说再见了。 如果你保存助记词的设备遭遇木马病毒,则很难防止黑客盗窃你的助记词。有些用户可能为了提高安全性,将自己的助记词拆分,然后分别存放。这也许能增加一些安全性,却无疑也增加了自己的管理难度与遗忘的风险。

而 MPC 技术,则可以自动将你的私钥拆分为多份,分别放到不同的地方存储,只在当需要使用私钥进行交易签名时,再将它们拼接起来生成完整的私钥,同时这个过程中并不会生成完整的私钥,最大限度保护私钥免遭泄漏。

到目前(2024 年 6 月)为止,还只有 3 个账户管理类的 Snaps,分别是 Capsule, Silent Shard 和 Safeheron。 Capsule 使用了设备的 PassKey、恢复密码和 2FA 共同维护同一份密钥,同时如果丢失了某一个,则可以通过另外两个来恢复。 Silent Shard 和 Safeheron 是通过使用多台设备安装它们的 App 的方式来实现这一点。

很难说这类 Snaps 能吸引多少 Web3 用户,从 Snaps 网站上显示的数据来看,这类型的 Snaps 确实很少,安装量也并不高。

它们使用起来并不复杂,这里不再赘述。安装完成后,你的 MetaMask 钱包中多出一个地址:

Web3 小程序?MetaMask Snaps 解读

互操作性(Interoperability)

这类 Snaps 主要提供了对非 EVM 网络的兼容,我们能看到许多熟悉的链,包括 Solana、Cosmos、Near、Sui 等等。目前这类是最多的,它们占据了整个 Snaps 生态的一半以上。

Web3 小程序?MetaMask Snaps 解读

丰富的多链 Snaps 通知和聊天(Communication)

笔者个人更喜欢这类型的 Snaps,不过在当下,可选的聊天应用那么多,愿意通过链来发送消息的用户显然还是少数。那么很遗憾也只能继续「战未来」了。 安全(Security)

这类的需求想来还是比较大的,特别是,MetaMask 自身在用户遇到钓鱼交易时的警告做的其实并不够。交易作为加密货币和区块链领域最常见的操作,本身具有高风险和高敏感的特点,通过 Snaps 提供的交易洞察相关功能,开发者可以对用户展示更丰富的交易信息,提供对交易的分析和见解,最大限度避免用户的资产损失。

笔者身边就有朋友曾遇到过被钓鱼网站转走账户余额,而 MetaMask 从连接钱包到转账成功,全程毫无警告的情况,无奈之下只能换用其他钱包。而且笔者当时对 Snaps 也并不了解,只是给他推荐了 ZAN 的 KYT 服务来保护他的交易。希望这类安全型 Snaps 能够弥补 MetaMask 自身的不足。实际上,从 Snaps 官网显示的数据来看,安全型 Snaps 也确实是除了多链支持外需求最大的,目前占据了总数的两成。

MetaMask Snaps 提供了「endowment:transaction-insight」和「endowment:signature-insight 」权限来满足相关需求,Snap 申请相关权限后,可以在用户发起交易或签名时,可以读取到原始交易或签名的有效负载。Snap 可以对其进行分析,然后向用户显示更多更丰富的安全性说明。

想法

MetaMask 想要通过 Snaps 将自己的领域扩张到其他链平台,但是最终究竟能走到多远,恐怕很难如其所愿。拿 Web2 领域的小程序来说,虽然很多 App 提供了小程序版本,但是往往,简陋的小程序所提供的服务远无法与 App 相比,对新功能的跟进也经常落后,甚至许多小程序会将用户直接往自己的 App 引导。而到小程序爆发式增长后,更多 App 也都想来分一杯羹,又纷纷推出了自己的小程序平台,各家努力加固着自己的护城河,整个 Web 世界越来越「中心化」。

Web3 领域的资本也并不会比 Web2 的更高明,如果后面 Snaps 发展良好,那势必会有更多钱包跟随。如果真的到了这种地步,Web3 领域的开发者需要针对各个钱包的「Snaps」开发相应的版本,届时恐怕会让他们焦头烂额一段时间。只是,倘若各厂商都来打造自己的「Snaps」生态,又几乎等于全部没有自己独有的生态。咦,这似乎倒是也暗合它们「去中心化」的标签了。

我们也许能稍微预测一下,未来可能会有各种「Snaps-like」出现,平台差异巨大,此时对各平台的兼容成了开发者们的日常工作,最终到了不可忍受的地步。于是 Snaps Standard 在众多开发者的期待中诞生了,同时会有各种 「SIP」 供人们参与讨论,社区一片繁荣景象……

抱歉笔者个人似乎有些对 MetaMask Snaps 太没有信心了点。无论怎么说,它至少是由一群有激情的开发者所构建的、想要解决实际问题的产品,而不是由一群金融专家发起的骗局。

只是,对于 MetaMask 眼下的大部分用户来说,Snaps 确实还不算是一个特别必须的功能,MetaMask 接下来恐怕需要在如何更有效的推广方面做更多工作。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注