Skip to main content
公開ベータ版。 preprocessedSubscribe は すべての有料プラン で利用可能で、 1 メッセージにつき 0.1 クレジット で計測されます(配信されるトランザクションには 1 メッセージ)。

preprocessedSubscribe とは?

preprocessedSubscribeは、Helius WebSocketメソッドであり、前処理されたトランザクションをストリーム配信します。これは、processedコミットメントレベルに到達する前に提供される実行前のSolanaトランザクションです。Heliusは、主にバリデーターに到着すると直接デコードされるシュレッドと、事前確認 信号によって補完される複数の実行前ソースを集約し、デシュレッドインフラストラクチャなしに単一の重複排除されたコンパクトなバイナリメッセージのストリームとして提供します。 予備確認シグナルからのトランザクションは、専用の予備確認製品よりもこのフィードに遅れて到着しますが、それでも最初にアクセスできます。 これは以前の前処理されたLaserStream(gRPC)製品の後継です。現在gRPCで前処理トランザクションを使用している場合、この方法に切り替えてください。これは通常のWebSocket接続を介して低遅延で同じクラスのデータを提供し、gRPC配送は廃止されます。
preprocessedSubscribe は ベストエフォート方式の実行前シグナル であり、 コミットメントレベルではありません。ストリームされたトランザクションは失敗したり、ドロップされたり、 異なるフォークに着陸したりする可能性があります。最終的なものとして扱う前に、処理済みまたは確認済みの ストリームと照合してください。

エンドポイント

preprocessedSubscribe は wss://beta.helius-rpc.com — Helius ゲートキーパ―エンドポイント — から提供されます。 mainnet.helius-rpc.com ではありません。API キーをクエリパラメータとして 認証してください。
各 API キーは 10 の同時接続/サブスクリプション に制限されています。

購読

preprocessedSubscribe メソッドを使用して JSON-RPC リクエストを送信します。 params はアカウントフィルターを含み必要です — accountInclude と accountRequired は、それらの間で少なくとも 1 つのアカウントを指定する必要があります(フィルタリングを参照):
サーバーは、サブスクリプション ID を含む JSON テキストフレームでサブスクリプションを確認します:
この確認の後、トランザクションの更新は バイナリ WebSocket フレームとして到着します — 通知ペイロード を参照してください。

フィルタリング

すべてのサブスクリプションは params 内のアカウントフィルターによってスコープされます。フィルタリングはサーバー側で行われるため、必要なトランザクションのみを受け取ります:
フィルタルール:
  • 三つのフィルターは AND ロジックで結合されます。
  • accountInclude と accountRequired は、 それらの間で少なくとも1つのアカウントを指定する必要があります—無フィルターの完全なストリームはありません。
  • アカウントは base58 エンコードされたパブキーです。各リストは最大 5,000 のアドレスを受け入れます。

アドレスルックアップテーブル (ALT) の解決

アカウントフィルターはトランザクションの静的アカウントキー以上に一致します — Helius はアドレスルックアップテーブルをサーバー側で解決するため、 accountInclude、accountExclude、 accountRequired も ALT を通じてロードされるアカウントに一致します。 アカウントのパブキーを渡すだけで、ALT マッピングの管理やテーブルの解決を自分で行う必要はありません。

通知ペイロード

通知は バイナリ WebSocket フレームとして配信されます(JSON ではありません)。 各フレームには、パックされたバイトレイアウトで単一のトランザクションが含まれています: 固定された73バイトのプレフィックスを順に読み、残りのバイトをデコードしてインストラクション、アカウント、アドレステーブルのルックアップを読みます。署名はプレフィックスに含まれているため、トランザクション全体のボディをデコードせずに、トランザクションを識別し重複排除することができます。 最初に version バイトを読み取り、確認してください。Helius がペイロード形式を更新する必要がある場合、バージョンは増加します — スキーマ変更にわたってデコーダーが動作し続けるようにそれに基づいて分岐してください。

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

トランザクションのバイトは、ネットワーク上で観測された通りに、トランザクションのバージョンに合わせた標準的なワイヤエンコーディングで転送されます。レガシーとv0トランザクションはbincodeが生成する署名優先のレイアウトを使用します。トランザクションv1(SIMD-0385)は、署名を末尾に配置したメッセージ優先のレイアウトを使用するため、bincodeはv1ペイロードでは失敗します。すべてのバージョンに対応するデコーダを使用してください:
  • Rust: agave-transaction-view は、中間コピーを行わずにレガシー、v0、およびv1トランザクションをその場で解析します。これが推奨されるオプションです。wincode は、現在のSolana SDKで使用されているbincode互換のシリアライザで、v1をVersionedTransactionにデコードします。
  • JavaScript / TypeScript: 使用するライブラリのバージョンがトランザクションv1をサポートしていることを確認してください。古いVersionedTransaction.deserializeの実装は、レガシーおよびv0のみを処理します。@solana/kit 8.0+ または @solana/web3.js v3を使用してください。トランザクションv1のサポートを参照してください。

例

どのデータが利用可能か?

各通知には、署名されたトランザクション、その最初の署名、およびそのスロットが含まれています。配信は実行の前に行われるため、ストリームには含まれません:
  • 実行ステータスやエラー
  • プレ/ポストバランスやトークンバランスの変化
  • ログメッセージや内部命令
  • 消費された計算ユニット
これは「提案」を受け取るが「結果」は受け取らないと考えてください。送信者が試みたことは見られるが、実際に何が起こったかはわかりません。この段階ではアカウントやプログラムの状態更新はまだ存在しません。リアルタイムのアカウント状態が必要な場合は、LaserStream gRPCをprocessedコミットメントで使用してください。

バックプレッシャー

ストリームは低速な消費者のために無期限にバッファリングしません。クライアントが読み取りを過剰に遅くし、4,000メッセージを超えてサーバー側でバックアップが発生すると、Heliusは接続を閉じ、クリーンなWebSocketのクローズフレームを受け取ります。到着するフレームよりも早くフレームを処理してください:取引のデコードや戦略ロジックといった重い作業は受信ループから外して行い、切断後には再接続して再購読してください。

配信の保証

配信はベストエフォートであり、保証はされませんし、履歴のリプレイも提供されません。クライアントは以下を行う必要があります:
  1. 接続が切断されたら再接続して再購読する。
  2. トランザクション署名で重複を排除する。
  3. スロットを観測結果とし、終了とは見なさない。
  4. 実行結果が重要な場合、処理済みまたは確認済みストリームに対して整合をとる。

料金

preprocessedSubscribeはすべての有料プランで利用可能で、メッセージごとに0.1クレジットが計量されます — 配信されたトランザクションごとに1メッセージがプランから請求されます。詳細はクレジットをご覧ください。

関連

Preconfirmations

シュレッドになる前にストリームされたトランザクション - 最も早いトランザクションシグナル。

Raw Shreds (UDP)

UDPを介した未処理のシュレッドパケット。デシュレッド化を実装します。

transactionSubscribe

豊富なフィルタリングと実行メタデータを持つ実行後のトランザクション。