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 --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オブジェクトを更新します。
  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 番号)を任意で含めると、特定のスロット以降のデータをリプレイできます。現在、リプレイは過去約48時間(現在のネットワーク速度で約691,200スロット)に制限されています。約20分より前のリプレイでは、finalized のデータのみが返されることに注意してください。
enum
コミットメントレベルを指定します。指定できる値は processed、confirmed、finalized です。
array
アカウントから必要なデータスライスのみを受信できるようにする、オブジェクト { offset: uint64, length: uint64 } の配列です。
boolean
一部のクラウドプロバイダー(Cloudflare など)は、一定時間アクティビティがないとアイドル状態のストリームを閉じることがあります。フィルターを再送信せずにこれを防ぎ、接続を維持するには、true に設定します。サーバーは 15 秒ごとに Pong メッセージを返します。
次に、サブスクライブしたいデータのフィルタ(アカウント、ブロック、スロット、トランザクションなど)を指定する必要があります。
スロット更新のフィルタを定義します。使用するキー(例:mySlotLabel)は、この特定のフィルタ設定用のユーザー定義のラベルであり、必要に応じて複数の名前付き設定を定義できます(通常は1つで十分です)。
boolean
デフォルトでは、すべてのコミットメントレベルのスロットが送信されます。このフィルターを使用すると、選択したコミットメントレベルのみを受信できます。
boolean
新しいスロットの開始時だけでなく、スロット内の変更に関する更新も受信するサブスクリプションを有効にします。よりきめ細かく低レイテンシーなスロットデータを取得する場合に便利です。
アカウントデータ更新のフィルタを定義します。使用するキー(例:tokenAccounts)は、この特定のフィルタ設定用のユーザー定義のラベルです。
array
提供された配列から任意の公開鍵に一致します。
array
アカウントオーナーの公開鍵。提供された配列から任意の公開鍵に一致します。
array
getProgramAccountsのフィルタに類似。このフィルタは、datasize や memcmp フィルタの配列です。 memcmpの場合、比較対象はbytes、base58、base64 のいずれかに直接行きます。
enum
非推奨
非推奨 — Agave 4.2以降は効果なし。 notifyOnを設定しても効果がありません。フィールドは後日削除されます。
すべてのフィールドが空の場合、すべてのアカウントがブロードキャストされます。それ以外の場合は以下のようになります:
  • フィールドは論理ANDとして動作します。
  • 配列内の値は論理ORとして動作します(ただし、filters内では論理ANDとして動作します)。
10,000以上のアカウントを追跡していますか? 明示的なパブリックキーペアリスト(アカウントごとに32バイト)を使用する代わりに、圧縮されたcuckooフィルタ(アカウントごとに約3-4バイト)を使用して、1つのストリームで何十万ものアカウントをサブスクライブできます。RustおよびJavaScript SDKで利用可能です。
トランザクション更新のフィルタを定義します。使用するキー(例:myTxSubscription)は、この特定のフィルタ設定用のユーザー定義のラベルです。
boolean
投票トランザクションの配信を有効または無効にします。
boolean
失敗したトランザクションの配信を有効または無効にします。
string
指定した署名に一致するトランザクションのみを配信します。
array
指定されたリスト内のいずれかのアカウントが関係するトランザクションをフィルタリングします。
array
指定されたリスト内のいずれかのアカウントが関係するトランザクションを除外します(accountInclude の逆です)。
array
指定されたリスト内のすべてのアカウントが関係するトランザクションをフィルタリングします(すべてのアカウントが使用されている必要があります)。
string
オプションの tokenAccounts(関連付けられたトークンアカウント)拡張です。設定すると、accountInclude ウォレットは、SPL トークン残高を所有しているトランザクションにも一致します。たとえば、ウォレットの公開鍵ではなく、そのトークンアカウントに関係する受信トークン転送が該当します。"balanceChanged"(残高差分との一致)、"all"(すべての参照、データ量は増加)、または "none"(拡張なし、デフォルト)を指定できます。SDK は文字列をワイヤーレベルの TokenAccountExpansionControlFlag 列挙型(yellowstone-grpc-proto 12.5.0 以降の一部)に変換します。機能と仕組みについては、トークンアカウント(ATA)のフィルタリングを参照してください。
boolean
オプションの 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ではすべてが一致する必要があります)。
ブロック更新のフィルタを定義します。使用するキー(例:myBlockLabel)は、この特定のフィルタ設定用のユーザー定義のラベルです。
array
指定されたリスト内のいずれかのアカウントが関係するトランザクションとアカウントをフィルタリングします。
boolean
すべてのトランザクションを配信に含めます。
boolean
すべてのアカウント更新を配信に含めます。
boolean
すべてのエントリを配信に含めます。
これはブロックに似ていますが、トランザクション、アカウント、およびエントリを除外します。使用するキー(例: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 オブジェクト内の複数のキー(accounts、transactions など)にフィルター設定を定義できます。
A: コンシューマーグループは実装していません。その代わりに、LaserStream は、調整レイヤー(およびそれに伴うレイテンシーやオーバーヘッド)なしで、チームが求める再開、リプレイ、複数ノードによる信頼性を実現します。ほとんどのワークロードにはコンシューマーグループは不要であり、レイテンシーと運用上のオーバーヘッドが増えると考えています。たとえば、単一の LaserStream gRPC 接続で Solana のトランザクションデータとアカウントデータの合計量の最大10倍を送出でき、ほとんどのクライアントはフィルターされたごく一部のデータのみをサブスクライブします。この場合にコンシューマーグループを使用すると、パフォーマンスの余力を消費し、障害点がさらに1つ増えます。
A: LaserStream は、速度とパフォーマンスを向上させるため、デフォルトでトランザクションログメッセージを 10 KB で切り詰めます。完全なログが必要な場合は、切り詰めを行わない専用エンドポイントに接続してください。一覧については、ログの切り詰めを参照してください。
A: 最初の SubscribeRequest に ping フィールドを含めると、LaserStream はすべてのサブスクリプションフィルターを通知なく無視します。その場合、アカウント、トランザクション、スロットのデータは一切返されず、Pong のみが返されます。修正するには、最初のサブスクライブリクエストから ping を削除し、サブスクリプションの確立後にストリームのシンクを介して ping を個別に送信してください。これにより、フィルターに干渉することなく接続を維持できます。