dYdX v4 深掘りシリーズ 「インデクサー」
前回、dYdXの次期アップグレードであるv4を構成する主要な要素について解説しました。今回は、構成要素の一つであるインデクサーについて深掘りします。
まず簡単におさらいしますと、インデクサーは、ユーザーに対してブロックチェーンデータを効率的な方法で届ける目的を持つ読み取り専用のサービスです。フルノードからリアルタイムでデータを獲得・保存し、ウェブソケットとRESTのリクエストを通じて上記のサービスを実行します。
インデクサーは、イーサリアムエコシステム上におけるInfuraやAlchemyの役割と似ています。しかし、InfuraやAlchemyと異なり、dYdXのインデクサーは完全にオープンソースで誰もが運営することができます。
インデクサーとは何か?
dYdXのエコシステムで使えるツールの一つとして、dYdXのクライアントは、データベースから必要な情報を取り出す手段であるデータクエリが使えるようになります。Cosmos SDKのフルノードが提供する多くのAPIによって、オンチェーンデータをクエリできるようになります。ここで言うクライアントには、フロントエンドのアプリ、マーケットメーカー、機関投資家、dYdXチェーンのデータをweb2のAPIを通じてクエリする組織すべてが含まれます。
しかし、フルノードはブロック承認を行うことに特化されており、ウェブやスマホユーザーから要求されるような高頻度でlow latency (アクションや情報の処理が速くほとんど待たずに結果が得られることが可能)なクエリには適していません。
上記の理由から、dYdX Tradingはインデクサーのソフトウェアを作ることに決めました。インデクサーは、ウェブソケットとRESTのリクエストを通じて、チェーンのデータをクライアントに届ける目的を持つ読み取り専用のサービスです。言い換えますと、インデクサーの目的は、web2フレンドリーで効率の良いやり方でデータをクライアントに届けることです。例えば、インデクサーはウェブソケットを通じて取引板や約定の状況についてアップデートします。
オンチェーンとオフチェーンデータ
インデクサーは、v4フルノードからのデータを処理するにあたって、二つの異なるインジェスチョン(取り込み)/ストレージ(保管)プロセスに分けられます。一つはオンチェーンデータで、もう一つはオフチェーンデータです。
現在、オンチェーンデータのスループット(単位時間あたりに処理できるデータの量)は毎秒10-50イベントと見込まれています。一方、オフチェーンのスループットは毎秒500-1000イベントと見込まれています。違いは10倍から100倍になります。二つのデータを全く別物として扱うことで、v4はそれぞれの用途に応じたサービスを展開することを目指しています。
オンチェーンデータ
オンチェーンデータは、dYdXチェーン上の取引を読み取ることで再生産される全てのデータを指します。以下のデータはオンチェーンデータに含まれます。
アカウントの残高(USDC)
ポジション(建玉)
約定
トレード
清算(Liquidation)
デレバレッジング
部分的または完全に約定した注文
ファンディングレート
手数料
オラクル価格(ヒストリカル)
長期の注文とキャンセル
条件付き注文とキャンセル
オフチェーンデータ
オフチェーンデータは、v4のノードそれぞれに格納されるデータ(in-memory)です。ブロックチェーンには書かれていません。v4ノードのgRPC APIでクエリすることはできず、ブロックから取り出すこともできません。リスタート等で消えてしまう一時的なデータと言えます。オフチェーンデータは以下を含みます。
短期のオーダーとキャンセル
無限先物取引ペアの取引板
チェーンに行く前のインデックスを使った注文
インデクサーの構造
インデクサーは、v4フルノードから情報を取り込み(インジェスチョンし)クライアントに届ける上で、いくつかのサービスを持っています。インデクサーのサービスに関してカフカトピックス(Kafka topics)を使用します。カフカトピックスは、データを特定のトピックに関連付けることで、データを論理的なグループに分けます。
主なサービスは以下の通りです。
Ender(オンチェーン インジェスチョン)
Enderは、オンチェーンの情報を取り込むためのサービスです。カフカトピックの"to-ender"からデータを取り込みます。ブロックに関する全ての変化を読み取り、オンチェーンデータを保管するインデクサーのためにPostgresデータベースに適用します。"to-websocket-?"カフカトピックを通じて、ウェブソケットイベントを作成・送信します。
Vulcan(オフチェーン インジェスチョン)
Vulcanは、オフチェーンの情報を取り込むためのサービスです。取引板や注文、キャンセル、約定のアップデートを持つカフカトピックの"to-vulcan"からデータを取り込みます。Redisキャッシュで保管されます。
Vulcanは、新たな注文が入るとRedisをアップデートし、注文キャンセルの状態をキャンセル保留中(Cancel pending)に変更し、取引板をアップデートします。また、一部約定した注文がキャンセルされた時、Postgresの注文ステータスをアップデートします。Vulcanは、"to-websocket-?"カフカトピックを通じて、ウェブソケットイベントを作成・送信します。
Comlink(APIサーバー)
Comlinkは、REST APIのエンドポイントによってオンチェーンとオフチェーンデータを読み取らせるためのAPIサーバーです。例えば、ユーザーはComlinkを通じて、USDC残高や特定のポジションの大きさについて調べることが可能で、JSONで返答を受け取ることができます。
dYdX Tradingは、v4APIをデザインするにあたり、現在のv3のAPIとほぼ同じにすることを目指しています。すでにdYdXユーザーが現在のAPIに慣れているからです。
Roundtable
Roundtableは、取引所のアグリゲーションデータを提供するためのサービスです。例えば、24時間の取引量、建玉、PnL、キャンドルなどが含まれます。
Socks (ウェブソケットサービス)
Socksは、インデクサーとクライアントのリアルタイムでのコミュニケーションを支えるサービスです。ender、vulcam、roundtableからのデータを取り込み、クリアントにウェブソケットを通じて送信します。
インデクサーを実装する
インデクサーは、オープンソースになります。インでクサーの運用を目指す第3者パーティーは、初期設定とメンテナンスをする必要があります。
初期設定
オープンソースのrepoを使うためのAWSインフラを設定
インデクサーのコードを実装しフルノードからデータの取り込み
データドッグ(インデクサーサービスを監視するために使える指標を提供)とバグスナッグ(人間の関与が必要なバグや問題をリアルタイムで警告)
メンテナンス
新しいオープンソースが出るたびにインデクサーをアップデート
データドッグとバグスナッグを使って問題がないかチームで警戒
dYdX Tradingが提供する操作手順書に問題があれば報告
インデクサーの初期設定とメンテナンスには、最低限、ソフトウェアの開発と運用ができるエンジニア(DevOps enginner)が一人必要だと考えます。
以下のサービスを使う必要があります。
AWS
ECS - Fargate
RDS - Postgres Database
EC2
Lambda
ElastiCache Redis
EC2 ELB - Loadbalancer
Cloudwatch - Logs
Secret Manger
Terraform Cloud - for deploying to the cloud
Bugsnag
Datadog
Pagerduty
インデクサーの運用者は、オープンソースのインデクサーをホストして全ての利用者のために高いレベル(高いアップタイム)で運用することが求められます。
*上記はdYdX Trading社のブログ「v4 Deep Dive : Indexer」を翻訳・編集したものです。