ウォレットに接続することは、Web3の世界に入るための重要な一歩です。Web3のユーザーは、いくつかのDAppsのウェブサイトでウォレットに接続する必要があります。ただし、この単純なアクションでも、ユーザーに深刻な不便を引き起こす可能性があります。
ウォレットに接続する
以下のシナリオを想像してみてください:初心者のWeb3ユーザー(好奇心から、彼は多くのプラグインウォレットをインストールしています)が、あるDAppのウェブサイトにアクセスし、自分のブラウザプラグインウォレットを使用してそれに接続したいと思っていますが、ウェブサイトが提供する「ウォレットに接続する」ボタンをクリックし、DAppに接続するためにウォレットを選択すると、選択したウォレットではなく、表示されるウォレットが異なることがあります。これにより、彼らはパニックになり、息苦しく感じ、自分のコンピュータがウイルスに感染しているのかと思い、予期しない操作を実行したと考えるかもしれません。
ブロックチェーンウォレットは、ブロックチェーンへの重要なゲートウェイであり、このゲートウェイを占有するために、各ウォレットはさまざまな手段を使用しています。その中でも、DApp 開発者やDAppユーザーにとって最も頭痛の種は、各ウォレットがグローバル変数を改ざんすることです。
現在のブラウザウォレットの実装ロジックでは、ウォレットが提供する機能を公開するために、グローバル変数をブラウザに注入することが一般的です(例えば、イーサリアムプラットフォームのウォレットは機能を「ethereum」に注入します)。これにより、DAppはウォレットの提供するメソッドを呼び出して相互作用することができます。
ただし、多くのウォレットが自分自身を同じethereum変数に注入するため、後で登録されたウォレットが以前に登録されたウォレットを上書きし、最後に登録されたウォレットのみを呼び出す方法しか存在しません。
時には、DAppのユーザーは、自分が使用したいウォレットを正常に使用するために、他のウォレットプラグインを一時的に無効にするか、または特定のウォレットのみをインストールする必要があります。これにより、ウォレットの開発者の最初の意図とは大きく異なります。また、新しいウォレットはより優れていても、既に他のウォレットを使用しているユーザーを引き付けるのは難しいです。
友達の中には、なぜ必ず同じ変数に注入しなければならないのか疑問に思う人もいるかもしれません。 2つのウォレット、AとBがあると仮定すると、Aは自分自身を「a」に注入し、Bは自分自身を「b」に注入するだけで、どのウォレットを呼び出したいかに応じて、対応するオブジェクトに提供されるメソッドを呼び出すだけで、上記の問題が発生することはありません。これは競合問題を解決できることが確かにできますが、問題は、DAppが複数のウォレット接続をサポートする必要がある場合、開発者がコードに適合させたいすべてのウォレット名を事前に定義し、ユーザーがウォレットを選択したときに、そのウォレットの関連メソッドを呼び出す必要があります。これにより、関連するコードのメンテナンスが非常に困難になります。 一方、ウォレットをすべて同じオブジェクトに注入すると、この問題を回避できます。
上記のジレンマから抜け出すために、コミュニティ内には2つの類似した基準があります。
イーサリアムコミュニティは2023年5月にEIP-6963を提案しました。
基本的なロジックは非常にシンプルで、グローバル変数を捨て、ウォレットの登録と検出の問題を解決するために約束されたイベントを使用することです。
具体的には、プラグインウォレットが正常にロードされると、「eip6963:announceProvider」イベントがトリガーされ、DAppに新しいウォレットが利用可能であることが通知されます。そして、DAppはこのイベントを監視して、現在利用可能なウォレットの一覧を知ることができます。
これにより、一連の抽象的なイベントリスナーロジックを介して、直接的にグローバル変数を使用することによる問題を回避し、現在のユーザー環境で利用可能なウォレットを自動的に検出することができます。これにより、ジレンマが解消されます。
EIP-6963 はイーサリアムエコシステムの標準ですが、イーサリアムだけでなく、他のチェーンプラットフォームでも同様の問題が発生する可能性があります。例えば、Solana チェーンのウォレットは一般的に自分自身を「solana」変数に注入しますが、これも競合状況を引き起こす可能性があります。
では、Solanaのエコシステムでもこの基準を実現することはできるでしょうか?EIP-6963はイーサリアムエコシステムのウォレット発見の問題を解決するためだけではありますが、その中にはすべてのチェーンプラットフォームに適用できる考え方が含まれています。では、さらに一歩進んで、すべてのブロックチェーンプラットフォームのウォレットとDAppsが実現するための共通の基準を提供し、開発者やユーザーがEIP-6963の提供する利便性を享受できるようにすることはできるでしょうか?理論的には全く問題ありませんし、すでに開発者がそれを実現しているのがWallet Standardです。
ウォレットスタンダードのコアワークは、「registerWallet」と「getWallets」の2つの関数を提供することであり、前者はウォレット用、後者はDApps用です。
ウォレットの呼び出し「registerWallet」には、ウォレットオブジェクトが渡されます。このオブジェクトには、ウォレットが提供する機能(例えば、ウォレットに接続するためのConnectメソッドなど)がカプセル化されています。関数内部では、まずRegisterWalletEventイベントがトリガーされます。このイベントのパラメータは、実際にはコールバック関数であり、DAppsがRegisterWalletEventイベントを受け取った時に呼び出されます。このコールバック関数は、ウォレットオブジェクトを渡すため、DAppsはウォレットオブジェクトへの参照を取得し、ウォレットとのインタラクションを行うことができます。
DApp開発者は、ウォレットオブジェクトのコードを自分で書く必要はありません。これは、Wallet Standardに「getWallets」として組み込まれています。ただし、getWalletsはイベントをリッスンするだけであり、イベントをどのように処理するかは開発者に依存します。たとえば、取得したウォレットをどこに配置するか?一部のウォレットは、DAppがロードされる前にすでにロードされているかもしれませんが、他のウォレットは後でロードされるかもしれません。これらのウォレットの状態はどのように維持されますか?Wallet Standardは、上記の詳細な問題に対処するために、「@wallet-standard/react」パッケージを提供し、開発者は提供されたReact Hooksを使用して必要なデータを取得できます。これには、ウォレットのリスト、現在接続されているウォレット、ウォレットが提供するメソッドなどが含まれます。
Wallet Standard には、基本的な Wallet オブジェクトの取得以外にも、いくつかの Features フォーマットが定義されています。
実際には、ウォレットには接続、ウォレットイベントの監視など、いくつかの基本的な機能が備わっています。Wallet Standardは、「standard:connect」、「standard:events」などの機能を提供しており、ウォレットプロバイダーがこれらの機能を実装すると、DAppsはこれらの値に基づいてウォレットが特定の操作をサポートしているかどうかを直接判断することができます。
上記の"standard:*"は、組み込み定義された特性ですが、実際には値に特に厳しい要求はありませんので、自由に拡張することができます。異なるチェーンプラットフォームには、Solanaなど固有の特性があり、例えば、"solana:*"と直接約束することができます。Solanaプラットフォームの一般的な特性には、「solana:signTransaction」、「solana:signMessage」などがあります。
目前、Wallet Standard規格を実装しているプロジェクトは実際には多くはありませんが、特筆すべきはSolanaとSuiです。
Ant Design Web3のSolanaアダプターでは、Wallet Standardにも対応し、ウォレットの自動検出もサポートされています。開発者は基本的に「autoAddRegisteredWallets」を有効にするだけで済み、多くのウォレットメタデータを構成する必要はありません。開発体験とユーザー体験が大幅に向上します。
ZAN.TOPのウォレット接続ロジックは、初期に同じ問題に直面しましたが、Ant Design Web3が提供する設定のおかげで、EIP-6963標準に簡単に適合させることができました。みなさんは_wxdyhアドレスをバインドするときにすでにこの点を体験しているはずです。
現在、各ブロックチェーンプラットフォームはWallet Standard(またはEIP-6963)規格に対する態度が異なります。以下にいくつかの例を挙げます:
ビットコイン目前までに類似の標準はないようです。Wallet Standard 標準を実現したプロジェクトがありますが、あまり注目されていませんし、新しいコードの提出もかなり久しぶりです。
現在、開発者は状態を手動で管理するか、開発パッケージを使用して作業を補助する必要があります。たとえば、Ant Design Web3のBitcoinアダプターの実装では、異なるウォレットに対して異なるグローバル変数から取得し、統一の状態に保存します。これにより、ライブラリの開発者は手間のかかる状態管理作業を引き受けることになります。ただし、これはウォレットの競合問題を解決するだけであり、利用可能なウォレットを自動的に検出することはできません。
イーサリアムプラットフォームには、EIP-6963標準が既に存在し、関連するライブラリやウォレットもほとんどがサポートしています。
前述のとおり、公式は実現方法を提供しています:
現在、SuiはWallet Standardの実装を提供しており、公式ドキュメントで使用方法が見つかります:
wagmiは、mipd()ライブラリを介してEIP-6963をサポートしており、詳細についてはwagmiのドキュメントを参照してください。
RainbowKit()の内部ロジックはwagmiに基づいているため、EIP-6963にも内蔵サポートが提供されています。
Ant Design Web3() のEthereumとSolanaアダプターは、これら2つの標準に非常に良いサポートを提供し、開発者が簡単に展開できるようになっています。
イーサリアムDApp開発者にとって、eip6963の設定を追加するだけで十分です。23-25行に関連するEIP-6963に注意してください。
そして、あなたがSolanaエコシステムのDApp開発者である場合は、同様の方法です。それはautoAddRegisteredWalletsプロパティを提供します:
EIP-6963とウォレット標準は、ユーザーがウォレットに接続する体験を大幅に改善し、新しいウォレットプロバイダーの参入障壁を下げることができます。将来的には、より多くのチェーンプラットフォームやウォレット、DApps開発者が関連する標準を提供または実装できることを望んでおり、これはWeb3がより良い方向に向かうのに役立ちます。
この記事は ZAN チーム(X 公式アカウント @zan_team)の gin-lsl が執筆しました。
337.99K 人気度
49.96M 人気度
14.3K 人気度
2.11M 人気度
180.93K 人気度
Web3初心者シリーズ:MetaMaskをクリックすると他のウォレットが呼び出される?ウォレットの競合解決策の現状
ウォレット起動時の混乱
ウォレットに接続することは、Web3の世界に入るための重要な一歩です。Web3のユーザーは、いくつかのDAppsのウェブサイトでウォレットに接続する必要があります。ただし、この単純なアクションでも、ユーザーに深刻な不便を引き起こす可能性があります。
ウォレットに接続する
以下のシナリオを想像してみてください:初心者のWeb3ユーザー(好奇心から、彼は多くのプラグインウォレットをインストールしています)が、あるDAppのウェブサイトにアクセスし、自分のブラウザプラグインウォレットを使用してそれに接続したいと思っていますが、ウェブサイトが提供する「ウォレットに接続する」ボタンをクリックし、DAppに接続するためにウォレットを選択すると、選択したウォレットではなく、表示されるウォレットが異なることがあります。これにより、彼らはパニックになり、息苦しく感じ、自分のコンピュータがウイルスに感染しているのかと思い、予期しない操作を実行したと考えるかもしれません。
ブロックチェーンウォレットは、ブロックチェーンへの重要なゲートウェイであり、このゲートウェイを占有するために、各ウォレットはさまざまな手段を使用しています。その中でも、DApp 開発者やDAppユーザーにとって最も頭痛の種は、各ウォレットがグローバル変数を改ざんすることです。
現在のブラウザウォレットの実装ロジックでは、ウォレットが提供する機能を公開するために、グローバル変数をブラウザに注入することが一般的です(例えば、イーサリアムプラットフォームのウォレットは機能を「ethereum」に注入します)。これにより、DAppはウォレットの提供するメソッドを呼び出して相互作用することができます。
ただし、多くのウォレットが自分自身を同じethereum変数に注入するため、後で登録されたウォレットが以前に登録されたウォレットを上書きし、最後に登録されたウォレットのみを呼び出す方法しか存在しません。
時には、DAppのユーザーは、自分が使用したいウォレットを正常に使用するために、他のウォレットプラグインを一時的に無効にするか、または特定のウォレットのみをインストールする必要があります。これにより、ウォレットの開発者の最初の意図とは大きく異なります。また、新しいウォレットはより優れていても、既に他のウォレットを使用しているユーザーを引き付けるのは難しいです。
友達の中には、なぜ必ず同じ変数に注入しなければならないのか疑問に思う人もいるかもしれません。 2つのウォレット、AとBがあると仮定すると、Aは自分自身を「a」に注入し、Bは自分自身を「b」に注入するだけで、どのウォレットを呼び出したいかに応じて、対応するオブジェクトに提供されるメソッドを呼び出すだけで、上記の問題が発生することはありません。これは競合問題を解決できることが確かにできますが、問題は、DAppが複数のウォレット接続をサポートする必要がある場合、開発者がコードに適合させたいすべてのウォレット名を事前に定義し、ユーザーがウォレットを選択したときに、そのウォレットの関連メソッドを呼び出す必要があります。これにより、関連するコードのメンテナンスが非常に困難になります。 一方、ウォレットをすべて同じオブジェクトに注入すると、この問題を回避できます。
ソリューション
上記のジレンマから抜け出すために、コミュニティ内には2つの類似した基準があります。
イーサリアムのソリューション:EIP-6963
イーサリアムコミュニティは2023年5月にEIP-6963を提案しました。
基本的なロジックは非常にシンプルで、グローバル変数を捨て、ウォレットの登録と検出の問題を解決するために約束されたイベントを使用することです。
具体的には、プラグインウォレットが正常にロードされると、「eip6963:announceProvider」イベントがトリガーされ、DAppに新しいウォレットが利用可能であることが通知されます。そして、DAppはこのイベントを監視して、現在利用可能なウォレットの一覧を知ることができます。
これにより、一連の抽象的なイベントリスナーロジックを介して、直接的にグローバル変数を使用することによる問題を回避し、現在のユーザー環境で利用可能なウォレットを自動的に検出することができます。これにより、ジレンマが解消されます。
コミュニティスタンダード:Walletスタンダード
EIP-6963 はイーサリアムエコシステムの標準ですが、イーサリアムだけでなく、他のチェーンプラットフォームでも同様の問題が発生する可能性があります。例えば、Solana チェーンのウォレットは一般的に自分自身を「solana」変数に注入しますが、これも競合状況を引き起こす可能性があります。
では、Solanaのエコシステムでもこの基準を実現することはできるでしょうか?EIP-6963はイーサリアムエコシステムのウォレット発見の問題を解決するためだけではありますが、その中にはすべてのチェーンプラットフォームに適用できる考え方が含まれています。では、さらに一歩進んで、すべてのブロックチェーンプラットフォームのウォレットとDAppsが実現するための共通の基準を提供し、開発者やユーザーがEIP-6963の提供する利便性を享受できるようにすることはできるでしょうか?理論的には全く問題ありませんし、すでに開発者がそれを実現しているのがWallet Standardです。
ウォレットスタンダードのコアワークは、「registerWallet」と「getWallets」の2つの関数を提供することであり、前者はウォレット用、後者はDApps用です。
ウォレットの呼び出し「registerWallet」には、ウォレットオブジェクトが渡されます。このオブジェクトには、ウォレットが提供する機能(例えば、ウォレットに接続するためのConnectメソッドなど)がカプセル化されています。関数内部では、まずRegisterWalletEventイベントがトリガーされます。このイベントのパラメータは、実際にはコールバック関数であり、DAppsがRegisterWalletEventイベントを受け取った時に呼び出されます。このコールバック関数は、ウォレットオブジェクトを渡すため、DAppsはウォレットオブジェクトへの参照を取得し、ウォレットとのインタラクションを行うことができます。
DApp開発者は、ウォレットオブジェクトのコードを自分で書く必要はありません。これは、Wallet Standardに「getWallets」として組み込まれています。ただし、getWalletsはイベントをリッスンするだけであり、イベントをどのように処理するかは開発者に依存します。たとえば、取得したウォレットをどこに配置するか?一部のウォレットは、DAppがロードされる前にすでにロードされているかもしれませんが、他のウォレットは後でロードされるかもしれません。これらのウォレットの状態はどのように維持されますか?Wallet Standardは、上記の詳細な問題に対処するために、「@wallet-standard/react」パッケージを提供し、開発者は提供されたReact Hooksを使用して必要なデータを取得できます。これには、ウォレットのリスト、現在接続されているウォレット、ウォレットが提供するメソッドなどが含まれます。
ウォレットの標準機能
Wallet Standard には、基本的な Wallet オブジェクトの取得以外にも、いくつかの Features フォーマットが定義されています。
実際には、ウォレットには接続、ウォレットイベントの監視など、いくつかの基本的な機能が備わっています。Wallet Standardは、「standard:connect」、「standard:events」などの機能を提供しており、ウォレットプロバイダーがこれらの機能を実装すると、DAppsはこれらの値に基づいてウォレットが特定の操作をサポートしているかどうかを直接判断することができます。
上記の"standard:*"は、組み込み定義された特性ですが、実際には値に特に厳しい要求はありませんので、自由に拡張することができます。異なるチェーンプラットフォームには、Solanaなど固有の特性があり、例えば、"solana:*"と直接約束することができます。Solanaプラットフォームの一般的な特性には、「solana:signTransaction」、「solana:signMessage」などがあります。
ウォレットスタンダードの現状
目前、Wallet Standard規格を実装しているプロジェクトは実際には多くはありませんが、特筆すべきはSolanaとSuiです。
Ant Design Web3のSolanaアダプターでは、Wallet Standardにも対応し、ウォレットの自動検出もサポートされています。開発者は基本的に「autoAddRegisteredWallets」を有効にするだけで済み、多くのウォレットメタデータを構成する必要はありません。開発体験とユーザー体験が大幅に向上します。
ZAN.TOPのウォレット接続ロジックは、初期に同じ問題に直面しましたが、Ant Design Web3が提供する設定のおかげで、EIP-6963標準に簡単に適合させることができました。みなさんは_wxdyhアドレスをバインドするときにすでにこの点を体験しているはずです。
各ブロックチェーンエコシステムの実現
現在、各ブロックチェーンプラットフォームはWallet Standard(またはEIP-6963)規格に対する態度が異なります。以下にいくつかの例を挙げます:
ビットコイン
ビットコイン目前までに類似の標準はないようです。Wallet Standard 標準を実現したプロジェクトがありますが、あまり注目されていませんし、新しいコードの提出もかなり久しぶりです。
現在、開発者は状態を手動で管理するか、開発パッケージを使用して作業を補助する必要があります。たとえば、Ant Design Web3のBitcoinアダプターの実装では、異なるウォレットに対して異なるグローバル変数から取得し、統一の状態に保存します。これにより、ライブラリの開発者は手間のかかる状態管理作業を引き受けることになります。ただし、これはウォレットの競合問題を解決するだけであり、利用可能なウォレットを自動的に検出することはできません。
イーサリアム
イーサリアムプラットフォームには、EIP-6963標準が既に存在し、関連するライブラリやウォレットもほとんどがサポートしています。
ソラナ
前述のとおり、公式は実現方法を提供しています:
スイ
現在、SuiはWallet Standardの実装を提供しており、公式ドキュメントで使用方法が見つかります:
DApps 開発ライブラリのサポート
ワグミ
wagmiは、mipd()ライブラリを介してEIP-6963をサポートしており、詳細についてはwagmiのドキュメントを参照してください。
レインボーキット
RainbowKit()の内部ロジックはwagmiに基づいているため、EIP-6963にも内蔵サポートが提供されています。
Ant Design Web3 (英語)
Ant Design Web3() のEthereumとSolanaアダプターは、これら2つの標準に非常に良いサポートを提供し、開発者が簡単に展開できるようになっています。
イーサリアムDApp開発者にとって、eip6963の設定を追加するだけで十分です。23-25行に関連するEIP-6963に注意してください。
そして、あなたがSolanaエコシステムのDApp開発者である場合は、同様の方法です。それはautoAddRegisteredWalletsプロパティを提供します:
まとめ
EIP-6963とウォレット標準は、ユーザーがウォレットに接続する体験を大幅に改善し、新しいウォレットプロバイダーの参入障壁を下げることができます。将来的には、より多くのチェーンプラットフォームやウォレット、DApps開発者が関連する標準を提供または実装できることを望んでおり、これはWeb3がより良い方向に向かうのに役立ちます。
この記事は ZAN チーム(X 公式アカウント @zan_team)の gin-lsl が執筆しました。