概要
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は、世界中の複数のリージョンで利用可能です。 アプリケーションに最も近いエンドポイントを選択して、最適なパフォーマンスを実現してください。メインネットエンドポイント
Devnet エンドポイント
ネットワークとリージョンの選択:
- 本番アプリの場合は、サーバーに最も近いメインネットエンドポイントを選んで、最適なパフォーマンスを実現してください(例:ヨーロッパでデプロイする場合、アムステルダム (
ams) やフランクフルト (fra) を使用) - テストには、次を使用してください:
https://laserstream-devnet-ewr.helius-rpc.com.
zstd 圧縮
すべてのLaserStream gRPCエンドポイントはzstd 圧縮をサポートします。圧縮はオプトイン形式です。クライアントがzstd サポートを広告しない限り、レスポンスは非圧縮のままです。
Helius LaserStream TypeScript SDKでzstd を有効化する:
zstd はネットワーク帯域幅を削減しますが、圧縮作業を増やします。レイテンシーに敏感なストリームに使用する前に、サブスクリプションのワークロードでベンチマークを行ってください。
ログの切り詰め
デフォルトでは、LaserStreamはトランザクションログメッセージを高速化とパフォーマンス向上のために10 KBに切り詰めます。完全なログが必要な場合は、専用の未切り詰めエンドポイントが利用可能です。ログの切り詰めを参照してください。クイックスタート
1
新しいプロジェクトを作成
2
依存関係をインストール
tsx を使用します。なぜなら、TypeScript 5.xのデフォルトのnpx tsc --initがverbatimModuleSyntax, 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オブジェクトを更新します。- Helius ダッシュボードから取得した実際のAPIキー
- サーバーの場所に最も近い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の取引を監視します。
サブスクライブリクエスト
サブスクライブリクエストでは、次の一般的なパラメータを含める必要があります。履歴再生: 特定のスロットからデータを再生するために、メイン
SubscribeRequestオブジェクトにオプションでfromSlotフィールド(u64番号)を含めることができます。再生は現在、過去216,000スロット(約24時間)に制限されており、20分以上前の再生は最終化されたデータのみを返します。スロット
スロット
スロット更新のフィルタを定義します。使用するキー(例:
mySlotLabel)は、この特定のフィルタ設定用のユーザー定義のラベルであり、必要に応じて複数の名前付き設定を定義できます(通常は1つで十分です)。アカウント
アカウント
アカウントデータ更新のフィルタを定義します。使用するキー(例:すべてのフィールドが空の場合、すべてのアカウントがブロードキャストされます。それ以外の場合は以下のようになります:10,000以上のアカウントを追跡していますか? 明示的なパブリックキーペアリスト(アカウントごとに32バイト)を使用する代わりに、圧縮されたcuckooフィルタ(アカウントごとに約3-4バイト)を使用して、1つのストリームで何十万ものアカウントをサブスクライブできます。RustおよびJavaScript SDKで利用可能です。
tokenAccounts)は、この特定のフィルタ設定用のユーザー定義のラベルです。array
提供された配列から任意の公開鍵に一致します。
array
アカウントオーナーの公開鍵。提供された配列から任意の公開鍵に一致します。
array
getProgramAccountsのフィルタに類似。このフィルタは、
datasize や memcmp フィルタの配列です。 memcmpの場合、比較対象はbytes、base58、base64 のいずれかに直接行きます。enum
非推奨
非推奨 — Agave 4.2以降は効果なし。
notifyOnを設定しても効果がありません。フィールドは後日削除されます。- フィールドは論理ANDとして動作します。
- 配列内の値は論理ORとして動作します(ただし、
filters内では論理ANDとして動作します)。
トランザクション
トランザクション
トランザクション更新のフィルタを定義します。使用するキー(例:
myTxSubscription)は、この特定のフィルタ設定用のユーザー定義のラベルです。すべてのフィールドが空のままの場合、すべてのトランザクションがブロードキャストされます。それ以外の場合は以下のようになります:- フィールドは論理ANDとして動作します。
- 配列内の値は論理ORとして扱われます(ただし
accountRequiredではすべてが一致する必要があります)。
ブロック
ブロック
ブロック更新のフィルタを定義します。使用するキー(例:
myBlockLabel)は、この特定のフィルタ設定用のユーザー定義のラベルです。ブロックメタ
ブロックメタ
これはブロックに似ていますが、トランザクション、アカウント、およびエントリを除外します。使用するキー(例:
blockmetadata)は、このサブスクリプション用のユーザー定義のラベルです。現在、ブロックメタデータにはフィルタはありません。すべてのメッセージがデフォルトでブロードキャストされます。エントリ
エントリ
レジャーエントリをサブスクライブします。使用するキー(例:
entrySubscribe)は、このサブスクリプション用のユーザー定義のラベルです。現時点では、エントリにフィルタはありません。すべてのエントリがブロードキャストされます。コード例 (LaserStream SDK)
- スロットの更新
- アカウントの更新
- トランザクションの更新
- ブロック
- ブロックメタデータ
- エントリ
SDKオプション
複数のプログラミング言語に対して公式SDKを提供しています。- TypeScript: LaserStream TypeScript SDK
- Rust: LaserStream Rust SDK
- Go: LaserStream Go SDK
トラブルシューティング / FAQ
Q: LaserStream接続でラグや遅れを感じています。この原因は何ですか?
Q: LaserStream接続でラグや遅れを感じています。この原因は何ですか?
A: LaserStream接続におけるパフォーマンスの問題は通常、次のことが原因です。出力は、サーバーとLaserstreamサーバー間の最大ネットワーク容量を返します。すべてのトランザクションデータをサブスクライブするには、最低でも10MB/sが必要です。すべてのアカウントデータをサブスクライブするには80MB/sが必要です。最適なパフォーマンスを得るには、最低でも必要な容量の2倍を推奨します。
- JavaScriptクライアントの遅さ: JavaScriptクライアントは、メッセージが多すぎるか帯域幅を消費しすぎている場合に遅れることがあります。サブスクリプションをより絞り込んでメッセージ量を削減するか、LaserStream JavaScript SDKに切り替えるか、別の言語を試してください。
- ローカル帯域幅の制限: 重いサブスクリプションは、ネットワーク帯域幅が限られているクライアントを圧倒します。ネットワーク使用状況を監視し、接続をアップグレードするか、サブスクリプションの範囲を縮小してください。
-
地理的距離: 長いネットワークルートは、レイテンシーとパケット損失を増加させます。サーバーに最も近いエンドポイントを使用してください。高レイテンシー接続では、ネットワークリードバッファサイズを大きくしてください(帯域幅を5倍以上改善できます):
再起動後も持続させるには、
/etc/sysctl.confに追加してください。HTTP/2ストリームおよび接続ウィンドウサイズを64MBに増やして、フロー制御のボトルネックを防ぎます。両方のサイズを増やす必要があります。ストリームウィンドウだけを上げても、接続レベルのウィンドウが制約となります。 - クライアント側処理のボトルネック: メッセージ処理ロジックが最適化されているか、メインスレッドを長時間ブロックしないことを確認してください。
Q: 接続エラーが発生しています。何を確認すべきですか?
Q: 接続エラーが発生しています。何を確認すべきですか?
A: APIキーとエンドポイントが正しいこと、ネットワークが指定されたエンドポイントへのgRPC接続を許可していることを確認してください。Heliusステータスページで進行中のインシデントがないか確認してください。
Q: フィルタが期待通りに動作しません。なぜですか?
Q: フィルタが期待通りに動作しません。なぜですか?
A: フィルタセクションに記載されている論理演算子(AND/OR)を再確認してください。公開鍵が正しいことを確認してください。リクエストで指定されたコミットメントレベルを確認してください。
Q: 1つのリクエストで複数の種類のデータ(例:アカウントとトランザクション)をサブスクライブできますか?
Q: 1つのリクエストで複数の種類のデータ(例:アカウントとトランザクション)をサブスクライブできますか?
A: はい、同じ
SubscribeRequest オブジェクト内で複数のキー(例:accounts、transactions)の下でフィルタ設定を定義できます。Q: LaserStreamはコンシューマーグループをサポートしていますか?
Q: LaserStreamはコンシューマーグループをサポートしていますか?
A: コンシューマーグループを実装していません。代わりに、LaserStreamは同じ成果をチームに提供します:再開、再生、マルチノードの信頼性を調整レイヤーなしで実現します(およびそれに伴うレイテンシーやオーバーヘッド)。ほとんどのワークロードにはコンシューマーグループは必要なく、レイテンシーと運用オーバーヘッドを増加させると考えています。例として、1つのLaserStream gRPC接続はSolanaのトランザクション+アカウントデータの最大10倍をエミットでき、ほとんどのクライアントは小さくフィルタリングされたスライスをサブスクライブします。この場合、コンシューマーグループを使用すると、パフォーマンスの余裕が減り、故障の原因が増えます。
Q: なぜトランザクションログメッセージが切り捨てられているのですか?
Q: なぜトランザクションログメッセージが切り捨てられているのですか?
A: LaserStreamはデフォルトでトランザクションログメッセージを10 KBに切り詰めて、スピードとパフォーマンスを向上させています。完全なログが必要な場合は、専用の未切り詰めエンドポイントに接続してください — ログの切り詰めを参照して一覧をご覧ください。
Q: なぜアカウントやスロットデータがない状態でPongの応答だけが返ってくるのですか?
Q: なぜアカウントやスロットデータがない状態でPongの応答だけが返ってくるのですか?
A: 初期
SubscribeRequestにpingフィールドを含めると、LaserStreamはすべてのサブスクリプションフィルタを静かに無視し、アカウント、トランザクション、またはスロットデータなしでPongだけが返されます。これを修正するには、初期サブスクライブリクエストからpingを削除し、代わりにサブスクリプションが確立された後にストリームのシンクを介して個別にピンを送信してください。これで、フィルタを妨げることなく接続が維持されます。