Skip to main content

概要

LaserStream は、Solana gRPC ストリーミングの管理サービスです。オープンな Yellowstone gRPC プロトコルとワイヤー互換があり、あらゆる Yellowstone クライアントがそのまま動作します。また、履歴再生、マルチノードフェイルオーバー、完全管理環境といったプロダクション機能を追加します。 LaserStream はオープンソースの gRPC プロトコルを使用しており、ベンダーロックインなく、既存の gRPC 実装と最大限の互換性を確保します。 標準の@triton-one/yellowstone-grpc クライアントで接続することも、性能最適化された Helius LaserStream SDK を使用して、スループットの向上、自動再接続、サブスクリプション管理、エラーハンドリングなどの利点を得ることもできます。

LaserStream SDK は JavaScript Yellowstone クライアントと比較して40倍速い

Rust CoreをゼロコピーNAPIバインディングとともに使用し、JavaScript SDKの性能を最大化した方法について学びます
パフォーマンスに関する注意: LaserStream接続で遅延やパフォーマンスの問題が発生した場合は、一般的な原因と解決策についてトラブルシューティングセクションを参照してください。

エンドポイントとリージョン

LaserStreamは、世界中の複数のリージョンで利用可能です。 アプリケーションに最も近いエンドポイントを選択して、最適なパフォーマンスを実現してください。

メインネットエンドポイント

Devnet エンドポイント

ネットワークとリージョンの選択:
  • 本番アプリの場合は、サーバーに最も近いメインネットエンドポイントを選んで、最適なパフォーマンスを実現してください(例:ヨーロッパでデプロイする場合、アムステルダム (ams) やフランクフルト (fra) を使用)
  • テストには、次を使用してください: https://laserstream-devnet-ewr.helius-rpc.com.

zstd 圧縮

すべてのLaserStream gRPCエンドポイントはzstd 圧縮をサポートします。圧縮はオプトイン形式です。クライアントがzstd サポートを広告しない限り、レスポンスは非圧縮のままです。 Helius LaserStream TypeScript SDKでzstd を有効化する:
zstd はネットワーク帯域幅を削減しますが、圧縮作業を増やします。レイテンシーに敏感なストリームに使用する前に、サブスクリプションのワークロードでベンチマークを行ってください。

ログの切り詰め

デフォルトでは、LaserStreamはトランザクションログメッセージを高速化とパフォーマンス向上のために10 KBに切り詰めます。完全なログが必要な場合は、専用の未切り詰めエンドポイントが利用可能です。ログの切り詰めを参照してください。

クイックスタート

LaserStreamをHelius ダッシュボードから始めましょう。メインネットはビジネスまたはプロフェッショナルプランが必要です。Devnetは開発者以上で利用可能です。プランと価格の詳細を参照してください。
1

新しいプロジェクトを作成

2

依存関係をインストール

私たちはtsx を使用します。なぜなら、TypeScript 5.xのデフォルトのnpx tsc --initverbatimModuleSyntax, module: "nodenext", types: []をセットし、これは迅速なts-node index.tsの実行をすべて妨げるからです。tsxはtsconfigなしで.ts ファイルを実行します。
3

APIキーを取得

Helius ダッシュボードからキーを生成します。このキーはLaserStreamの認証トークンとして機能します。
プラン要件: LaserStreamのDevnetはすべてのプランで利用可能です。LaserStreamのメインネットはビジネスまたはプロフェッショナルプランが必要です。
4

サブスクリプションスクリプトを作成

次の内容で**index.ts**を作成:
5

APIキーを置き換え、リージョンを選択

index.ts内で、以下を使用してconfigオブジェクトを更新します。
  1. Helius ダッシュボードから取得した実際のAPIキー
  2. サーバーの場所に最も近いLaserStreamエンドポイント
ネットワークとリージョンの選択例:
  • 本番用 (メインネット):
    • ヨーロッパ: fra (フランクフルト), ams (アムステルダム), lon (ロンドン) を使用
    • US東部: ewr (ニューヨーク) を使用
    • US西部: slc (ソルトレイクシティ) またはlax (ロサンゼルス) を使用
    • アジア: tyo (東京) またはsgp (シンガポール) を使用
  • 開発用 (Devnet):
    • https://laserstream-devnet-ewr.helius-rpc.comを使用
