MetaMask Snap 技術回顧:開髮經驗、能力限製、安全性和商業潛力分析

進階Dec 24, 2023
本文介紹了MetaMask Snap的高級功能,探討該技術如何讓MetaMask錢包通過插件實現更多樣化的應用。 它強調如何在保持安全性的衕時突破傳統錢包的限製,釋放更大的潛力。
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 非常低成本的引入用戶!

從這個安裝和使用流程中,我們可以得到什麽信息?

  1. Snap 具備比較精細的權限控製,甚至包括鏈接錢包的權限、網絡請求等。整體採用了最小權限訪問(Principle of Least Privilege)的思路來設計,安全第一。
  2. 從 npm:@unipasswallet/unipass-snap 可以看到 Snap 是基於 NPM 進行包和版本管理。後麵詳細介紹一下安全性。
  3. Snap 具備非常高的靈活性,可以按照項目的需求自行開髮和決定展示的內容和邏輯。但是 UI 比較簡陋,有一定的優化空間。
  4. 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 的原則來規畫代碼的權限控製。

關於 Hardened JavaScript 更詳細的技術細節請參考:https://tvcutsem.github.io/assets/HardenedJS_BlueLava2022.pdf。

Agoric 跟 MetaMask 合作開髮了 LavoMoat (https://github.com/LavaMoat/lavamoat) 這個項目來增強 Snap 的安全性。LavaMoat 是一套工具,重點解決 JS 項目外部依賴的安全風險,增加對一些 API 和邏輯的限製。

Agoric 和跟 MetaMask 聯合髮起過黑盒白盒安全攻防測試,併輸出過詳細的安全報告。所以在代碼運行時的層麵,我們有充足的理由相信 Snap 是安全的。

Snap 代碼必鬚開源且經過審計

除了有明確的用戶授權流程和最小權限的設計,成爲官方認可的 Snap 必鬚開源代碼,通過社區的力量大大降低 Snap 自帶惡意代碼的可能性。

此外,我們也髮現在官網上的 Snap 均經過第三方安全公司的代碼審計才能髮布。這大大提高了 Snap 的安全可信度,審計方包括大家都非常熟悉的慢霧。

基於 NPM 管理的 Snap 是否有安全風險?

目前 Snap 是基於 NPM 的包和版本管理,而 NPM 是一個 Web 通用的包管理工具,開髮者和項目方可以自行髮布新的包和代碼。

MetaMask 無法控製 NPM 平颱的版本髮布,項目方可以隨時髮布新的版本,是否會出現一種情況:最新版本的變更,可能併沒有開源或者經過審計?

經過官方確認,所有的 NPM 包版本變更需要被官方團隊 review 併且加入白名單才可以被安裝。因此即便是項目方髮布了新的 NPM 包,在沒有在官方上架之前,無法被用戶安裝。這無疑會增加 Snap 的版本更新成本,但的確是最安全的方案。也體現了 MetaMask 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:

  1. Interoperability(互操作性),允許開髮者基於 MetaMask 開髮其他鏈錢包
  2. Transaction Insights(交易洞察),允許開髮者在用戶交易髮起前穫取交易data,從而分析交易是否存在風險
  3. 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,所有瀏覽器裡的密碼都可以被錢包密鑰加密後存儲。這樣管好錢包,就帶上了所有的密碼。

還有一個來自 Web3MQ 團隊的作品。Web3MQ 是一個高性能去中心化通信中繼網絡,Web3MQ Snap 將是它的一個客戶端用來實現消息互動、通知提醒、和推送等功能,併整合其他接入 Web3MQ 的 DApps,例如聊天工具或者全鏈游戲等等。借助 Web3MQ Snap ,消息和動態將自動推送到 Metamask Snap 的用戶,而無需額外再取得用戶授權,實現了用戶與用戶,用戶與應用的去信任化連接。

Snap 跟開髮者非常相關,有了開放 API,具體的開髮者體驗如何?我們不妨親自動手開髮一個 Snap 體驗一下。

直接開髮一個 Snap 測試

梳理思路

衆所周知,大部分用戶在絶大多數情況下其實併不知道正在交互的智能合約到底是什麽,主要包括如下幾個問題:

  • 交易的合約是否是釣魚網站替換的合約
  • 交易的合約是否是一個可升級合約
  • 智能合約是否是一個剛被部署還沒有多少人驗證過的合約
  • 交易的合約是否開源

對於普通用戶來説,讓他在操作之前去閲讀合約的 solidity 代碼更是天方夜譚。這時其實非常適合通過 Transaction Insight 功能來實現一些智能合約分析,比如使用 AI 來對智能合約做一個比較淺顯的安全性審計,或許可以過濾到 80% 的低級釣魚攻擊。

準備開髮環境

下載錢包

首先需要安裝 MetaMask Flask

MetaMask Flask 是一個以開髮人員爲中心的 MetaMask 擴展髮行版,主要用於新功能預覽以及實驗性功能開髮。註意這是 MetaMask 的開髮者版本,請不要進行日常使用,也不要導入自己日常使用的私鑰。這裡使用 Flask 主要是方便我們開髮的 Snap 能本地即時預覽。

建議安裝後先暫時關掉小狐狸錢包以及其他瀏覽器錢包,或者新創建一個 Chrome Profile 使用,否則會衝突

創建賬戶

安裝錢包後就像正常創建 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。

tsxCopy code

import { OnTransactionHandler, OnRpcRequestHandler } from ‘@metamask/snaps-types’;
import { heading, panel, text, copyable, divider } from ‘@metamask/snaps-ui’;

export const onTransaction: OnTransactionHandler = async ({ transaction }) => {
// transaction includes values like to (contract address) and data (interaction data)
// Example code to fetch Audit information for the contract below
const info = await fetch(http://contract-info.audit.dev/?address=${transaction.to});

// Below is a UI sample code
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 仍在快速迭代的,相信未來會開放更多權限和能力。希望能推出更開放衕時安全的機製,比如安全且無許可的低成本審核機製,這樣才能讓更多開髮者低成本參與進來。如果這個問題得到改善,可以預期將會在未來産生大量的需求。甚至會出現專門的 Snap 開髮者崗位。

借助海量的 MetaMask 用戶,獨立開髮者或許也有一定的機會。讓我們拭目以待 Snap 帶來的下一個突破性創新。

最後,感謝您的文章,相信這有助於讓更多人了解 MetaMask Snap 的髮展現狀。

也請繼續關註 LXDAO,我們將在後續産出更多 MetaMask Snap 相關文章,敬請期待!

聲明:

  1. 本文轉載自[medium],著作權歸屬原作者[LXDAO],如對轉載有異議,請聯繫Gate Learn團隊(gatelearn@gate.io),團隊會根據相關流程盡速處理。
  2. 免責聲明:本文所錶達的觀點和意見僅代錶作者個人觀點,不構成任何投資建議。
  3. 文章其他語言版本由Gate Learn團隊翻譯, 在未提及Gate.io的情況下不得覆製、傳播或抄襲經翻譯文章。
Lancez-vous
Inscrivez-vous et obtenez un bon de
100$
!
Créer un compte