ウォレットが呼び出されたときの混乱
ウォレットを接続することは、Web3の世界への重要なステップであり、Web3のユーザーは、いくつかのDAppサイトでウォレットを接続することをしばしば要求されます。しかし、この単純な行動がユーザーに深刻な不便をもたらすこともあります。
ウォレットの接続
初心者のWeb3ユーザー(興味本位で、いくつかのプラグインウォレットをインストールしている)が、あるDAppのWebサイトを訪問し、自分のDAppを使用して接続しようとするシナリオを想像してみてください。初心者のWeb3ユーザー(好奇心から多くのプラグインウォレットをインストールしている)が、あるDAppのウェブサイトを訪問し、ブラウザのプラグインウォレットを使ってDAppに接続しようとするが、ウェブサイトが提供する "Connect Wallet "ボタンをクリックし、DAppに接続するためにウォレットを選択すると、ポップアップ表示されたウォレットが選択したウォレットではないことに気づくかもしれない。そのため、自分のコンピューターがウイルスに感染し、思いもよらない行動をとってしまったと思い、パニックに陥り、窒息してしまう可能性が高い。
ブロックチェーンのウォレットは、ブロックチェーンへの重要な入口であり、それを占有するために、個々のウォレットは思いつく限りのあらゆる方法を用いてきました。DApp開発者とDAppユーザーにとって最大の頭痛の種の1つは、ウォレットによるグローバル変数の改ざんです。
現在のブラウザウォレットの実装では、ウォレットはブラウザにグローバル変数を注入することで機能を公開しています(例えば、イーサリアムウォレットは「 window.ethereum 」に機能を注入します)。DAppsはポータルにアクセスするためにウォレットが提供するメソッドを呼び出すことができます。
ただ、多くのウォレットが同じwindow.ethereum変数に自分自身をインジェクトするので、後から登録されたウォレットは先に登録されたものを上書きし、最後に登録されたものだけがこの方法で呼び出すことができます。
DAppユーザーは、必要なウォレットを使用するために、他のウォレットプラグインを一時的に無効にするか、ウォレットだけをインストールしなければならないことがあります。これはウォレットの開発者が考えていたことではありません。そして、新しいウォレットがより良い仕事をしたとしても、すでに他のウォレットを使っているユーザーを引き付けるのは難しいでしょう。
なぜ同じ変数に注入しなければならないのかと疑問に思う人もいるかもしれない。実際、Aが" window.a "に注入され、Bが" window.b "に注入されている限り、どちらのウォレットを呼び出したいとしても、その対応するオブジェクトで提供されているメソッドを呼び出せば、Aを呼び出そうとして代わりにBを呼び出してしまうという問題は発生しません。これはコンペティションの問題を解決しますが、問題はDAppが複数のウォレット接続をサポートする場合、開発者が適応させたい全てのウォレットの名前をコード内で事前に定義し、ユーザーがウォレットを選択した時にウォレットのメソッドを呼び出さなければならないことです。これはコードのメンテナンスに多くの問題をもたらします。これはウォレットを同じオブジェクトに注入することで回避できます。
解決策
上記のジレンマから抜け出すために、コミュニティには似たような標準が2つあります。
イーサネットのソリューション: EIP-6963
EIP-6963提案は、イーサネット コミュニティによって2023年5月に導入されました。
この基本的なロジックは単純で、ウォレットの登録と検出の問題を解決するために、グローバル変数を捨てて、合意されたイベントを使用するというものです。
具体的には、プラグインウォレットが正常にロードされると、統一された" eip6963:announceProvider "イベントがトリガーされます。DAppは現在どのウォレットが利用可能かを知るためにこのイベントをリッスンします。
これにより、グローバル変数を直接使用する問題を回避し、抽象的なイベントリスニングロジックのセットを通して、ユーザーの環境で現在利用可能なウォレットを自動的に見つけることができます。このようにして、ジレンマは解決されます。
コミュニティスタンダード:ウォレットスタンダード
EIP-6963はイーサのエコスタンダードですが、イーサだけでなく、他のチェーンプラットフォームにも同様の問題があるでしょう。例えば、Solanaチェーンウォレットは一般的に" window.solana "変数に自分自身を注入し、再び競争状況を作り出します。
では、Solanaエコシステムもこの標準を実装できるのでしょうか?EIP-6963はイーサリアムエコシステムにおけるウォレットディスカバリーに対処することのみを意図していますが、そこに組み込まれたアイデアは実際にはすべてのチェーンプラットフォームに適用することができます。そこで、さらに一歩進んで、すべてのブロックチェーンプラットフォーム上のウォレットとDAppsが実装できる共通の標準セットを提供し、すべてのチェーンプラットフォームの開発者とユーザーがEIP-6963によって提供される利便性を享受できるようにすることはできないでしょうか?
ウォレットスタンダードが行うことの中核は、"registerWallet "と "registerWallet "の2つの関数を提供することです。
ウォレットは" registerWallet "を呼び出します。" registerWallet "は、ウォレットによって提供される機能をカプセル化したウォレットオブジェクトを渡します(例えば、コネクトメソッド、DApps.registerWalletメソッド、DApps.registerWalletメソッド、DApps.registerWalletメソッド、DApps.registerWalletメソッドなど)。例えば、Connect メソッドはウォレットに接続するために使われます)。イベントのパラメータは実際にはコールバック関数で、DApp が RegisterWalletEvent イベントをリッスンするために使用されます。DAppはウォレットオブジェクトへの参照を取得し、ウォレットと対話することができます。
DApp。この部分は" getWallets "としてWallet Standardに組み込まれているので、開発者がウォレットオブジェクトをリッスンして受け取るために独自のコードを書く必要はありません。しかし、getWallets はイベントをリッスンするだけなので、開発者はイベントをどのように扱うかを考慮する必要があります。例えば、取得したウォレットをどこに置くか?DAppがロードされる前にロードされるウォレットもあれば、後からロードされるウォレットもありますが、これらのウォレットの状態をどのように維持するのでしょうか? Wallet Standardは上記の問題の詳細について、" @wallet-standard/react "パッケージを提供しながら、開発者が直接Reactのフックは、ウォレットのリスト、現在接続しているウォレット、ウォレットが提供するメソッドなど、欲しいデータを取得することができます。
ウォレットスタンダードの機能
ウォレットオブジェクトの基本的なフェッチの他に、ウォレットスタンダードでは、多くの機能(Features)も定義しています。Standardはまた、多くのFeaturesフォーマットを定義しています。
実際、ウォレットには接続やウォレットイベントのリッスンなどの基本的な機能があります。ウォレットスタンダードは "standard:connect"、"standard:events "などの機能を提供します。ウォレットプロバイダがこれらの機能を実装すると、DAppはこれらの値に基づいてウォレットが特定の操作をサポートしているかどうかを判断できます。
上記の "standard:*"は組み込みで定義されている機能であり、実際その値は特に要求されるものではないので、自由に拡張することができます。Solanaのように、直接 "solana:*"に同意することもできます。 Solanaプラットフォームの共通機能には、" solana:signTransaction", "solana:signMessage "などがあります。
ウォレットスタンダードのステータス
現時点では、ウォレットスタンダードの実装は多くありません。
Ant Design Web3用のSolanaアダプタは、Wallet Standardに対応したウォレットの自動検出もサポートしており、開発者は基本的に" autoAddRegistered "コマンドでアダプタにWallet Standardを追加するだけです。autoAddRegisteredWallets "をオンにすることで、ウォレットメタデータの束を設定する必要がなくなり、開発エクスペリエンスとユーザーエクスペリエンスがストレートに向上します。
ZAN.TOPのウォレットへの接続ロジックは、初期には同じ問題を抱えていましたが、今ではAnt Design Web3が提供する設定のおかげで、EIP-6963標準に簡単に適応することができます。既に https://zan.top/personal/account?chInfo=ch_wxdyh バインディングアドレスで経験しているはずです。
ブロックチェーンエコシステム全体での実装
現在、ブロックチェーンプラットフォームは、ウォレットスタンダード(またはEIP-6963)標準に対して、すべて同じ態度を持っているわけではありません。
ビットコイン
ビットコインには今のところ同様の標準はないようです。ウォレット標準を実装するプロジェクトはありますが、あまり注目されておらず、しばらく新しいコードも提出されていません。Wallet Standard標準を実装するプロジェクトはあるが、あまり注目されておらず、長い間新しいコードは提出されていない。
現時点では、開発者は手動で状態を維持するか、いくつかのパッケージを使って支援しなければなりません。例えば、Ant Design Web3のBitcoinアダプタの実装では、異なるウォレットに対して、異なるグローバル変数からフェッチされ、統一された状態に保存されます。これは実際には、ライブラリ開発者が状態を維持する面倒な作業を引き継いでいるのです。さらに、これはウォレットの競合問題を解決するだけであり、利用可能なウォレットを自動的に感知できないという問題はまだ存在します。
イーサリアム
イーサプラットフォームにはすでにEIP-6963標準があり、関連ライブラリとウォレットのほとんどがそれをサポートしています。
Solana
上記のように、公式の実装が利用可能です: https://github.com/solana-labs/wallet-standard
イーサプラットフォームにはすでにEIP-6963標準があります。p>Sui
Suiは現在、Wallet Standardの実装を提供しており、公式ドキュメントhttps://docs.sui.io/。standards/wallet-standard
DAppsライブラリサポート
ワグミ
wagmiはmipd (https://github.com/wevm/mipd) ライブラリを通してEIP-6963のサポートを提供します。
RainbowKit
RainbowKit (https://www.rainbowkit.com/) は、wagmi の内部ロジックをベースにしているので、EIP-6963 のビルトインサポートもすでに持っています。EIP-6963をサポートしています。
Ant Design Web3
Ant Design Web3 (https://web3.ant.design/) 用の Ethereum アダプタと Solana アダプタは、両方の標準をサポートしています。Solanaアダプタは両方の標準を非常によくサポートしており、開発者がオンにするのに非常に移植性があります。
イーサネットDApp開発者の場合は、23~25行目のEIP-6963に関連することに注意して、eip6963設定を追加するだけです:
また、SolanaエコシステムのDApp開発者であれば、アプローチは似ています。autoAddRegisteredWallets プロパティを提供します。
概要
EIP-6963とウォレットスタンダードは、ウォレットに接続するユーザーエクスペリエンスを大幅に改善し、新しいウォレットプロバイダーの参入障壁を下げることができます。私たちは、より多くのチェーンプラットフォームやウォレットおよびDApp開発者が将来的にこれらの標準を提供または実装し、Web3がより良い方向に発展することを望んでいます。