Solana Web3.js は、今年 11 月にバージョン 2.x を正式にリリースした、非常に機能が豊富な JavaScript ライブラリです。 1.x と比較して、新しいバージョンは大きく変更されました。この記事では、主な変更点のいくつかを要約します。
現時点では、2.x バージョンがリリースされたばかりであるため、使用率は高くなく、使用率の高いライブラリの多くは切り替えられていません。しかし、まずそれを理解し、将来の移行に備えることはできます。
バージョン比較
実際、古いバージョンの方が使いやすいことは認めざるを得ません。まず、古いバージョンには実際には @solana/web3.js という 1 つのパッケージしかなく、その中にすべてが含まれていました。また、クラスに基づいており、一般的に使用される多数の操作がカプセル化されています。たとえば、Connection クラスには数十のメソッドがあり、基本的に開発者が必要とする機能をカバーしています。また、Solana クックブックには多数のサンプル コードが提供されており、開発者はここから必要なものをいつでも見つけることができます。
ただし、これにより別の問題も発生します。開発者が実際に使用する機能は、多くの場合、その一部のみを占めますが、最終的にはコード ベース全体がユーザーのデバイスにダウンロードされることになります。ライブラリ全体のコード サイズが大きいため、これには時間がかかる場合があります。
バージョン 2.x を振り返ると、公式チームは元のコード ベースを @solana/accounts、@solana/codecs、@solana/rpc、@solana/signers、@solana/transactions wait などのいくつかの小さなモジュールに分割しました。また、クラスベースの実装を放棄し、より多くの単一関数を使用します。これは、JavaScript コード構築の最適化に非常に役立ちます。DApp で使用されないコードは削除され、実際にはユーザーのデバイスにダウンロードされません。公式ドキュメントの統計によると、新しいバージョンの DApp を使用すると、基本的に 30% のサイズ最適化が可能で、一部の機能のみを使用する場合は、より高い最適化率を達成できます 。 io/solana-web3.js/#statistics )。
これにより、開発者が必要な機能をいかに迅速に見つけられるようにするかが、Solana チームのドキュメント レベルでのテストとなりました。しかし今のところ、少なくともパッケージ名には適切なセマンティクスがあり、名前から何に使用できるかを大まかに知ることができるようです。これにより、開発者にとっての移行の難しさはある程度軽減されるはずです。
もちろん、リリースされたばかりなので、まだ移行されていないプロジェクトも多くあります。また、Solana Cookbook には 2.x バージョンの例がほとんどありません。また、新しいバージョンでは組み込みのランタイム関数 (キー ペアの生成など) を使用する傾向があるため、ここでの説明がドキュメントに記載されておらず、開発者はいくつかの場所で多少混乱しています。
2.x には、依存関係がゼロという非常に重要な機能もあります。これは多くのユーザーにとって重要ではないかもしれませんが、今年 12 月初旬に @solana/web3.js バージョン 1.95.5 および 1.95.6 で発生したサプライ チェーン攻撃から判断すると、より多くの外部入力と依存関係が急速に増加する可能性が高くなります。セキュリティインシデント。バージョン 2.x のリリースに伴い、Web3.js 開発チームは、より多くのネイティブ関数を使用し、外部依存関係とポリフィルの導入を中止することを決定しました。これは将来変更される可能性がありますが、少なくとも現時点では、2.x バージョンではすべての外部依存関係が削除されます。
重要な変更点
接続する
上で紹介したように、1.x には Connection を通じて提供されるメソッドが多数あります。ただし、最も重要な機能は、RPC リクエスト アドレスを構成してリクエスト送信者を作成することです。次に、それを通じてさまざまなリクエストを送信します。
2.x では、より機能的な方法で実装されています。
上記のコードでは、「sendAndconfirmTransaction」を呼び出してトランザクションを送信すると、HTTPS リクエストが自動的に開始され、WSS 接続が確立され、トランザクション ステータスがサブスクライブされ、トランザクションが確認された後にトランザクション ハッシュが返されます。 。
キーペア
公開鍵と秘密鍵の関係にも大きな変更があります。バージョン 1.x で最もよく使用されていた 2 つのクラス Keypair と PublicKey は存在しなくなり、いくつかの関数に置き換えられました。
たとえば、「await generatedKeyPair()」を使用してキー ペアを生成できます。以前は、「Keypair.generate()」を使用してキー ペアを直接生成していました。
新しいgenerateKeyPairは、以前のように必要なキーペアを直接返すのではなく、Promiseを返すことに気づくかもしれません。これは、新しい実装が JavaScript の Web Crypto API を可能な限り利用し、ネイティブの Ed25519 実装を使用しているためです。 Web Crypto API の多くのメソッドは非同期です。しかし、2024 年が終わりに近づいている今日、JavaScript 開発者はすでに Promise を非常に身近な存在とみなしています。
トランザクションの送信
1.x のユーザーは、「Transaction」と「VersionedTransaction」という 2 つのクラスに精通しているはずです。私が初めて Solana について知ったとき、これらのクラスの関係は非常に混乱しました。
バージョン 2.x では、これら 2 つのクラスも使用できなくなりました。
旧バージョンで提供されていたシステムプログラム関連のメソッドは存在しないため、「SystemProgram」クラスの静的メソッドを別の場所からインポートする必要があります。
たとえば、「transfer」コマンドは、「@solana-program/system」の「getTransferSolstruct」関数を呼び出す必要があります。
クラスは提供されなくなったため、Web3.js は関数型プログラミング機能で一般的に使用される「パイプ」形式を提供します。以下では、パイプ関数を使用して、元の 1.x 伝達関数を実装しています。
トランザクションは Connection を通じてではなく、独自の関数を生成し、その関数を呼び出してトランザクションを開始する、定義した RPC プロバイダーを通じて開始されることがわかります。バージョン 1.x と比較するとコード量は若干増えていますが、よりカスタマイズしやすいのがメリットです。
トランザクションは HTTPS RPC 経由で開始され、トランザクション結果は WSS RPC にサブスクライブすることで確認されます。新しい方法は WSS に大きく依存していると思われますが、WSS は将来さらに広く使用されるようになり、実際に RPC プロバイダーのサービスの安定性に対する要求が高くなります。信頼できる WSS ノード プロバイダーをお探しの場合は、ZAN ノード ( https://zan.top/home/node-service?chInfo=ch_WZ ) が適しています。アジア太平洋地域における Solana の大手サービスプロバイダーとして、当社は安定した効率的な接続パフォーマンスを提供することに尽力しています。イーサリアムやソラナなどの人気チェーンに加えて、さまざまなシナリオのニーズを満たすために、20 以上の主流チェーンの RPC サービスもサポートしています。
反応する
興味深いことに、@solana/web3.js プロジェクトには @solana/react というライブラリも含まれており、これはいくつかの React フックや、signIn などの組み込み関数を提供します。
要約する
@solana/web3.js バージョン 2.x のリリースは、継続的な開発と改善に対する Solana チームの取り組みを完全に反映しています。開発者に、Solana ネットワークと対話するための効率的、柔軟、カスタマイズ可能な方法を提供し、プラットフォームの導入と成長を促進します。
この記事は ZAN チーム (X アカウント@zan_team ) の gin-lsl が執筆しました。