跳至內容

Polysnap:即時呼叫 Polywrap Wasm Wrappers

ETHIndia 黑客松獲獎者

閱讀時間:7 分鐘
Polysnap:即時呼叫 Polywrap Wasm Wrappers

MetaMask Snaps 是讓 MetaMask 成為全球最具擴展性錢包的發展藍圖。身為開發者,您可以透過全新方式將自己的功能與 API 帶入 MetaMask。Web3 開發者是這股成長動能的核心,本系列旨在展示當今正在打造的創新 MetaMask Snaps。

Polysnap

Snap 程式庫:https://github.com/Niraj-Kamdar/Polysnap

您為什麼要打造它?

目前,開發者每次想為 MetaMask 新增功能,都需要建立一個新的 Snap。Polysnap 提供了一種更好的程式碼重用方式。大量由 Polywrap 驅動的 Wasm 模組儲存在 IPFS 上。Polysnap 讓應用程式開發者只需一個簡單的 JSON RPC 呼叫,即可即時且安全地執行部署在 IPFS 上的任何 Wasm wrapper,無需建立新的 Snap。

使用依賴 Polysnap 的 dapp 的用戶,不需要安裝多個 Snap,只需安裝 Polysnap 即可,這有助於減少潛在的攻擊面。使用 Polysnap 的 Dapp 可以比傳統 Snap 更安全,因為 Polysnap 會把關所有與主機功能相關的操作,例如網路存取、錢包存取等,並且在執行任何依賴這些功能的程式碼之前,都會要求用戶確認。

Dapp 開發者不需要要求用戶安裝多個 Snap 才能執行應用程式,而是只需使用一個 Snap——Polysnap——即可執行任何 Polywrap wrapper。

Snap 開發者不再受限於 JavaScript 及其生態系進行 Snap 開發。他們可以改用 Rust、Go 和 AssemblyScript 等語言編寫 Polywrap wrapper,並透過 Polysnap 呼叫這些 wrapper。

您能帶我們了解技術實作細節嗎?

Polysnap 專案由兩個元素組成:

  1. Polysnap(MetaMask Snap)

  2. Polysnap 示範網站

MetaMask Snap 是主要功能,也是本專案的核心。網站用於展示 Snap 的運作方式。

Snap

Polysnap 可分為 3 個不同部分:

  1. Polywrap Client

  2. Plugin Wrapper

  3. WASM Wrapper

1. Polywrap Client

Polywrap 正在為網際網路打造一個統一的執行環境,安全、開放且由用戶所有。

Polywrap 讓我們能夠透過 Polywrap Client 建立可在任何地方運行的無限可擴展軟體。Polywrap Client 支援執行兩種類型的 wrapper:

  1. Wasm Wrapper——任何使用 Polywrap 工具鏈建置並部署在 IPFS 上的沙盒化 Wasm wrapper 模組

  2. Plugin Wrapper——任何向 Wasm wrapper 公開不同主機功能(如 HTTP、檔案系統和 JSON-RPC)的主機功能 wrapper

您可以查看我們如何使用 Polywrap Client,透過簡單的 JSON-RPC 呼叫 Polysnap 來調用任何 wrapper。

export const onRpcRequest: OnRpcRequestHandler = async ({
  origin,
  request,
}) => {
  switch (request.method) {
    case 'wrap_invoke':
      const invocation = request.params as unknown as InvokerOptions;
      const isApproved = await wallet.request({
        method: 'snap_confirm',
        params: [
          {
            prompt: `${origin}`.substring(0, 40),
            description: `URI: ${invocation.uri}\nMethod: ${invocation.method}`,
            textAreaContent: `Args ${JSON.stringify(invocation.args)}`,
          },
        ],
      });

      if (isApproved === true) {
        const client = await getClient();
        const response = await client.invoke<any>(invocation);
        if (!response.ok) {
          throw response.error;
        }
        return deserializeMap(response.value);
      }
      throw new Error('User declined invocation');
    default:
      throw new Error('Method not found.');
  }
};
複製

2. Plugin Wrapper

Plugin wrapper 透過 Polywrap Client 直接嵌入 Polysnap。這些 Plugin wrapper 公開了 MetaMask SES 環境中提供的功能,例如:HTTP、Ethereum JSON-RPC。

在此 MVP 版本中,我們新增了對三種不同 plugin 的支援:

  1. HTTP Plugin——公開 API,允許直接從 Wasm Wrapper 發出 HTTP GET/POST 請求

  2. IPFS Plugin——公開 API,用於在 IPFS 上儲存、釘選和擷取檔案

  3. IPFS URI Resolver Plugin——公開 API,用於從 IPFS 解析已部署的 Wasm Wrapper

