WebSocketとは何か、どのように機能するか
執筆者 Alchemy
WebSocketは、TCPをベースにした双方向通信プロトコルであり、クライアントとサーバー間の通信を標準化し、双方がお互いにデータを要求できるようにするものです。対照的に、HTTPのような単方向プロトコルでは、クライアントがサーバーにデータを要求することしかできません。
クライアントとサーバー間のWebSocket接続は、両者が接続を維持したいと望む限り開いたままにでき、継続的な通信が可能になります。
HTTPでは、各接続はクライアントがリクエストを送信した時点で開始し、そのリクエストが処理されると終了します。
WebSocketがWeb3 dApp通知においてより優れている可能性がある理由は、個別のリクエストを必要とすることなく、重要なイベントに対するリアルタイム通知を継続的に実現できるからです。Alchemy Notifyのようなツールを使えば、ウォレットやアプリにリアルタイム通知を簡単に追加できます。
WebSocketとは何か
WebSocketは、クライアントとサーバー間でインタラクティブな通信セッションを可能にする双方向通信プロトコルです。TCPをベースにしており、リアルタイム通知機能を必要とするアプリやサービスでよく使用されます。
WebSocketサーバーとは何か
WebSocketサーバーとは、特定のプロトコルに従ってTCPポートをリッスンしているアプリケーションです。 WebSocketはクライアントとサーバー間の双方向通信プロトコルであり、両者が互いにデータを要求し送信できるようにします。
対照的に、HTTPは単方向通信プロトコルであり、クライアントはサーバーにリクエストを送信することしかできず、サーバーはそのレスポンスとしてデータを返すことしかできません。HTTPの関係において、サーバーがクライアントに対してデータを要求することはありません。
WebSocket接続とは何か
WebSocket接続とは、クライアントとサーバー間の継続的な接続です。対照的に、HTTP接続は一度限りのものです。接続はクライアントがサーバーにリクエストを送るたびに開始し、サーバーのレスポンスとともに終了します。WebSocket接続は、クライアントとサーバーの両者が望む限り維持することができ、つまり最初の1回のリクエストから、両者が望む限りデータをそのWebSocket上で流し続けることができます。
WebSocketはどのプロトコルを使用しているか
WebSocketはWSプロトコルを使用しており、これはTransmission Control Protocol(TCP)をベースにしています。これはコネクション指向のネットワークであり、データを正しい宛先にルーティングするには、参加者間で先に接続を確立する必要があります。
対照的に、Internet Protocolでは、そのデータパケット内の情報に基づいてデータの送信先が決定されます。パケットをルーティングするための事前設定は必要ありません。
WebSocket APIとは何か
サーバーがクライアントにデータを送信する方法は2つあります。クライアントが定期的にサーバーにデータを要求する方法であるポーリングか、サーバーが自動的にクライアントにデータを送信する方法であるサーバープッシュです。
WebSocket APIは、最初のリクエストの後も接続を開いたままにしておくことで、このクライアント・サーバー間の接続を活用してサーバープッシュの手法を用い、クライアントが常に新しい更新をサーバーにポーリングし続けることで生じるインフラへの負荷を取り除きます。
WebSocketはどのように機能するか
WebSocketは双方向通信の方式であり、1つのサーバーリクエストに対して複数のレスポンスを返すことができます。また、WebSocketは主にクライアント・サーバー間の通信に使用されるのに対し、webhookは主にサーバー・サーバー間の通信に使用されます。
WebSocketとwebhookはどう違うのか
WebSocketとは対照的に、HTTPを使用するwebhookは厳密に単方向であり、サーバーはリクエストがあった時にのみアプリケーションに応答し、リクエストが処理されるたびに接続は終了します。
Alchemy Notifyはwebhookを使用してサーバー間の通信を行い、WebSocketを使ってdAppユーザーが目にする通知をプッシュします。
Web3のWebSocketは何に使われるのか
AlchemyのSubscription APIは、既存のEthereum APIの機能を拡張する2つの新しいAPIメソッド、eth_subscribeとeth_unsubscribeを提供しており、Web3開発者がWebSocketを使用して、保留中のトランザクション情報や保留中のトランザクションハッシュ、新しいヘッダーブロック、ログといった情報やデータを継続的に受信できるようにします。
以下は、WebSocketを使用するAlchemyのSubscription APIがサポートするメソッドです。
- alchemy_newFullPendingTransactions - 保留状態に追加されたすべてのトランザクションについて、(トランザクションハッシュだけでなく)トランザクション情報全体を返します
- alchemy_filteredNewFullPendingTransactions - toまたはfromのアドレスフィルタに一致する、保留中のすべてのトランザクションについてトランザクション情報を返します
- newPendingTransactions - 自分が送信したかどうかに関わらず、保留状態に追加されたすべてのトランザクションのハッシュを返します
- newHeads - 新しいヘッダー(ブロック)がブロックチェーンに追加されるたびにイベントを送信します
- logs - 指定されたフィルタ条件に一致する、新しく追加されたブロックに含まれるログを送信します
既存のWebSocket接続を終了する必要がある場合は、サブスクリプションIDパラメータとともにeth_unsubscribe呼び出しを使用できます。
WebSocketとwebhookをいつ使い分けるか
WebSocketとwebhookのどちらを使用するかのトレードオフは、多数のWebSocket接続を同時に開いたまま維持する方が自分のインフラ設計にとって都合が良いか、それともクライアントからの多数のwebhook接続リクエストを処理する方が都合が良いかによって決まります。
サーバーアプリケーションがクラウド関数(AWS Lambda、Google Cloud Functionsなど)として動作している場合は、アプリケーションがWebSocket接続を開いたまま維持しないため、webhookを使用してください。
送信される通知の量が少ない場合も、webhookの方が優れています。これは、接続がイベント発生時のみを条件として開始されるためです。
そのイベントが稀にしか起きないのであれば、クライアントとサーバー間で多数のWebSocket接続を開いたままにしておくよりも、webhookを使用する方が良いでしょう。
最後に、サーバー同士を接続しようとしているのか、それともクライアントとサーバーを接続しようとしているのかも重要です。前者にはwebhookが、後者にはWebSocketが適しています。webhookサーバーをセットアップするためのGithubリポジトリを作成しました。
WebSocketプロトコルをいつ使うか
多くのWeb3アプリにとって、トランザクションのステータスをリアルタイムでユーザーに更新することは必須です。そうしなければ、ユーザー体験が悪化し、アプリやサービスから離脱してしまう可能性があります。Alchemy Notifyは、ユーザーに正確なトランザクションのステータスを知らせることで、この問題を解決します。
HTTPよりWebSocketを使うべき場合
レイテンシを可能な限り最小にする必要があり、イベントの発生とほぼ同時にユーザーに通知を届けたい場合は、HTTPリクエストよりもWebSocketを使用すべきです。HTTPは、クライアントがどのくらいの頻度でリクエストを送信するかによって更新を受け取れる頻度が制限されるため、比較的はるかに遅くなります。
WebSocketの実例
ウォレット残高の変化のような重要なイベントについて、ユーザーに更新を知らせるアプリ内通知をAlchemy Notifyで実装する方法についてのガイドを作成しました。以下は、これまでに公開したチュートリアルの一部です。
Alchemy Notifyは、dAppユーザーにメール通知を送信するためにも使用でき、トランザクションのステータスに関する不満を防ぐことができます。
関連する概要

ブロックチェーンで魔法を生み出す
Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。


