作者: LXDAO专家组成员:李大猫、Bruce 共同编写
本文将深入探讨 MetaMask Snap 技能方面的内容。MetaMask Snap 是什么?它有哪些技能才能?安全性怎么保证?开发体会怎么?这些问题或许将决议 MetaMask Snap 的未来潜力。
MetaMask Snap 是什么?
前几天 ConsenSys 宣告向大众推出 MetaMask Snaps Open Beta。MetaMask Snaps 能够扩展钱包的才能,能够装置由第三方开发人员创立的 app(Snap)来取得新的功用。
假如说 ConsenSys 将 MetaMask 打造成了微信,那么 Snap 就是微信小程序。因而能够看出 MetaMask 的大志,结合 ConsenSys 的体量和 MetaMask 的用户数,钱包领域的格式将因而发生改变。
现在官方现已公布了 35 款可用的 Snap,并发布了 Snap 运用商店 https://snaps.metamask.io/。
部分 Snap 一览
那么 MetaMask Snap 从技能视点来看详细是什么样的呢?它们有什么才能约束?是否安全?开发体会怎么?这些或许都将决议了 MetaMask Snap 的未来潜力。
上一年开始,LXDAO 就深入研究了 Snap 的完成,现在多位成员已参加了 Snap 的开发并积极参加相关黑客松。今日,咱们将从技能视点深入探讨上面的问题,并实践动手开发一个 Snap 来让你感受下 Snap 的开发者体会。
MetaMask Snap 初体会
装置 MetaMask Snap
一般能够通过 MetaMask Snap 官方商场进行装置,也能够直接在项目方的官网进行装置。以 UniPass 为例,当访问运用页面时,会供给一个按钮让你链接 MetaMask。
点击之后,会进行 Snap 的装置:
运用 MetaMask Snap
装置完成之后,就能够开始运用对应的产品和功用了,在这个运用中 UniPass 为你创立一个智能合约账号,便利你通过 MetaMask 的 EOA 账号进行操控等。
当你履行转账时,UniPass 会弹出来 Snap 向你承认是否要对 UniPass AA 钱包履行该操作。
通过 MetaMask 承认之后,即可履行相关操作。在这个场景中,MetaMask 通过 Snap 具有了操控 UniPass AA 钱包的才能,UniPass 无需自己开发一个钱包插件即可让用户操作钱包,也能够凭借 MetaMask 十分低本钱的引入用户!
从这个装置和运用流程中,咱们能够得到什么信息?
-
Snap 具有比较精密的权限操控,甚至包含链接钱包的权限、网络恳求等。全体采用了最小权限访问(Principle of Least Privilege)的思路来规划,安全榜首。
-
从 npm:@unipasswallet/unipass-snap 能够看到 Snap 是根据 NPM 进行包和版别办理。后面详细介绍一下安全性。
-
Snap 具有十分高的灵活性,能够按照项目的需求自行开发和决议展示的内容和逻辑。可是 UI 比较粗陋,有必定的优化空间。
-
Snap 的体会十分简略和可靠,的确达到了 Beta 版别和出产环境的水平。
对于一个钱包产品来说,安全性永远是榜首位的,接下来咱们分析一下 Snap 的安全性规划。
Snap 是安全的吗?
Snap 代码运行时分析
上面提到了 Snap 是根据 NPM 进行包和版别办理,阐明 Snap 实践上是根据 Web 和 JavaScript 的运用。众所周知,JS 的语法十分灵活自在,很简略带来 XSS 以及垂钓等攻击。MetaMask Snap 怎么应对这一应战?
通过一些研究不难发现,MetaMask 赞助 Agoric 而且深度集成了 Agoric 团队的 Hardened JavaSscript(又称 Secure EcmaScript )作为其"完全虚拟化"沙盒方案。Agoric 规划了一个 JavaScript 约束 API,而且提交了 Draft 提案到 TC-39(JS 标准化协会),地址是:https://github.com/tc39/proposal-ses。
简略的说 Hardened JavaScript 是一个更加安全的标准 JavaScript 的子集。凭借了一些 JS 的才能和机制,削减了一些 JS API 的调用权限和办法,然后下降了一些危险。它为对应的代码创立了安全的沙盒来履行,一起遵循了 Principle of Least Privilege 的准则来规划代码的权限操控。
Agoric 跟 MetaMask 合作开发了 LavoMoat (https://github.com/LavaMoat/lavamoat) 这个项目来增强 Snap 的安全性。LavaMoat 是一套工具,重点解决 JS 项目外部依靠的安全危险,增加对一些 API 和逻辑的约束。
Agoric 和跟 MetaMask 联合建议过黑盒白盒安全攻防测验,并输出过详细的安全报告。所以在代码运行时的层面,咱们有足够的理由信任 Snap 是安全的。
Snap 代码必须开源且通过审计
除了有明确的用户授权流程和最小权限的规划,成为官方认可的 Snap 必须开源代码,通过社区的力气大大下降 Snap 自带恶意代码的可能性。
此外,咱们也发现在官网上的 Snap 均通过第三方安全公司的代码审计才能发布。这大大提高了 Snap 的安全可信度,审计方包含大家都十分熟悉的慢雾。
现在发现的 Snap 的安全危险
因为现在 Snap 是根据 NPM 的包和版别办理,在代码的层面存在必定改变的可能性,而且非强制性审计,可能发生必定的安全危险。
因为 MetaMask 无法操控 NPM 渠道的版别发布,因而项目方能够随时发布新的版别来让用户进行装置。而因为审计的本钱原因,审计公司并不会对每一个版别进行审计,因而会呈现一种状况:最新版别的改变,可能并没有开源或许通过审计。
不过因为履行环境是沙箱环境,而且运用了最小权限的规划,除非用户手动承认新的权限改变,新版别 Snap 则只会具有之前的版别的权限来履行操作。但假如某个 Snap 的权限索取过大,这依然将会发生危险,因而在装置运用 Snap 的时分,依然需求保持警惕之心。
MetaMask Snap 的技能才能和约束
虽然近期 MetaMask Snap 正式公布,但实践上 Snap 现已开发了 4 年了!最早 MetaMask Snap 的构想由 Dan Finlay 在 2019 年 10 月 10 日发布在 Medium https://medium.com/metamask/introducing-the-next-evolution-of-the-web3-wallet-4abdf801a4ee。
平衡安全性、灵活性、有效性是一个十分大的应战,也能够看出 MetaMask 为这一天付出了十分多的本钱,做了很多准备工作。
现在首要敞开了三大 API:
-
Interoperability(互操作性),允许开发者根据 MetaMask 开发其他链钱包
-
Transaction Insights(买卖洞悉),允许开发者在用户买卖建议前获取买卖data,然后分析买卖是否存在危险
-
Notifications(告诉),通过 Snap 直接推送音讯给用户(不过这里好像需求网站支撑,略微有点鸡肋)
下面简略介绍下 MetaMask Snap 详细敞开的才能以及作用,便利你有一个更为形象的感知。
Notification 告诉才能
Snap_notify 接口能够在 MetaMask 或浏览器中显现告诉。Snap 能够通过这个接口向用户直接发送音讯,详细如下图所示
Transaction Insights 才能
当用户与智能合约进行交互时,MetaMask 会触发 Snap 的 onTransaction事件,MetaMask 会将未签名的原始买卖传递给 onTransaction 处理程序办法,Snap能够在买卖的二次承认页面返回一个界面,而且自定义显现内容。
通过这种才能,能够完成买卖信息的安全审计、扩展信息展示等功用。
Dialog 接口和定制界面才能
Dialog 才能将允许 Snap 直接弹出一个独立窗口,完成相似传统 Alert/Confirm/Prompt 弹窗才能(如下图),别离用于提示、承认、提交信息等。
通过 Dialog,你将能够定制简略的交互界面以及操作,来对接你的 DApp。
MetaMask Snap 暂时无法完成什么样的功用?
约束于安全性等原因,Snap 现在不支撑第三方前端结构,只供给了比较少数的 UIKit,以下依然是用 insight 做示例,展示一切开发者能够调用的 UI 组件库。
如图所示,现在上线的只有 Heading (大文字),Text (小文字),Panel (卡片且只能用一次),Divider (分割线),Copyable (点击复制)和小部分 Markdown 子集( bold 和 italic),所以说构建可交互好像暂时无法完成,也无法运用内嵌 html 来完成交互操作。不过在官方 Discord 中发问后,官方声称这些都是出于安全性的考虑,并将会在接下来的版别中铺开。
此外,同样根据安全的考虑,对外部的恳求也只支撑 Fetch 办法,而不支撑更多恳求协议例如 WebSocket。因为安全、才能和隐私约束,也无法获取到客户端的信息,比方当时引发 Snap 的网址是什么,无法完成更丰厚多样的功用。
这些问题和约束大多数是出于安全性的考虑,信任未来在安全性得到验证之后,会考虑敞开更多权限。
供给了这些 API 的 MetaMask 实践上现已成为相似敞开渠道一样的产品。这种感觉就像当时微信推出大众号、小程序一样,瞬间让人感觉不再是一个简略的聊天工具。
MetaMask 在 19 年就意料到了今日的商场格式,即有十分多的公链和项目方、各种定制化的钱包需求。与其每个项目方都需求开发自己的插件而用户需求一起装置数个插件,倒不如根据 MetaMask Snap 来开发。在榜首批放出来的 Snaps 中,咱们也发现了相似 Sui Wallet、Solana Wallet、Arweave Wallet 等其他非 EVM 生态的钱包。凭借已有的用户量,MetaMask Snap 必将对钱包的格式发生严重的影响。
实践上,MetaMask Snap 的幻想空间或许要比咱们预想的更大,甚至超出了钱包的领域。咱们也能够看到来自 EthSign 团队的著作,根据 MetaMask Snaps 做了通用的暗码办理器 KeyChain,一切浏览器里的暗码都能够被钱包密钥加密后存储。这样管好钱包,就带上了一切的暗码。
Snap 跟开发者十分相关,有了敞开 API,详细的开发者体会怎么?咱们不妨亲自动手开发一个 Snap 体会一下。
直接开发一个 Snap 测验
梳理思路
众所周知,大部分用户在绝大多数状况下其实并不知道正在交互的智能合约到底是什么,首要包含如下几个问题:
-
买卖的合约是否是垂钓网站替换的合约
-
买卖的合约是否是一个可升级合约
-
智能合约是否是一个刚被布置还没有多少人验证过的合约
-
买卖的合约是否开源
对于普通用户来说,让他在操作之前去阅读合约的 solidity 代码更是天方夜谭。这时其实十分合适通过 Transaction Insight 功用来完成一些智能合约分析,比方运用 AI 来对智能合约做一个比较浅显的安全性审计,或许能够过滤到 80% 的低级垂钓攻击。
准备开发环境
下载钱包
首要需求装置 MetaMask Flask
MetaMask Flask 是一个以开发人员为中心的 MetaMask 扩展发行版,首要用于新功用预览以及试验性功用开发。注意这是 MetaMask 的开发者版别,请不要进行日常运用,也不要导入自己日常运用的私钥。这里运用 Flask 首要是便利咱们开发的 Snap 能本地即时预览。
创立账户
装置钱包后就像正常创立 MetaMask 钱包一样创立一个新钱包,请注意,这是一个专门用于测验的钱包,请不要导入自己的日常钱包。
接下来咱们需求给新创立的钱包中充值一些测验币,测验币能够通过水龙头获取,本文讲的 Snap 运用的是 Goerli,所以下文以 Goerli 为主。
根据模板初始化 Snap
按照官方文档,首要运用 @metamask/create-snap
这个 CLI 来创立一个新的 Snap 项目,一起咱们运用官方的模板进行初始化:
yarn create @metamask/snap transaction-insights-snap && cd transaction-insights-snap
Snap 文件结构
Snap 的首要文件在 ./packages/snap
中,文件目录结构如下
Snap 的配置文件被放在 snap.mainfest.json
中,Snap 的主体文件为 ./src/index.ts,
能够看到十分简练。
启用权限
首要需求启用权限,首要咱们在 snap.mainfest.json 中新增如下三条
"initialPermissions": {
"endowment:transaction-insight": {},//买卖洞悉
"endowment:ethereum-provider": {},//获取rpc
"endowment:network-access": {}//恳求网络
}
Mainfest 文件中还能够修正 description 和 proposedName 来修正项目的描绘和名称。
获取买卖
接下来本事例中只需求修正 index.ts
文件即可完成全部功用,简略的代码示例如下,能够完整运行的代码请移步:https://github.com/LidamaoHub/insights。
import { OnTransactionHandler, OnRpcRequestHandler } from'@metamask/snaps-types';import { heading, panel, text, copyable, divider } from'@metamask/snaps-ui';export const onTransaction: OnTransactionHandler = async ({ transaction }) => {
// transaction 包含了 to(合约地址)、data(交互数据)等值
// 以下为获取合约 Audit 数据的代码示例
const info = fetch(`http://contract-info.audit.dev/?address=${transaction.address}`);
// 以下是UI部分代码示例
return {
content: [
text(
`${info.riskList.length} risk item`,
),
heading(`${info.riskList.length ? 'Risk List' : ''}`),
...info.riskList.map((item, i) => text(`${i + 1} ${item.text}`)),
divider(),
text(
`More audit info from the following url`,
),
copyable(
`https://contract-info.audit.dev/mm${info.token}`,
)
]
};
};
更多的内容请参阅 MetaMask Snap 开发者文档完成更复杂的 Snap 产品。
装置之后,你的每个买卖将会能够看到相似的危险提示信息:
现在 Snap 的开发体会十分流通,其间几乎没有遇到什么问题,而且官方的模版也是十分丰厚多样。具有丰厚经历的开发者一般能够在几个小时内上手而且开始开发自己需求的 Snap。但需求正式发布并让干流用户都能够运用,最大的拦路虎将会是安全审计。并不是一切独立开发者和小团队都有资源为他的 Snap 做审计。因而能够预期 Snap 的数量和丰厚度在未来很长的一段时间,都不会有十分大的迸发增长量。
开发者支撑
假如你能够跑通以上样例,那么祝贺你现已成为一个合格的 Snap 入门开发者!
MetaMask 官方也在上一年成立了一个 MetaMask Grants DAO,通过赠款方案赞助 MetaMask 生态系统中高价值项目。MetaMask Grants DAO 是一项由员工主导的试验性方案,向全球外部开发人员发放赠款,以在 MetaMask 生态系统中构建有影响力的体会。MetaMask 将每个季度的部分利润注资到这个 DAO,当时 MetaMask Grants DAO 每年的预算为 240 万美元。
现在只要是能丰厚 MetaMask 生态的项目都能够申请官方的 MetaMask Grants DAO( MetaMask Grant ),关于更多的信息请移步 https://metamaskgrants.org/。
值得一提的是 LXDAO 很荣幸的在本年申请到了 MetaMask 的 Grants 并参加了相关项目的开发,并建立了联系通道,假如你是 LXDAO 成员有相关的想法,能够更高效的联系到他们递交申请。
结语
咱们在上面从技能层面分析了一下 Snap 是什么、是否安全、才能约束以及开发者体会。简略总结如下:
-
Snap 相似微信小程序,开启了 MetaMask 更大的幻想空间
-
安全性全体不错,可是也存在必定的危险,依然需求对高危权限保持警惕
-
因为安全性的考虑,现在敞开的才能不多,但依然能够发生足够幻想空间的 Snap
-
通过四年的打磨和测验,开发者体会优异,但是因为其安全性的考虑,规划了白名单机制和审计的要求,能够预期的是在未来一段时间并不会有海量的 Snap 涌现出来
现在 MetaMask Snap 仍在快速迭代的,信任未来会敞开更多权限和才能。希望能推出更敞开一起安全的机制,比方苹果官方 Audit 审核机制以及官方代码库房版别操控,这样才能让更多开发者低本钱参加进来。假如这个问题得到改进,能够预期将会在未来发生很多的需求。甚至会呈现专门的 Snap 开发者岗位。
凭借海量的 MetaMask 用户,独立开发者或许也有必定的时机。让咱们拭目而待 Snap 带来的下一个突破性立异。
最终,感谢您的文章,信任这有助于让更多人了解 MetaMask Snap 的开展现状。
此时快讯
【交通运输部部长:推动大数据、人工智能、区块链等新技术在航运领域落地应用】金色财经报道,2023北外滩国际航运论坛今日开幕,交通运输部部长李小鹏在论坛开幕式上表示,要大力发展智慧港口、智慧航道、智能船舶,加快航运数字化转型,塑造航运发展新动能新优势。要推动大数据、人工智能、区块链等新技术在航运领域落地应用,为航运传统业务赋能升级,整体提升航运服务全要素全流程全链条数字化水平。