MetaMask Snap技術解讀:开發體驗、能力限制、安全性和商業潛力分析

2023-09-23 16:09:27

原文來源: LXDAO

本文由 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 。

平衡安全性、靈活性、有效性是一個非常大的挑战,也可以看出 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 能本地即時預覽。

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

創建账戶

安裝錢包後就像正常創建 MetaMask 錢包一樣創建一個新錢包,請注意,這是一個專門用於測試的錢包,請不要導入自己的日常錢包。

接下來我們需要給新創建的錢包中充值一些測試幣,測試幣可以通過水龍頭獲取,本文講的 Snap 使用的是 Goerli,所以下文以 Goerli 為主。

基於模板初始化 Snap

按照官方文檔,首先使用 @metamask/create-snap 這個 CLI 來創建一個新的 Snap 項目,同時我們使用官方的模板進行初始化:

Snap 文件結構

Snap 的主要文件在 ./packages/snap 中,文件目錄結構如下

Snap 的配置文件被放在 snap.mainfest.json 中,Snap 的主體文件為 ./src/index.ts,可以看到非常簡潔。

啓用權限

首先需要啓用權限,首先我們在 snap.mainfest.json 中新增如下三條

Mainfest 文件中還可以修改 description 和 proposedName 來修改項目的描述和名稱。

獲取交易

接下來本案例中只需要修改 index.ts 文件即可完成全部功能,簡單的代碼示例如下,可以完整運行的代碼請移步:https://github.com/LidamaoHub/insights。

更多的內容請參考 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 的發展現狀。

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

推薦文章

BTC波動率 : FOMC會議

關鍵指標 (香港時間 9 月 19 日凌晨 12 點 -> 中午 12 點): BTC/USD 現...

星球日報
4 5小時前

HTX成長學院:美聯儲降息50基點將會帶來哪些影響?

一、引言 2024 年 9 月 19 日,美聯儲宣布將聯邦基金利率下調 50 個基點至 4.75%...

星球日報
4 5小時前

預售超14萬部,速覽新一代Web3智能手機Solana Seeker

9 月 19 日,Solana Labs 旗下的 Solana Mobile 在新加坡的 TOKE...

星球日報
4 5小時前

深入分析World Liberty Financial的價值:特朗普競選經費劣勢下的新選擇

作者 : @Web3Mario(https://x.com/web3_mario) 摘要 :首先祝...

馬裏奧看Web3
4 5小時前

聚焦TOKEN2049:沉寂已久的加密市場有哪些新看點?

原文整理: flowie, ChainCatcher 9 月 18 日,Web3 最受矚目的年度峯...

星球日報
3 5小時前

DePIN專題報告:超過370個代幣上线,Helium用戶突破11萬大關

DePIN Helium | Glow | Livepeer | IoTeX | TADA E V...

星球日報
3 5小時前