MetaMask Snapsは、MetaMaskを世界で最も拡張性の高いウォレットにするためのロードマップです。開発者として、まったく新しい方法でMetaMaskに機能やAPIを追加することができます。Web3開発者はこの成長の中核を担っており、このシリーズでは現在開発中の革新的なMetaMask Snapsを紹介することを目的としています。
Swix JediとAdrianによるRevoke Snap
ETHWarsawハッカソンでRevoke Snapを構築したWeb3開発者のSwix JediとAdrianにお話を伺いました。
Snap リポジトリ: https://github.com/SwixJedi/revokesnap
なぜ構築したのですか?
外部アクターによるトークン使用のセキュリティを確保するため、ERC20トークン標準はアローワンスを実装しています。これにより、トークンの所有者は、選択した上限まで自分のトークンを利用できるよう、特定のアクター(例:DEXスマートコントラクト)を承認する必要があります。
やや使いにくいDeFiのユーザーエクスペリエンスを改善するため、多くのDeFiプロトコルは承認に最大値(unit 256)を使用しています。これにより、ユーザーはコントラクトを利用するたびにトークンを承認したり、不要なガス代を支払ったりする必要がなくなります。
特にアクティブなDeFiユーザーの場合、該当プロトコルを使用した後に残存する承認が生じやすく、これが潜在的なセキュリティ上の脅威となります。
残存するアローワンスへの対処を支援する既存のソリューションはありますが、ユーザーインターフェースから直接承認を取り消せるものは一部に限られています。各承認を個別に処理し、手動で確認する必要があるため、このプロセスには時間がかかります。このアプローチはセキュリティ面では安全ですが、継続的な手動操作が多く求められます。
これが、MetaMask Snapsの機能を活用してより良い体験を実現できる、未開拓のニッチ領域に目を向けるきっかけとなりました。
技術的な実装について説明していただけますか?
私たちはMetaMask Snapsの以下のメリットを活用することにしました:
MetaMask内のすべてのアカウントへのアクセス
ユーザーからの単一承認で複雑な操作を実行する機能
この問題に対するソリューションを提案するにあたり、将来的には以下を実現できるようにすることを目指しました:
すべての現在および将来のアカウントへのアクセスを取得するためのユーザープロンプトを1回だけ表示する(ハードウェアウォレットは例外)
個別の確認やアカウントの切り替えなしに、すべての現在のアカウントからすべての承認をバッチで取り消す
すべてのユーザーアカウント(ハードウェアウォレット上のものを含む)を積極的に監視し、新しい承認が検出された際にユーザーへ通知を表示する
Web UIからRevoke Snapをインストールすると、MetaMaskは必要な権限を要求します。
すべての権限はsnap.manifest.jsonファイルで指定されています:
"initialPermissions": {
"snap_confirm": {},
"snap_getBip44Entropy_60": {},
"snap_notify": {},
"endowment:long-running": {}
},
特に注目すべき2つの権限は以下の通りです:
1.「Ethereum」アカウントと資産を管理する。 これは、Snapが機能するために、ユーザーに代わってアカウントを生成しトランザクションに署名できるよう、MetaMaskからユーザーの親キー(秘密鍵)が必要であることを意味します。
2. 無制限に実行する。 Revoke Snapはバックグラウンドで継続的に実行されることを意図した実装ではありませんが、ブロックチェーン上でのトランザクションの確定には時間がかかります。MetaMask Snapsには60秒後に強制終了するキルスイッチが内蔵されており、トランザクションの完了には不十分な場合があります。この権限により、RevokeSnapはそのセキュリティ措置を回避することができます。
必要な権限を取得した後、RevokeSnapはユーザーの秘密鍵から複数のアカウントを生成します:
export async function getSigners(provider: ethers.providers.Provider, amount: number): Promise<Wallet[]> {
let wallets: Wallet[] = [];
for (let i=0; i<amount; i++) {
wallets.push(await getSigner(provider, i));
}
return wallets;
}
export function getAddresses(wallets: Wallet[]): string[] {
let addresses: string[] = [];
for (let i=0; i<wallets.length; i++) {
addresses.push(wallets[i].address);
}
return addresses;
}
export async function getSigner(provider: ethers.providers.Provider, index: number): Promise<Wallet> {
const ethereumNode = (await wallet.request({
method: 'snap_getBip44Entropy_60',
})) as unknown as BIP44CoinTypeNode;
const deriveEthereumAccount = await getBIP44AddressKeyDeriver(ethereumNode);
const mainAccountKey = (await deriveEthereumAccount(index)).privateKey;
return new Wallet(mainAccountKey, provider);
}
その後、残存する承認を確認し、検索が完了したら、特定されたすべての承認を取り消すボタンを表示します。
「Revoke All」ボタンをクリックすると、Snapは残存する承認に対応する一連のトランザクションを発行し、それらを1つずつゼロにします。Snapはすでに生成されたウォレットの秘密鍵を保持しているため、最初の確認以外にユーザーからの追加確認は必要ありません。
実装する場合の次のステップは何ですか?
ハッカソン中は最適なソリューションを作成するための時間が限られていたため、改善の余地がある機能的な実装をいくつか利用しました。
まず、現在Snapで生成されるアカウント数は関数パラメーターとして渡され、3としてハードコードされています。より良い方法としては、Snapが外部API(または専用バックエンド)を使用して、選択したチェーンの各アカウントの次のトランザクションnonceを確認し、nonce番号が0より大きいアドレスのみを考慮するようにすることが考えられます。
また、承認については、機能を紹介するためにトークンとアクターの既知のアドレスの短いリストを使用しましたが、最適には承認チェックをより包括的に行うべきです。これは例えば、RPCプロバイダーAPI(Infuraなど)を使用してすべての承認トランザクションを検索し、ウェブサイトに表示するために解析することで実現できます。
あなた自身とチームについて少し教えていただけますか?
私はJediです。SwixでリードデベロッパーとしてDeFiプロトコルに取り組んでいます。2017年からクリプトに関わり、2019年からはDeFiプロトコル、主にスマートコントラクト側での開発に没頭しています。現在Swixでは、不動産の利回りをオンチェーンに橋渡しし、新しいユーザーをクリプトの世界に引き込む取り組みをしています。
私はAdrianです。小規模なスタートアップから大企業まで、ソフトウェア開発者およびアーキテクトとして働いてきました。ブロックチェーン、特にEthereumエコシステムは長年にわたって私の主な関心分野です。
Revoke Snapの開発では、JediがMetaMask Snapsの仕組みの解明とSnap内で必要なスマートコントラクトとのインタラクションに必要な基盤の構築を担当し、AdrianがWeb UIとトランザクションのバンドル処理を担当するという形で作業を分担しました。
MetaMask Snapsを最初に知ったのはいつで、どのような体験でしたか?
ETHWarsawのプレゼンテーションでMetaMask Snapsを初めて知りました。そのプレゼンはかなり技術的で、プロトコルの内部動作についてより深く掘り下げた内容でした。これがきっかけでさらに調査を進め、気づけばここまで来ていました。
MetaMask Snapsが他のウォレットと異なる点は何ですか?
そのアイデア自体です。MetaMask Snapsは、ノンカストディアルのブラウザウォレット拡張機能の世界で標準とされてきた「Web3アプリケーションとのインタラクション時、すべてのトランザクションをユーザーが個別に承認する必要がある」という概念を打ち破ります。また、ウォレットの機能はその背後にあるチームが実装を決定した機能に限定されています。
MetaMask Snapsがもたらすのは、任意のブロックチェーンインタラクションのためのネイティブウォレット統合をボトムアップで作成できるプラットフォームであり、モバイルアプリストアに多くの類似点があります。
MetaMask SnapsがWeb3空間にもたらす可能性についてどのようにお考えですか?MetaMask Snapsはあなたにとって何を意味しますか?
MetaMask SnapsがクリプトスペースにもたらすもっとD大きな価値の一つは、クリプトおよびDeFiプロトコルのUXの改善です。トランザクションのバンドル化の実現、1つのdApp内で行われるすべてのトランザクションへの1クリック承認、クレジットカードからクリプトへの購入実行時の直接コントラクトインタラクションの許可、あるいはさらに創造的な別のソリューションなど、どのような形になるかは時間が経てばわかるでしょう。
特に新しいクリプトユーザーにとって、ブロックチェーンインタラクションの複雑さや使いにくさを抽象化することがゲームチェンジャーになり得ると強く信じています。
MetaMask SnapsをMetaMaskで構築することはあなたとチームにとってどのような体験でしたか?
Revoke Snapを構築する上での大きなモチベーションは、MetaMask Snapsがまだ開発中であり、今行っている実験がMetaMask、MetaMask Snaps、そしてそれを通じてある程度クリプトスペースの方向性に具体的な影響を与えられるという点でした。Web3の未来に自分たちのレンガを積み上げられたことは、良い経験でした。
MetaMask Snapsを試したい開発者へのアドバイスはありますか?
MetaMask Snapsを試してみたい開発者の方へ——ぜひ挑戦してみてください。MetaMask Snapsは、利用可能なGitHubテンプレートリポジトリを使えば比較的簡単に始められますし、MetaMaskチームも非常に協力的です。コンセプト自体に大きな可能性があり、まだそれほど多くのことが実現されていないため、価値を提供しやすい状況です。
MetaMask Snapsで構築する
MetaMask Snapsを始めるには:
開発者ドキュメントをご確認ください
MetaMask Flaskをインストールしてください
MetaMask Snapsガイドをご覧ください
Twitter、GitHubディスカッション、Discordでつながり続けましょう
お近くで開催される次のハッカソンでも私たちのチームにご注目ください!Happy BUIDLing ⚒️
免責事項:MetaMask Snapsは一般的にConsensys Software以外のサードパーティによって開発されています。サードパーティが開発したMetaMask Snapsの使用は、ご自身の判断とリスクのもとで行われ、そのような活動から生じる損失や損害についてはお客様が単独で責任を負うことに同意したものとみなされます。Consensysはサードパーティが開発したMetaMask Snapsについて、口頭または書面による明示的または黙示的な保証を行わず、サードパーティが開発したMetaMask Snapsに関するすべての責任を否認します。ブロックチェーン関連ソフトウェアの使用にはリスクが伴い、MetaMask Snapsを使用する際にはそのリスクを全面的に受け入れるものとします。