メインコンテンツへスキップ

WebSocketの使用

Alchemy
WebSocket
クエリ
JavaScript
初級
エラン・ハルパーン
2020年12月1日
9 分で読めます

これは、WebSocketとAlchemyを使用してイーサリアムブロックチェーンにリクエストを行うための入門ガイドです。

 (opens in a new tab)WebSocketとHTTPの比較

HTTPとは異なり、WebSocketを使用すると、特定の情報が必要なときに継続的にリクエストを行う必要はありません。WebSocketは(正しく行われれば)ネットワーク接続を維持し、変更をリッスンします。

他のネットワーク接続と同様に、WebSocketが中断されることなく永久に開いたままであると想定すべきではありませんが、切断された接続の処理と再接続を手動で正しく行うことは難しい場合があります。WebSocketのもう1つの欠点は、レスポンスでHTTPステータスコードを取得できず、エラーメッセージのみを取得することです。

Alchemy Web3 (opens in a new tab)は、設定不要でWebSocketの失敗と再試行の処理を自動的に追加します。

試してみる

WebSocketをテストする最も簡単な方法は、wscat (opens in a new tab)などのWebSocketリクエストを行うためのコマンドラインツールをインストールすることです。wscatを使用すると、次のようにリクエストを送信できます。

注:Alchemyアカウントをお持ちの場合は、demoをご自身のAPIキーに置き換えることができます。無料のAlchemyアカウントの登録はこちらから! (opens in a new tab)

wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo

>  {"jsonrpc":  "2.0", "id": 0, "method":  "eth_gasPrice"}

<  {"jsonrpc":  "2.0", "result":  "0xb2d05e00", "id": 0}

WebSocketの使用方法

まず、アプリのWebSocket URLを使用してWebSocketを開きます。アプリのWebSocket URLは、ダッシュボード (opens in a new tab)でアプリのページを開き、「View Key」をクリックすることで確認できます。アプリのWebSocket用URLはHTTPリクエスト用URLとは異なりますが、どちらも「View Key」をクリックすることで確認できます。

Where to find your WebSocket URL in your Alchemy dashboard

Alchemy APIリファレンス (opens in a new tab)に記載されているAPIはすべて、WebSocket経由で使用できます。これを行うには、HTTP POSTリクエストの本文として送信されるのと同じペイロードを使用しますが、代わりにそのペイロードをWebSocket経由で送信します。

Web3を使用する場合

Web3のようなクライアントライブラリを使用しながらWebSocketに移行するのは簡単です。Web3クライアントをインスタンス化する際に、HTTPのURLの代わりにWebSocketのURLを渡すだけです。例:

const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")

web3.eth.getBlockNumber().then(console.log) // -> 7946893

サブスクリプションAPI

WebSocket経由で接続している場合、eth_subscribeeth_unsubscribeの2つの追加メソッドを使用できます。これらのメソッドを使用すると、特定のイベントをリッスンし、すぐに通知を受け取ることができます。

eth_subscribe

指定されたイベントの新しいサブスクリプションを作成します。eth_subscribeの詳細はこちら (opens in a new tab)

パラメータ

  1. サブスクリプションタイプ
  2. オプションのパラメータ

最初の引数は、リッスンするイベントのタイプを指定します。2番目の引数には、最初の引数に依存する追加のオプションが含まれます。さまざまなサブスクリプションタイプ、そのオプション、およびイベントペイロードについて以下で説明します。

戻り値

サブスクリプションID:このIDは受信したすべてのイベントに添付され、eth_unsubscribeを使用してサブスクリプションをキャンセルするためにも使用できます。

サブスクリプションイベント

サブスクリプションがアクティブな間、以下のフィールドを持つオブジェクトであるイベントを受信します。

  • jsonrpc: 常に "2.0"
  • method: 常に "eth_subscription"
  • params: 以下のフィールドを持つオブジェクト:
    • subscription: このサブスクリプションを作成したeth_subscribe呼び出しによって返されたサブスクリプションID。
    • result: サブスクリプションのタイプによって内容が異なるオブジェクト。

サブスクリプションタイプ

  1. alchemy_newFullPendingTransactions

保留中の状態に追加されたすべてのトランザクションのトランザクション情報を返します。このサブスクリプションタイプは、標準のWeb3呼び出しであるweb3.eth.subscribe("pendingTransactions")と同様に保留中のトランザクションをサブスクライブしますが、トランザクションハッシュだけでなく_完全なトランザクション情報_を出力する点が異なります。

例:

  1. newHeads

チェーンの再編成(リオーグ)中を含め、新しいヘッダーがチェーンに追加されるたびにイベントを出力します。

チェーンのリオーグが発生した場合、このサブスクリプションは新しいチェーンのすべての新しいヘッダーを含むイベントを出力します。具体的には、同じ高さで複数のヘッダーが出力される場合があり、これが発生した場合は、後のヘッダーをリオーグ後の正しいヘッダーとして扱う必要があります。

例:

  1. logs

指定されたフィルター条件に一致する、新しく追加されたブロックの一部であるログを出力します。

チェーンのリオーグが発生した場合、古いチェーンのブロックの一部であるログは、プロパティremovedtrueに設定されて再度出力されます。さらに、新しいチェーンのブロックの一部であるログが出力されるため、リオーグの場合には同じトランザクションのログが複数回表示される可能性があります。

パラメータ

  1. 以下のフィールドを持つオブジェクト:
    • address (オプション): アドレスを表す文字列、またはそのような文字列の配列。
      • これらのアドレスのいずれかから作成されたログのみが出力されます。
    • topics: トピック指定子の配列。
      • 各トピック指定子は、null、トピックを表す文字列、または文字列の配列のいずれかです。
      • 配列内のnullではない各位置は、出力されるログを、その位置に指定されたトピックのいずれかを持つもののみに制限します。

トピック指定の例:

  • []: 任意のトピックを許可。
  • [A]: 最初の位置にA(およびそれ以降は任意)。
  • [null, B]: 最初の位置は任意で、2番目の位置にB(およびそれ以降は任意)。
  • [A, B]: 最初の位置にA、2番目の位置にB(およびそれ以降は任意)。
  • [[A, B], [A, B]]: 最初の位置に(AまたはB)、2番目の位置に(AまたはB)(およびそれ以降は任意)。

例:

eth_unsubscribe

既存のサブスクリプションをキャンセルし、それ以降のイベントが送信されないようにします。

パラメータ

  1. 以前にeth_subscribe呼び出しから返されたサブスクリプションID。

戻り値

サブスクリプションが正常にキャンセルされた場合はtrue、指定されたIDのサブスクリプションが存在しなかった場合はfalse

例:

リクエスト

curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
-X POST
-H "Content-Type: application/json"
-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'

結果

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}

無料でAlchemyに登録 (opens in a new tab)し、ドキュメント (opens in a new tab)を確認してください。最新ニュースについては、ツイッター (opens in a new tab)でフォローしてください。