6

実行と結果の表示

いつでも、confirmed トークントランザクションがTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DAを含む場合、データがコンソールに表示されます。

一般的なワークフロー

最もよく見られるワークフローのステップバイステップガイド。各ガイドでは、 自動再接続と履歴再生が組み込まれたhelius-laserstream SDK を使用します。

アカウントサブスクリプション

特定のアカウントにフィルタをかけて、残高、データ、および所有権の変更を監視します。

トランザクション監視

ターゲットアカウントを含むトランザクションをストリームし、プログラム、投票、または失敗ステータスでフィルタリングします。

スロットとブロックの監視

ネットワークのコンセンサス、ブロックの生成、およびコミットメントレベルの移行を追跡します。

トランザクションデータのデコード

バイナリtransactionUpdateペイロードを可読なSolanaトランザクションに解析します。

Stream Pump AMMデータ

現実の例:再接続安全なフィルタを使用してPump AMMの取引を監視します。
生のYellowstoneプロトコルを好む場合、@triton-one/yellowstone-grpcクライアントは同じエンドポイントに対して動作します。プロトコルレベルの詳細については、Yellowstone gRPCリファレンスを参照してください。

サブスクライブリクエスト

サブスクライブリクエストでは、次の一般的なパラメータを含める必要があります。
履歴再生: 特定のスロットからデータを再生するために、メインSubscribeRequestオブジェクトにオプションでfromSlotフィールド(u64番号)を含めることができます。再生は現在、過去216,000スロット(約24時間)に制限されており、20分以上前の再生は最終化されたデータのみを返します
次に、サブスクライブしたいデータのフィルタ(アカウント、ブロック、スロット、トランザクションなど)を指定する必要があります。
スロット更新のフィルタを定義します。使用するキー(例:mySlotLabel)は、この特定のフィルタ設定用のユーザー定義のラベルであり、必要に応じて複数の名前付き設定を定義できます(通常は1つで十分です)。
アカウントデータ更新のフィルタを定義します。使用するキー(例:tokenAccounts)は、この特定のフィルタ設定用のユーザー定義のラベルです。
array
提供された配列から任意の公開鍵に一致します。
array
アカウントオーナーの公開鍵。提供された配列から任意の公開鍵に一致します。
array
getProgramAccountsのフィルタに類似。このフィルタは、datasizememcmp フィルタの配列です。 memcmpの場合、比較対象はbytesbase58base64 のいずれかに直接行きます。
enum
非推奨
非推奨 — Agave 4.2以降は効果なし。 notifyOnを設定しても効果がありません。フィールドは後日削除されます。
すべてのフィールドが空の場合、すべてのアカウントがブロードキャストされます。それ以外の場合は以下のようになります:
  • フィールドは論理ANDとして動作します。
  • 配列内の値は論理ORとして動作します(ただし、filters内では論理ANDとして動作します)。
10,000以上のアカウントを追跡していますか? 明示的なパブリックキーペアリスト(アカウントごとに32バイト)を使用する代わりに、圧縮されたcuckooフィルタ(アカウントごとに約3-4バイト)を使用して、1つのストリームで何十万ものアカウントをサブスクライブできます。RustおよびJavaScript SDKで利用可能です。
トランザクション更新のフィルタを定義します。使用するキー(例:myTxSubscription)は、この特定のフィルタ設定用のユーザー定義のラベルです。すべてのフィールドが空のままの場合、すべてのトランザクションがブロードキャストされます。それ以外の場合は以下のようになります:
  • フィールドは論理ANDとして動作します。
  • 配列内の値は論理ORとして扱われます(ただしaccountRequiredではすべてが一致する必要があります)。
ブロック更新のフィルタを定義します。使用するキー(例:myBlockLabel)は、この特定のフィルタ設定用のユーザー定義のラベルです。
これはブロックに似ていますが、トランザクション、アカウント、およびエントリを除外します。使用するキー(例:blockmetadata)は、このサブスクリプション用のユーザー定義のラベルです。現在、ブロックメタデータにはフィルタはありません。すべてのメッセージがデフォルトでブロードキャストされます。
レジャーエントリをサブスクライブします。使用するキー(例:entrySubscribe)は、このサブスクリプション用のユーザー定義のラベルです。現時点では、エントリにフィルタはありません。すべてのエントリがブロードキャストされます。

