Solana Direct Shreds - UDP Forwarding (Raw Shreds)

ERPC Dedicated Shreds を使えば、Raw Shreds を UDP で自前のリスナーに流せます。 これは Solana で最速の観測レイヤーであり、Geyser gRPC や RPC/WebSocket より先に届きます。

なぜこれが最速か

  • Shreds は最初に届く: バリデータ間の Shreds が Geyser gRPC や RPC/WebSocket より先に着信し、レイテンシーが重要な検知で最初に気づけます。
  • UDP でオーバーヘッド最小: 接続確立・再送・順序保証を省き、バリデータ間のワイヤ形式に近いまま受信します。
  • トレードオフ: ファイナライズ前の情報なので、欠落・順不同・失敗トランザクションを扱う前提が必要です。
※ 共有エンドポイントで提供される Shreds gRPC は TCP ベースのため、UDP より遅い接続です。

SDK のサンプルで試す

  • サンプルコード: SDK リポジトリの shreds-udp-rs(Rust)。問い合わせが多い new-token detection を例にしていますが、ターゲットは自由に差し替え可能です。
  • リポジトリ: https://github.com/ValidatorsDAO/solana-stream/tree/main/temp-release/shreds-udp-rs
  • Dedicated Shreds 利用者: 送信先をサンプルがリッスンする ip:port に向ければ、すぐに検知ログを確認できます。
  • まだ UDP を使っていない方: リポジトリをクローンし、ローカルまたは手元の Linux サーバー上で実行してみてください。まずはログを眺め、必要に応じてフックを好みの形にカスタムできます。

UDP パケットが届かない場合

宛先を設定すると UDP 転送は自動的に開始されます。Heartbeat による有効化は不要で、Heartbeat が UNIMPLEMENTED を返しても転送が無効という意味ではありません。
最初に、ホストのネットワークインターフェースでパケットを計測します。プレースホルダーは、対象ストリームに表示される ERPC 送信元 IP と、設定した宛先ポートに置き換えてください。
Linux(tcpdump):
bash
sudo tcpdump -ni any 'udp dst port <DESTINATION_PORT> and src host <ERPC_SOURCE_IP>'
Windows(Pktmon、管理者権限で実行):
powershell
pktmon filter add ERPC-UDP -t UDP -i <ERPC_SOURCE_IP> -p <DESTINATION_PORT>
pktmon start --capture --comp nics --log-mode real-time
  1. 計測が 0 件のままなら、OS のファイアウォールと OS 外部のファイアウォールを両方確認してください。Hetzner では Cloud Firewall またはスイッチポート側の Robot Firewall、AWS では Security Group とサブネットの Network ACL が通信を遮断している場合があります。
  2. <ERPC_SOURCE_IP>/32 から宛先ポート <DESTINATION_PORT> への inbound UDP を許可してください。ERPC の UDP 送信元ポートは動的なため、送信元ポートは制限しないでください。
  3. 計測ではパケットが見えるのにアプリケーションで受信できない場合は、localhost ではなく 0.0.0.0:<DESTINATION_PORT> で受信し、OS のローカルファイアウォールと socket / process 設定を確認してください。
ルール変更後もパケットが届かない場合は、計測時間、パケット数、送信元 IP、宛先 IP、宛先ポートをサポートへお知らせください。

リソース