MetaMask Snapsは、MetaMaskを世界で最も拡張性の高いウォレットにするためのロードマップです。開発者として、まったく新しい方法でMetaMaskに機能やAPIを追加することができます。Web3開発者はこの成長の中核を担っており、本シリーズでは現在開発中の革新的なMetaMask Snapsを紹介することを目的としています。
Polysnap
Snapリポジトリ: https://github.com/Niraj-Kamdar/Polysnap
なぜ開発したのですか?
現在、開発者はMetaMaskに新しい機能を追加するたびに、新しいSnapを作成する必要があります。Polysnapは、コードの再利用に対するより優れたアプローチを提供します。Polywrapを活用した豊富なWasmモジュールがIPFS上に保存されています。Polysnapを使用すると、アプリ開発者はIPFS上にデプロイされた任意のWasmラッパーを、シンプルなJSON RPCコールで、新しいSnapを構築することなく、オンザフライかつ安全に実行できます。
Polysnapを利用するdappのユーザーは、複数のSnapをインストールする必要がなく、Polysnapのみをインストールするだけで済むため、潜在的な攻撃ベクターを減らすことができます。Polysnapを使用するDappは、従来のSnapよりも安全性が高くなります。なぜなら、Polysnapはインターネットアクセスやウォレットアクセスなどのホスト機能に関連するすべてのアクションをゲートキープし、これらの機能に依存するコードを実行する前に常にユーザーの確認を求めるからです。
Dapp開発者は、アプリを実行するためにユーザーに複数のSnapをインストールするよう求める必要がなく、Polysnap一つを使用して任意のPolywrapラッパーを実行できます。
Snap開発者はもはやJavaScriptとJavaScriptエコシステムに縛られることなく、RustやGo、AssemblyScriptなどの言語でPolywrapラッパーを記述し、Polysnapを使用してそのラッパーを呼び出すことができます。
技術的な実装について説明していただけますか?
Polysnapプロジェクトは2つの要素で構成されています:
Polysnap(MetaMask Snap)
Polysnapデモウェブサイト
MetaMask Snapがメインの機能であり、プロジェクトの中心です。ウェブサイトはSnapのデモンストレーションに使用されます。
Snap
Polysnapは3つの異なる部分に分けられます。
Polywrap Client
Plugin Wrapper
WASM Wrapper
1. Polywrap Client
Polywrapは、安全でオープンかつユーザー所有のインターネット向け統合実行環境を構築しています。
PolywrapはPolywrap Clientを使用して、どこでも動作する無限に拡張可能なソフトウェアの作成を可能にします。Polywrap Clientは2種類のラッパーの実行をサポートしています:
Wasm Wrapper - Polywrapツールチェーンを使用してIPFS上にビルドおよびデプロイされた、サンドボックス化されたWasmラッパーモジュール
Plugin Wrapper - HTTP、ファイルシステム、JSON-RPCなど、さまざまなホスト機能をWasmラッパーに公開するホスト機能ラッパー
シンプルなJSON-RPCコールでPolysnapに対して任意のラッパーを呼び出すためのPolywrap Clientの使用方法をご確認ください。
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では3つの異なるプラグインのサポートを追加しました。
HTTP Plugin - Wasm WrapperからHTTP GET/POSTリクエストを直接実行できるAPIを公開
IPFS Plugin - IPFSへのファイルの保存、ピン留め、取得を行うAPIを公開
IPFS URI Resolver Plugin - IPFSからデプロイ済みのWasm Wrapperを解決するAPIを公開
3. Wasm Wrapper
Wasm WrapperはPolywrapツールチェーンを使用してIPFSにビルドおよびデプロイされたWasmモジュールです。WasmはサンドボックスEnvironmentであるため、ホストがAPIを公開しない限りI/Oを実行できません。そのため、すべてのWasm WrapperをMetaMask Snap内で安全に実行できます。Polysnapは、Plugin Wrapperの助けなしにインターネットアクセスなどのホスト機能を実行することができません。IPFSにデプロイされたすべてのラッパーはwrappers.ioでご確認いただけます。
export async function getClient(): Promise<PolywrapClient> {
const ipfsResolverWrapperResult = await ipfsResolverPlugin(
{},
).createWrapper();
if (!ipfsResolverWrapperResult.ok) {
throw ipfsResolverWrapperResult.error;
}
const ipfsUriResolver = new WrapperResolver(
Uri.from('ens/ipfs-resolver.polywrap.eth'),
ipfsResolverWrapperResult.value,
);
const ipfsWrapperResult = await ipfsPlugin({}).createWrapper();
if (!ipfsWrapperResult.ok) {
throw ipfsWrapperResult.error;
}
const ipfsResolver = new WrapperResolver(
Uri.from('ens/ipfs.polywrap.eth'),
ipfsWrapperResult.value,
);
const httpWrapperResult = await httpPlugin({}).createWrapper();
if (!httpWrapperResult.ok) {
throw httpWrapperResult.error;
}
const httpResolver = new WrapperResolver(
Uri.from('ens/http.polywrap.eth'),
httpWrapperResult.value,
);
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をインストールするためのボタンと、PolysnapへJSON RPCコールを送信して結果を表示するクエリダッシュボードが備わっています。
Snapへの呼び出しを送信するために、ユーザーは3つの要素を提供します:
Wasm Wrapperに解決されるuri(ハッカソンプロジェクトはIPFS URIのみをサポートしていますが、将来のバージョンではENS解決もサポート可能)
呼び出すmethodの名前
呼び出されるメソッドに渡される引数を含むjsonオブジェクトargs
「Invoke」ボタンがクリックされると、ウェブサイトはこれらのフィールドの値を読み取り、Snapに転送します。Snapは確認ウィンドウを開いて呼び出しの承認を求め、エンドユーザーの同意なしにアプリが呼び出しを行わないようにします。
呼び出しが承認されると、Snap内のPolywrap Clientが呼び出しを処理して結果を返します。結果はボタンの下のボックスに表示されます。もちろん、実際のアプリでは、開発者は通常プログラムで呼び出しを設定し、結果を異なる方法で使用します。
その名前が示すように、Polysnapは多くの機能を持つ一つのSnapです。Polysnapだけで、開発者はWasmにコンパイル可能な任意の言語で書かれた任意のPolywrap Wasmラッパーの任意のメソッドを呼び出すことができます。
ラッパーは実行時にダウンロードされ、キャッシュされます。Wasmラッパーはサンドボックス化されてステートレスであるため、Polysnapはすでに安全なSnap環境にさらなるセキュリティレイヤーを追加しています。
そして、すべてが完全に分散化されています。
実装する場合の次のステップは何ですか?
Polysnapの次のバージョンに向けて構想した改善点の一覧を以下に示します:
Cache、Concurrency、Ethereum、Near、Tezosなど、より多くのPlugin Wrappersのサポートを有効化
各Polywrapプラグインへのアクセスに対するパーミッションベースのセキュリティを追加し、エンドユーザーがセキュリティを管理できるようにする
Snapを紹介し、ドキュメントをホストし、エンドユーザーのインストールを容易にするPolySnapインストールウェブサイトを作成
IPFS、ENS、HTTP Polywrap URI Resolversのサポートを追加
JSON-RPCでMetaMask Snapを介して呼び出す際に設定可能なPolywrap Clientの各呼び出しに対してカスタム設定を送信するアプリ開発者のサポート
PolySnapによってキャッシュされたラッパーのカスタムキャッシュ管理ソリューションのサポート
あなたとチームについて少し教えていただけますか?
私たちは両者ともdOrg(フリーランスのソフトウェアエンジニアとデザイナーのDAO)のメンバーであり、Polywrapの開発者でもあります。
Kris - 私はWeb3のソフトウェアエンジニアです。2020年に友人がdOrgと分散型ウェブを紹介してくれたことで人生が変わりました。その後すぐにPolywrapチームに参加し、次世代のSDK開発者ツールの構築に携わっています。
Niraj - 私はdOrgのWeb3開発者であり、現在コア開発者としてPolywrapプロジェクトに取り組んでいます。Web3開発者として2年間働き、Polywrapに参加する前はBadger、Opolis、Coordinape、Llamaに貢献してきました。
MetaMask Snapsと、それがWeb3空間に解放する可能性についてどのような機会を見出していますか?
MetaMask Snapsには、MetaMaskを何百万もの新規ユーザーをWeb3にオンボードするハブにする可能性があると考えています。開発者体験とセキュリティは、あらゆるプラグインエコシステムの成功に不可欠です。Polysnapは、MetaMask Snapsをさらに使いやすく、拡張性が高く、安全にすることで、その両方をMetaMask Snapsにもたらすことができると信じています。
MetaMask Snapsを試したい開発者へのアドバイスはありますか?
MetaMask Snapsは、MetaMaskウォレット向けに新しい拡張MetaMask Snapsを記述することで、MetaMaskの機能を拡張することができます。そのため、異なるL1ウォレットをMetaMask内に直接統合したり、トランザクションに関するより詳細な情報を提供したりするなど、多くのユースケースを実現できる非常に強力なツールです。そして私たちは、Polysnapを使ってそのようなユースケースを実現するための開発者体験をさらに簡単にしたいと考えています。
MetaMask Snapsはまだ新しいですが、たった一週間末で、チームが驚くべきMetaMask Snapsを構築するのを目にしました——MetaMask内で動作するCosmosウォレットさえありました。MetaMask Snapsの機能がまだプレプロダクション状態であっても、早めに始めましょう!
あるいは、新しいSnapを書く代わりに、RustやAssemblyScriptなどの言語でPolywrap Wasmラッパーを書くことを検討してみてください。そうすれば、自分で新しいSnapを書かなくてもPolysnapで呼び出せるだけでなく、Polywrap Clientを使ってどこでも利用できます。
MetaMask Snapsで開発する
MetaMask Snapsを始めるには:
開発者ドキュメントをご確認ください
MetaMask Flaskをインストールしてください
MetaMask Snapsガイドをご覧ください
Twitter、GitHubディスカッション、Discordで私たちとつながり続けてください
次のハッカソンでお近くの会場にいる私たちのチームにもご注目ください!Happy BUIDLing ⚒️
免責事項:MetaMask Snapsは一般的にConsensys Software以外のサードパーティによって開発されています。サードパーティが開発したMetaMask Snapsの使用は、お客様自身の判断とリスクで行われ、そのような活動から生じる損失や損害についてはお客様が単独で責任を負うことに同意したものとみなされます。Consensysはサードパーティが開発したSnapsについて、口頭または書面による明示的または黙示的な保証を一切行わず、サードパーティが開発したMetaMask Snapsに関するすべての責任を否認します。ブロックチェーン関連ソフトウェアの使用にはリスクが伴い、MetaMask Snapsを使用する際にはそのリスクをすべて負うものとします。