コード例 (LaserStream SDK)

SDKオプション

複数のプログラミング言語に対して公式SDKを提供しています。 他の言語やカスタム実装については、Yellowstone gRPC protoファイルを直接使用して、お好みの言語のgRPCクライアントを生成することができます。

トラブルシューティング / FAQ

A: LaserStream接続におけるパフォーマンスの問題は通常、次のことが原因です。
  • JavaScriptクライアントの遅さ: JavaScriptクライアントは、メッセージが多すぎるか帯域幅を消費しすぎている場合に遅れることがあります。サブスクリプションをより絞り込んでメッセージ量を削減するか、LaserStream JavaScript SDKに切り替えるか、別の言語を試してください。
  • ローカル帯域幅の制限: 重いサブスクリプションは、ネットワーク帯域幅が限られているクライアントを圧倒します。ネットワーク使用状況を監視し、接続をアップグレードするか、サブスクリプションの範囲を縮小してください。
  • 地理的距離: 長いネットワークルートは、レイテンシーとパケット損失を増加させます。サーバーに最も近いエンドポイントを使用してください。高レイテンシー接続では、ネットワークリードバッファサイズを大きくしてください(帯域幅を5倍以上改善できます):
    再起動後も持続させるには、/etc/sysctl.confに追加してください。
    HTTP/2ストリームおよび接続ウィンドウサイズを64MBに増やして、フロー制御のボトルネックを防ぎます。両方のサイズを増やす必要があります。ストリームウィンドウだけを上げても、接続レベルのウィンドウが制約となります。
  • クライアント側処理のボトルネック: メッセージ処理ロジックが最適化されているか、メインスレッドを長時間ブロックしないことを確認してください。
クライアントのラグデバッグ: クライアントをデバッグするために、ノードからLaserstream gRPCサーバへの最大帯域幅をテストするツールを作成しました。使用するには、次のコマンドを実行してください。
出力は、サーバーとLaserstreamサーバー間の最大ネットワーク容量を返します。すべてのトランザクションデータをサブスクライブするには、最低でも10MB/sが必要です。すべてのアカウントデータをサブスクライブするには80MB/sが必要です。最適なパフォーマンスを得るには、最低でも必要な容量の2倍を推奨します。
A: APIキーとエンドポイントが正しいこと、ネットワークが指定されたエンドポイントへのgRPC接続を許可していることを確認してください。Heliusステータスページで進行中のインシデントがないか確認してください。
A: フィルタセクションに記載されている論理演算子(AND/OR)を再確認してください。公開鍵が正しいことを確認してください。リクエストで指定されたコミットメントレベルを確認してください。
A: はい、同じSubscribeRequest オブジェクト内で複数のキー(例:accountstransactions)の下でフィルタ設定を定義できます。
A: コンシューマーグループを実装していません。代わりに、LaserStreamは同じ成果をチームに提供します:再開、再生、マルチノードの信頼性を調整レイヤーなしで実現します(およびそれに伴うレイテンシーやオーバーヘッド)。ほとんどのワークロードにはコンシューマーグループは必要なく、レイテンシーと運用オーバーヘッドを増加させると考えています。例として、1つのLaserStream gRPC接続はSolanaのトランザクション+アカウントデータの最大10倍をエミットでき、ほとんどのクライアントは小さくフィルタリングされたスライスをサブスクライブします。この場合、コンシューマーグループを使用すると、パフォーマンスの余裕が減り、故障の原因が増えます。
A: LaserStreamはデフォルトでトランザクションログメッセージを10 KBに切り詰めて、スピードとパフォーマンスを向上させています。完全なログが必要な場合は、専用の未切り詰めエンドポイントに接続してください — ログの切り詰めを参照して一覧をご覧ください。
A: 初期SubscribeRequestpingフィールドを含めると、LaserStreamはすべてのサブスクリプションフィルタを静かに無視し、アカウント、トランザクション、またはスロットデータなしでPongだけが返されます。これを修正するには、初期サブスクライブリクエストからpingを削除し、代わりにサブスクリプションが確立された後にストリームのシンクを介して個別にピンを送信してください。これで、フィルタを妨げることなく接続が維持されます。