3. Wasm Wrapper

Wasm wrapper 是使用 Polywrap 工具鏈建置並部署至 IPFS 的 Wasm 模組。由於 Wasm 是沙盒化環境,除非主機公開 API 來協助,否則無法執行任何 I/O 操作。因此,任何 Wasm wrapper 都可以在 MetaMask Snap 內安全執行。Polysnap 在沒有 Plugin wrapper 的協助下,無法執行任何主機功能,例如存取網際網路。您可以在 wrappers.io 查看所有已部署至 IPFS 的 wrapper。

export async function getClient(): Promise<PolywrapClient> {
  const ipfsResolverWrapperResult = await ipfsResolverPlugin(
    {},
  ).createWrapper();
  // IPFS URI RESOLVER
  if (!ipfsResolverWrapperResult.ok) {
    throw ipfsResolverWrapperResult.error;
  }
  const ipfsUriResolver = new WrapperResolver(
    Uri.from('ens/ipfs-resolver.polywrap.eth'),
    ipfsResolverWrapperResult.value,
  );

  // IPFS RESOLVER
  const ipfsWrapperResult = await ipfsPlugin({}).createWrapper();
  if (!ipfsWrapperResult.ok) {
    throw ipfsWrapperResult.error;
  }
  const ipfsResolver = new WrapperResolver(
    Uri.from('ens/ipfs.polywrap.eth'),
    ipfsWrapperResult.value,
  );

  // HTTP RESOLVER
  const httpWrapperResult = await httpPlugin({}).createWrapper();
  if (!httpWrapperResult.ok) {
    throw httpWrapperResult.error;
  }
  const httpResolver = new WrapperResolver(
    Uri.from('ens/http.polywrap.eth'),
    httpWrapperResult.value,
  );

  // AGGREGATED RESOLVER
  const resolver = RecursiveResolver.from([
    httpResolver,
    ipfsResolver,
    ipfsUriResolver,
    new ExtendableUriResolver(),
  ]);

  return new PolywrapClient({
    interfaces: [
      {
        interface: new Uri('wrap://ens/uri-resolver.core.polywrap.eth'),
        implementations: [
          new Uri('wrap://ens/ipfs-resolver.polywrap.eth'),
        ],
      },
    ],
    envs: [
      {
        uri: new Uri('wrap://ens/ipfs.polywrap.eth'),
        env: {
          provider: defaultIpfsProviders[0],
          fallbackProviders: defaultIpfsProviders.slice(1),
        },
      },
    ],
    resolver,
  });
}
複製

Polysnap 網站

Polysnap 網站是我們建立的簡單示範網站,用於展示 PolySnap 的實際運作。網站上有一個按鈕用於連接 MetaMask 錢包並安裝 Snap,以及一個查詢儀表板,可提交 JSON RPC 呼叫至 Polysnap 並顯示結果。

要向 Snap 發送調用請求,用戶需要提供三個元素:

  • 一個解析至 Wasm wrapper 的 uri(黑客松專案僅支援 IPFS URI,但未來版本也可支援 ENS 解析)

  • 要調用的 method 名稱

  • 一個包含將傳遞給被調用方法之參數的 json 物件 args

當點擊「Invoke」按鈕時,網站會讀取這些欄位中的值並將其轉發至 Snap。Snap 會開啟確認視窗以請求批准調用,確保應用程式不會在未經終端用戶同意的情況下進行任何調用。

若調用獲得批准,Snap 中的 Polywrap Client 將處理調用並回傳結果。結果會顯示在按鈕下方的方框中。當然,在實際應用中,開發者通常會以程式化方式設定調用,並以不同方式使用結果。

正如其名,Polysnap 是一個集多種功能於一身的 Snap。只需 Polysnap,開發者就能調用任何以任何可編譯為 Wasm 的語言編寫的 Polywrap Wasm wrapper 中的任何方法。

wrapper 會在執行時下載並快取。由於 Wasm wrapper 是沙盒化且無狀態的,Polysnap 在原本已安全的 Snap 環境之上,額外增加了一層安全保障。

而且這一切都是完全去中心化的。

如果您要繼續實作,下一步是什麼?

