MetaMask Snaps 是讓 MetaMask 成為全球最具擴展性錢包的發展藍圖。身為開發者,您可以透過全新的方式將您的功能和 API 帶入 MetaMask。Web3 開發者是這項成長的核心,本系列旨在展示當今正在建構的創新 MetaMask Snaps。
多解析器 Snap
Snap 儲存庫:https://github.com/idriss-crypto/multiresolver
您為什麼要建構多解析器 Snap?
Web3 的使用者體驗長期以來備受忽視。帳戶抽象化是我們看到進展的領域之一。幾乎每週都有新的命名服務出現。這些服務的目標是簡化我們在這個領域中彼此互動的方式:名稱比錢包地址更容易辨識,因此為身份識別和信譽系統奠定了基礎。
此外,原創的(命名)標準能夠提升專案的知名度。舉例來說,假設有一個專案叫做「x」,該專案提出的新命名標準可以稱為 x-domains 或 x-names。專案的成功會自動帶動命名服務的成長,而命名服務的成功也會反過來促進專案發展——這是雙贏的局面。然而,我們現在面臨的是一個碎片化的命名空間。確實有些人嘗試使用每一種命名服務,這在某些(基於網域的)命名服務有限的命名空間中,引發了搶佔名稱的競爭。其他命名服務則採用人們已經擁有的更熟悉的識別方式,例如電子郵件、電話號碼或更通用的社群帳號(Twitter 用戶名、IG 帳號),以消除圍繞這些身份的潛在市場競爭。大多數人最終只會擁有一個、最多兩個來自不同命名服務的帳號。由於選擇多樣,開發者需要在其應用程式中整合多個命名服務解析器。
當某個新的命名服務佔據相當大的市場份額時,也應該將其整合到應用程式中,以免排除使用該命名服務的用戶。從用戶的角度來看,尋找功能相似且同時支援自己所選命名服務的替代應用程式,實在令人感到困擾。為什麼不讓人們使用他們熟悉的任何方式,同時提供一個幫助開發者專注於打造最佳應用程式的解決方案呢?
多解析器 Snap 正是為此而生。
請帶我們了解技術實作的細節?
核心概念
此 Snap 是為 MetaMask Flask 10.20 所建構。目前版本使用 endowment:network-access 和 snap_confirm 兩項權限。前者用於初步版本中,以請求已解析的地址並將 Twitter ID 轉換為 Twitter 用戶名。後者則在建立交易前向用戶顯示確認畫面,突顯最終地址。
目前支援的解析器為 IDriss 和 ENS。此 Snap 在 localhost 上運行。
從 dApp 端整合
開發者若要整合此 Snap,進而使用所有可用的解析器,必須先連接到錢包和 Snap:
const connectSnap = async (
snapId: string = defaultSnapOrigin,
params: Record<'version' | string, unknown> = {},
) => {
await window.ethereum.request({
method: 'wallet_enable',
params: [
{
wallet_snap: {
[snapId]: {
...params,
},
},
},
],
});
};
呼叫是透過 resolve_send 方法進行,可透過以下方式呼叫:
const resolveInput = async (id_?: string) => {
return await window.ethereum.request({
method: 'wallet_invokeSnap',
params: [
defaultSnapOrigin,
{
method: 'resolve_send',
identifier: id_,
},
],
});
};
此方法會返回已解析的地址。其中,id_ 是用戶在發送欄位中輸入的識別碼。
使用新的 multiChainProvider,連接到 Snap 就像使用所需權限連接到錢包一樣簡單:
import { MultiChainProvider } from "@metamask/multichain-provider";
const provider = new MultiChainProvider();
const { approval } = await provider.connect({
requiredNamespaces: {
eip155: {
chains: [chains],
methods: [
permissions
],
},
},
});
const session = await approval();
上述 resolve_send 方法可以重新命名為 eth_sendTransaction,讓應用程式無需更改任何整合即可使用多解析器 Snap。每當呼叫 eth_sendTransaction 時,Snap 會介入並在建立交易前解析輸入內容。應用程式應允許接受 String 類型的輸入,而不是在用戶輸入不符合地址格式時拋出錯誤。剩下的事情就交給 Snap 處理!
如果您要實作此功能,下一步是什麼?
下一步,此 Snap 將開放原始碼,鼓勵其他開發者尋找漏洞、改善程式碼,甚至新增自訂解析器。開放原始碼將釋放此 Snap 的真正潛力:不需要任何單一開發者或實體整合所有新興的命名服務。contribute.md 檔案將推動這個過程。此外,也將持續追蹤 MetaMask Snaps 團隊的進一步開發進展。
具體而言,有兩件事能大幅提升此 Snap 的效能:
帳戶對帳戶轉帳的 endowment:transaction-insight 權限,以移除交易觸發前額外的 snap_confirm 呼叫;以及
注入 MetaMask 的 UI 介面。目標是將 Snap 實作到發送欄位中,讓用戶無需連接到網站即可使用多解析器。
最後,目標是與 IDriss 解析器完整整合。完整整合後,用戶無需在 IDriss 名冊中註冊,即可將加密貨幣和 NFT 發送至任何電子郵件、電話號碼和 Twitter 用戶名。
可以介紹一下您自己和您的團隊嗎?
我叫 Lennard,自 2017 年起便對區塊鏈領域產生濃厚興趣。一年多來,我一直在建構並共同創辦 IDriss——一個將電子郵件、電話號碼和 Twitter 用戶名去中心化對應至錢包地址的服務。更廣泛地說,我專注於建構工具,朝向更易用的 Web3 邁進,這也是我建構此 Snap 的動力。
您是什麼時候第一次接觸到 MetaMask Snaps 的?當時的體驗如何?
Snaps 團隊今年(2022 年)在各大研討會上非常活躍,所以我已經多次與他們相遇。我第一次接觸程式碼庫,是在他們於巴黎 EthCC 2022 的一次演講之後。雖然當時功能仍然有限,但文件已經相當完善,我對 MetaMask Snaps 的未來充滿期待。
MetaMask Snaps 與其他錢包有何不同?
我還沒有看到其他類似的方式,能夠讓外部貢獻者參與錢包的開發。雖然其他一些錢包已經開放了原始碼,但 Snaps 讓開發者能夠直接擴展 MetaMask 的功能。我相信這種方式也會被其他專案採用,因為它更易於維護。
請告訴我們您和您的團隊使用 MetaMask 建構 Snaps 的體驗?
在黑客松期間建構此 Snap 是一次很棒的機會。有 MetaMask Snaps 團隊在場,每當有問題出現時都能得到幫助。目前仍缺少的一點是自訂 MetaMask UI 的能力。此外,一些依賴項問題難以除錯,佔用了大部分的開發時間。
MetaMask Snaps 對您意味著什麼?
Snaps 為開發者提供了一個平台,讓他們能夠以無需許可的方式,將自己的專案或想法直接整合到 MetaMask 中。對我來說,這意味著任何專案的成長都可以加速,因為用戶突然可以使用他們已經擁有的工具(錢包)享受更多好處。
您認為 MetaMask Snaps 為 Web3 領域帶來了哪些機遇和可能性?
Snaps 可以透過交易洞察幫助防範詐騙,透過 keyring 創造更具網路包容性的體驗,並透過自訂解析器搭配 UI 增強功能,帶來更友善的 Web3 使用體驗。這些加在一起,將吸引更多人進入這個領域。
您有什麼建議想分享給有意嘗試 MetaMask Snaps 的開發者嗎?
去參加黑客松!這是直接與團隊互動並獲得即時反饋的最佳方式。
使用 MetaMask Snaps 進行建構
開始使用 MetaMask Snaps:
查閱開發者文件
安裝 MetaMask Flask
查看 MetaMask Snaps 指南
在 Twitter、GitHub 討論區和 Discord 上與我們保持聯繫
請留意我們的團隊將出現在您附近的下一場黑客松!祝 BUIDL 愉快 ⚒️
免責聲明:MetaMask Snaps 通常由 Consensys Software 以外的第三方開發。使用第三方開發的 MetaMask Snaps 須由您自行決定並承擔風險,且您同意對因此類活動造成的任何損失或損害負全部責任。Consensys 對第三方開發的 MetaMask Snaps 不作任何明示或暗示的保證,並對第三方開發的 Snaps 免除一切責任。使用區塊鏈相關軟體存在風險,使用 MetaMask Snaps 即表示您完全承擔這些風險。