概要
LaserStream は、Solana gRPC ストリーミングの管理サービスです。オープンな Yellowstone gRPC プロトコルとワイヤー互換があり、あらゆる Yellowstone クライアントがそのまま動作します。また、履歴再生、マルチノードフェイルオーバー、完全管理環境といったプロダクション機能を追加します。 LaserStream はオープンソースの gRPC プロトコルを使用しており、ベンダーロックインなく、既存の gRPC 実装と最大限の互換性を確保します。 標準の@triton-one/yellowstone-grpc クライアントで接続することも、性能最適化された Helius LaserStream SDK を使用して、スループットの向上、自動再接続、サブスクリプション管理、エラーハンドリングなどの利点を得ることもできます。
LaserStream SDK は JavaScript Yellowstone クライアントと比較して40倍速い
エンドポイントとリージョン
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に切り詰めます。完全なログが必要な場合は、専用の未切り詰めエンドポイントが利用可能です。ログの切り詰めを参照してください。クイックスタート
新しいプロジェクトを作成
依存関係をインストール
tsx を使用します。なぜなら、TypeScript 5.xのデフォルトのnpx tsc --initがverbatimModuleSyntax, module: "nodenext", types: []をセットし、これは迅速なts-node index.tsの実行をすべて妨げるからです。tsxはtsconfigなしで.ts ファイルを実行します。APIキーを取得
サブスクリプションスクリプトを作成
index.ts**を作成: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を使用
実行と結果の表示
confirmed トークントランザクションがTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DAを含む場合、データがコンソールに表示されます。一般的なワークフロー
最もよく見られるワークフローのステップバイステップガイド。各ガイドでは、 自動再接続と履歴再生が組み込まれたhelius-laserstream SDK を使用します。
アカウントサブスクリプション
トランザクション監視
スロットとブロックの監視
トランザクションデータのデコード
transactionUpdateペイロードを可読なSolanaトランザクションに解析します。Stream Pump AMMデータ
サブスクライブリクエスト
サブスクライブリクエストでは、次の一般的なパラメータを含める必要があります。SubscribeRequest オブジェクトに、fromSlot フィールド(u64 番号)を任意で含めると、特定のスロット以降のデータをリプレイできます。現在、リプレイは過去約48時間(現在のネットワーク速度で約691,200スロット)に制限されています。約20分より前のリプレイでは、finalized のデータのみが返されることに注意してください。{ offset: uint64, length: uint64 } の配列です。スロット
スロット
アカウント
アカウント
tokenAccounts)は、この特定のフィルタ設定用のユーザー定義のラベルです。datasize や memcmp フィルタの配列です。 memcmpの場合、比較対象はbytes、base58、base64 のいずれかに直接行きます。notifyOnを設定しても効果がありません。フィールドは後日削除されます。- フィールドは論理ANDとして動作します。
- 配列内の値は論理ORとして動作します(ただし、
filters内では論理ANDとして動作します)。
トランザクション
トランザクション
myTxSubscription)は、この特定のフィルタ設定用のユーザー定義のラベルです。accountInclude の逆です)。tokenAccounts(関連付けられたトークンアカウント)拡張です。設定すると、accountInclude ウォレットは、SPL トークン残高を所有しているトランザクションにも一致します。たとえば、ウォレットの公開鍵ではなく、そのトークンアカウントに関係する受信トークン転送が該当します。"balanceChanged"(残高差分との一致)、"all"(すべての参照、データ量は増加)、または "none"(拡張なし、デフォルト)を指定できます。SDK は文字列をワイヤーレベルの TokenAccountExpansionControlFlag 列挙型(yellowstone-grpc-proto 12.5.0 以降の一部)に変換します。機能と仕組みについては、トークンアカウント(ATA)のフィルタリングを参照してください。matchMints フラグです(デフォルトは false)。true の場合、accountInclude、accountExclude、accountRequired の各リストは、トランザクションのアカウントキーだけでなく、トランザクション前後のトークン残高に含まれるミントとも照合されます。ミントを accountInclude に追加すると、アカウントキーでそのミントを参照しない通常の SPL 転送も含め、そのトークンに関係するすべてのトランザクションを受信できます。オプトイン方式であり、既存のフィルターには影響しません。helius-laserstream 0.8.5 以降(JS)、0.6.4 以降(Rust)、または go/v0.3.0 以降(Go)が必要です。動作と例については、トークンミントのフィルタリングを参照してください。- フィールドは論理ANDとして動作します。
- 配列内の値は論理ORとして扱われます(ただし
accountRequiredではすべてが一致する必要があります)。
ブロック
ブロック
ブロックメタ
ブロックメタ
blockmetadata)は、このサブスクリプション用のユーザー定義のラベルです。現在、ブロックメタデータにはフィルタはありません。すべてのメッセージがデフォルトでブロードキャストされます。エントリ
エントリ
entrySubscribe)は、このサブスクリプション用のユーザー定義のラベルです。現時点では、エントリにフィルタはありません。すべてのエントリがブロードキャストされます。コード例 (LaserStream SDK)
- スロットの更新
- アカウントの更新
- トランザクションの更新
- ブロック
- ブロックメタデータ
- エントリ
- Unary Methods
SDK オプション
複数のプログラミング言語向けに公式 SDK を提供しています。- TypeScript: LaserStream TypeScript SDK
- Rust: LaserStream Rust SDK
- Go: LaserStream Go SDK
トラブルシューティング / FAQ
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
- JavaScript クライアントの処理遅延:処理するメッセージが多すぎる場合や、帯域幅を過剰に消費している場合、JavaScript クライアントの処理が遅れることがあります。メッセージ量を減らすためにサブスクリプションのフィルター条件を絞るか、LaserStream JavaScript SDK に切り替えるか、別の言語を使用することを検討してください。
- ローカル帯域幅の制限:負荷の高いサブスクリプションは、ネットワーク帯域幅が限られたクライアントの処理能力を超える可能性があります。ネットワーク使用量を監視し、接続のアップグレードまたはサブスクリプション範囲の縮小を検討してください。
-
地理的距離:ネットワーク経路が長いと、レイテンシーとパケットロスが増加します。サーバーに最も近いエンドポイントを使用してください。レイテンシーが高い接続では、ネットワークの読み取りバッファサイズを増やしてください(帯域幅が5倍以上向上する場合があります)。
再起動後も設定を維持するには、
/etc/sysctl.confに追加してください。フロー制御のボトルネックを防ぐため、HTTP/2 のストリームと接続の両方のウィンドウサイズを 64MB に増やしてください。両方の設定が必要です。ストリームウィンドウだけを増やしても、接続レベルのウィンドウが制約として残ります。 - クライアント側の処理ボトルネック:メッセージ処理ロジックが最適化されており、メインスレッドを長時間ブロックしないことを確認してください。
Q: I'm getting connection errors. What should I check?
Q: I'm getting connection errors. What should I check?
Q: Why aren't my filters working as expected?
Q: Why aren't my filters working as expected?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
SubscribeRequest オブジェクト内の複数のキー(accounts、transactions など)にフィルター設定を定義できます。Q: Does LaserStream support consumer groups?
Q: Does LaserStream support consumer groups?
Q: Why are my transaction log messages cut off?
Q: Why are my transaction log messages cut off?
Q: Why am I only receiving Pong responses with no account or slot data?
Q: Why am I only receiving Pong responses with no account or slot data?
SubscribeRequest に ping フィールドを含めると、LaserStream はすべてのサブスクリプションフィルターを通知なく無視します。その場合、アカウント、トランザクション、スロットのデータは一切返されず、Pong のみが返されます。修正するには、最初のサブスクライブリクエストから ping を削除し、サブスクリプションの確立後にストリームのシンクを介して ping を個別に送信してください。これにより、フィルターに干渉することなく接続を維持できます。