以下是我們為 Polysnap 下一個版本所設想的所有改進項目:

  • 支援更多 Plugin Wrapper,例如:Cache、Concurrency、Ethereum、Near、Tezos 等

  • 為存取每個 Polywrap plugin 新增基於權限的安全機制,確保安全性可由終端用戶管理

  • 建立 PolySnap 安裝網站,以展示 Snap、託管文件,並讓終端用戶輕鬆完成安裝

  • 新增對 IPFS、ENS 和 HTTP Polywrap URI Resolver 的支援

  • 支援應用程式開發者在透過 MetaMask Snap 以 JSON-RPC 調用時,為每次 Polywrap Client 調用提交自訂設定

  • 支援針對 PolySnap 快取的 wrapper 進行自訂快取管理

您能介紹一下您自己和您的團隊嗎?

我們都是 dOrg 的成員——一個由自由軟體工程師和設計師組成的 DAO——同時也是 Polywrap 的開發者。

  • Kris——我是一名 Web3 軟體工程師。2020 年,一位朋友將我介紹給 dOrg 和去中心化網路,從此改變了我的人生。我隨後加入 Polywrap 團隊,協助打造下一代 SDK 開發者工具。

  • Niraj——我是 dOrg 的 Web3 開發者,目前以核心開發者身份參與 Polywrap 專案。我從事 Web3 開發已有兩年,在加入 Polywrap 之前,曾為 Badger、Opolis、Coordinape 和 Llama 做出貢獻。

您認為 MetaMask Snaps 為 Web3 領域帶來了哪些機遇?

我們認為 MetaMask Snaps 有潛力讓 MetaMask 成為一個樞紐,將數百萬新用戶引入 Web3。開發者體驗和安全性對任何插件生態系的成功都至關重要。我們相信 Polysnap 能夠為 MetaMask Snaps 帶來這兩者,使其更易於使用、更具擴展性且更安全。

您有什麼建議想分享給有意嘗試 MetaMask Snaps 的開發者嗎?

MetaMask Snaps 允許透過為您的 MetaMask 錢包編寫新的擴展 MetaMask Snap 來擴展 MetaMask 的功能。因此,這是一個非常強大的工具,能夠實現大量使用場景,例如將不同的 L1 錢包直接整合至 MetaMask、提供更深入的交易洞察等。我們希望透過 Polysnap,讓實現這些使用場景的開發者體驗變得更加輕鬆。

MetaMask Snaps 仍是新生事物,但就在短短一個週末,我們看到各團隊打造出令人驚嘆的 MetaMask Snap——甚至包括一個內建於 MetaMask 的 Cosmos 錢包。即使 MetaMask Snaps 功能仍處於預生產階段,也要及早開始!

或者,您也可以考慮不編寫新的 Snap,而是用 Rust 或 AssemblyScript 等語言編寫 Polywrap Wasm wrapper。這樣一來,您不僅可以透過 Polysnap 調用它而無需編寫自己的新 Snap,還可以透過 Polywrap client 在任何地方使用它。

使用 MetaMask Snaps 進行開發

開始使用 MetaMask Snaps:

  1. 查閱開發者文件

  2. 安裝 MetaMask Flask

  3. 查看 MetaMask Snaps 指南

  4. 在 Twitter、GitHub discussions 和 Discord 上與我們保持聯繫

請留意我們的團隊將出現在您附近的下一場黑客松!祝 BUIDL 愉快 ⚒️

免責聲明:MetaMask Snaps 通常由 Consensys Software 以外的第三方開發。使用第三方開發的 MetaMask Snap 須自行斟酌判斷並承擔風險,且您同意將對因此類活動造成的任何損失或損害負全部責任。Consensys 對第三方開發的 Snap 不作任何明示或暗示的保證,並對第三方開發的 MetaMask Snap 免除一切責任。使用區塊鏈相關軟體存在風險,使用 MetaMask Snaps 即表示您完全承擔這些風險。

AI 翻譯。可能包含錯誤。請務必核實資訊。

評價此翻譯

本文作者:

  • MetaMask

    MetaMask,前身為 Consensys Software Inc,是全球最大的自託管金融平台,讓用戶能在單一平台上持有、消費、儲蓄並增值其資產,涵蓋加密貨幣與傳統資產。公司正致力於打造實現上述目標的消費者平台,將支付、儲蓄、投資與數位資產整合於一個無縫的使用體驗中。MetaMask 從全球使用最廣泛的自託管錢包發展而來,讓用戶直接掌控自己的資金與資產,服務範圍遍及約 190 個國家。自 2016 年起,MetaMask 在以太坊的發展歷程中扮演了奠基性的角色。時至今日,MetaMask 位居區塊鏈經濟的核心,致力於構建「開放金融」的作業系統,讓每個人都能全面掌握自己的財務生活。

    閱讀所有文章