Skip to main content
Sender Max (最小チップ: 0.001 SOL) を使用して Preconfirmations に対処します。 Preconfirmation は、取引が最初に届いた場合にのみ効果を発揮します — Sender Max はそれを達成するための最速の方法です。最初から Sender Max を活用して、Preconfirmations の完全な利益を得ましょう。

preconfSubscribeとは何ですか?

preconfSubscribe は、Preconfirmations(エントリにまとめられて shred に分割される前に配信されるトランザクション)をストリーミングする Helius WebSocket メソッドです。これは、Helius が提供するトランザクションシグナルの中で最もレイテンシが低いものです。1 つのサブスクリプションで、リーダーがトランザクションを実行した瞬間に送信され、その実行ステータスを含む Helius Preconfirmations と、Jito の Block Assembly Marketplace クライアントを実行するバリデータから、バリデータがトランザクションの実行を確約した時点で送信される BAM Preconfirmations の両方が配信されます。すべての有料プランで利用できます。詳しくは料金をご覧ください。
ストリームは継続的ではありません。Helius にステークを転送するか、BAM を実行しているシェアに応じてカバレッジが拡大しますので、メッセージのないスロットが予想されます—これらのギャップをうまく処理してください。カバレッジをご覧ください。
preconfSubscribeは、wss://beta.helius-rpc.comから提供されます—スケジュールされたトランザクションのソースであるHelius Gatekeeperエンドポイント—ではなく、mainnet.helius-rpc.comです。クエリパラメーターとしてAPIキーで認証してください。
beta ホスト名は、Gatekeeper の導入を指します。 Preconfirmations の成熟度ではありません。Preconfirmations は最初に Gatekeeper エンドポイントで開始されます。Helius がトラフィックを Gatekeeper に移行するにつれて、標準エンドポイントになります。

購読

preconfSubscribe メソッドを使用してJSON-RPCリクエストを送信します。サーバーはサブスクリプションIDで応答し、その後、各トランザクションの通知をストリームします。オプションのフィルタを最初の params 要素として渡して、マッチするトランザクションのみを受け取ります。params を省略すると、HeliusとBAMの両方からの完全なストリームを受け取ります。

購読応答

resultを保存します—これは購読解除に使用する購読IDです。この確認後、通知はバイナリフレームとしてストリームされます(以下参照)。

フィルタリング

デフォルトでは、preconfSubscribe は両方のソースからすべてのトランザクションをストリームします。ストリームを絞り込むには、フィルタオブジェクトを params の最初の要素として渡します。フィルタリングはサーバー側で行われるため、関心のあるトランザクションのみを受け取り、支払うことになります。
すべてのフィールドはオプションです — フィールドが欠けている場合、その述語に対して「制約なし」を意味します。したがって、空のフィルター(または params がない場合)は、両方のソースからのすべてのトランザクションに一致します。 フィルタールール:
  • すべての述語は AND で結合され、includeSource → failed → regionInclude → signatures → accountExclude → accountRequired → accountInclude → signerExclude → signerInclude → instructions の順に評価されます。
  • ステータスが不明な BAM 事前確認では、failed フィルターが無視されます。ステータスが不明な Helius 事前確認は、明示的な failed フィルターに一致しません。
  • includeSource は、helius と bam のみを含む配列である必要があります。無効な値を指定すると、JSON-RPC エラー -32602(無効なパラメーター)が返されます。
  • アカウントは base58 でエンコードされた公開鍵です。無効な値を指定すると、JSON-RPC エラー -32602(無効なパラメーター)が返されます。
  • 各アカウントまたは署名者リストの上限は 10,000 エントリです。signatures の上限は 1,000 エントリです。
非推奨の includeBam フィルターは、後方互換性のため引き続き利用できます。 includeBam: false は includeSource: ["helius"] と同じです。includeBam: true を指定するか、 フィールドを省略すると、両方のソースが選択されます。includeBam と includeSource を同時に送信しないでください。
Helius 事前確認のみを受信するには、次のようにします。

署名者と署名のフィルタリング

特定のアカウントによって署名されたトランザクションに一致させるには、signerInclude を使用します。リスト内のいずれかのアカウントによって署名されたトランザクションを除外するには、signerExclude を使用します。参照されているだけのアカウントは署名者として扱われません。 追跡するトランザクションがすでに分かっている場合は、signatures を使用します。このフィルターは、Solana RPC メソッドで使用されるトランザクションの最初の署名と一致します。サブスクライブ後にフィルターを変更することはできないため、新しい署名を追跡するには新しいサブスクリプションを作成してください。

命令のフィルタリング

プログラムと命令データに基づいてトップレベル命令を照合するには、instructions を使用します。各命令フィルターでは、次のフィールドを使用できます。 各 memcmp エントリでは、base58、base64、または hex エンコーディングを使用できます。デフォルトは base58 です。いずれかの命令フィルターのすべての条件を、1 つのトップレベル命令が満たすと、トランザクションは一致します。 次のリクエストは、Anchor ディスクリミネーターに基づいて pump.fun の buy 命令を照合します。
このフィルターが確認するのはトップレベル命令のみです。クロスプログラム呼び出し(CPI)を介して呼び出される命令は実行前には存在しないため、一致させることはできません。 最大 16 個の命令フィルターを指定でき、各命令フィルターには最大 4 個の memcmp エントリを指定できます。各 memcmp 値は、デコード後に 1~128 バイトである必要があります。memcmp の終了オフセットと dataSize は 4,096 バイトを超えてはなりません。

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

アカウントフィルターは、トランザクションの静的アカウントキーだけでなく、それ以外にも一致します。Helius は v0 のアドレスルックアップテーブルをサーバー側で解決するため、accountInclude、accountExclude、および accountRequired は、トランザクションが ALT を介して読み込むアカウントにも一致します。 つまり、ルックアップテーブル経由でのみ現れるアカウントであっても、トランザクションがアクセスする任意のアカウントをフィルタリングできます。ALT のマッピングを維持したり、自分でテーブルを解決したりする必要はありません。アカウントの公開鍵を渡すだけで、フィルターが適用される前に Helius が解決します。

ロケーションのフィルタリング

特定のリージョンから発生したトランザクションのみを受信するには、regionInclude を使用します。1 つ以上のリージョンコードを渡します。トランザクションの発生元リージョンがそのいずれかと一致すると、フィルターを通過します。
発生元リージョンはソースによって異なります。Helius 事前確認の場合は、トランザクションを取り込んだ Helius リージョンです。BAM 事前確認の場合は、Helius が取り込んだ場所ではなく、事前確認を発行した地域別 BAM エンドポイントです。BAM のシンガポールおよびダラスのエンドポイントは、sgp および dal にマッピングされます。 有効なリージョンコード:
regionInclude を設定すると、リージョン情報を持たないトランザクションは破棄されます。認識されないリージョンコードを指定すると、JSON-RPC エラー -32602(無効なパラメーター)が返されます。

通知ペイロード

通知は JSON ではなく、バイナリ WebSocket フレームとして配信されます。Helius と BAM の事前確認は同じレイアウトを共有します。各フレームは、単一のトランザクションを格納したパック済みバイトレイアウトです。 ペイロードにはソースフィールドがありません。他のソースも 0 を報告する場合があるため、tx_index = 0 から BAM が発生元だと推測しないでください。

2 つのソースの見分け方

ソースフィールドがないため、任意のメッセージを Helius または BAM と分類することはできません。status バイトは、次のように一方向の分類に使用できます。
  • status が 0 または 1 — メッセージは Helius 事前確認であり、トランザクションは実行済みです。BAM がこれらの値を報告することはありません。
  • status が 2 — ソースは特定できません。BAM 事前確認、または実行ステータスを取得できなかった Helius 事前確認のいずれかです。
ほかに判別に使えるフィールドはありません。BAM のシーケンス ID とバンドル内の位置はこのストリームには含まれないため、判定に使える BAM の順序メタデータはありません。また、regionInclude はペイロードフィールドではなくサブスクリプションフィルターであるため、メッセージごとに読み取ることはできません。 ストリーム上のすべてのメッセージに同じ種類の根拠を持たせる必要がある場合は、includeSource: ["helius"] または includeSource: ["bam"] を設定します。Helius 専用ストリームには、リーダーによる実行時に発行された事前確認が含まれます。
必ず最初に version バイトを読み取り、確認してください。 現在は 1 です。 Helius がペイロード形式を更新する必要がある場合、バージョンが増加します。スキーマが変更されても デコーダーが動作し続けるように、この値に基づいて分岐してください。
事前確認は早期シグナルであり、保証ではありません。トランザクションはまだ オンチェーンに取り込まれておらず、破棄される可能性があります。また、Helius 事前確認の 実行ステータスはリーダーのローカル結果を反映したもので、ブロックが確認されるまでは 確定ではありません。確定済みとして扱う前に、標準のコミットメントチェックで 取り込みを確認してください。

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

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

重複通知

Helius と BAM の事前確認は、ソースごとに重複排除されますが、ソース間では重複排除されません。一部のトランザクションは両方を経由して Helius に到達するため、同じ署名を 2 回受信する場合があり、2 つのコピーが異なるスロットを報告することもあります。 クライアント側で署名に基づいて重複を排除し、トランザクションをトリガーとするアクションを冪等にしてください。これにより、2 回目の通知で同じアクションが再度実行されることを防げます。標準のコミットメントチェックで実行と取り込みを確認してください。

例

サブスクリプションの解除

通知の受信を停止するには、preconfSubscribe から返されたサブスクリプション ID を指定して preconfUnsubscribe を呼び出します。

料金

Preconfirmations は、Developer、Business、Professional、Enterprise のすべての有料プランで利用できます。無料プランは対象外です。詳しくはクレジットをご覧ください。 Preconfirmations のカバレッジがあるスロットでも、配信メッセージが 0 件の場合、クレジットは消費されません。スロットで 1 件以上のメッセージが配信された場合、開いている各 preconfSubscribe サブスクリプションには、300 クレジットまたは配信メッセージ 1 件あたり 10 クレジットのいずれか大きい方が請求されます。 カバレッジ対象外のスロットでは、クレジットは消費されません。ソースおよびリージョンごとの課金対象条件については、料金をご覧ください。 同時実行される各サブスクリプションは、1 件以上のメッセージを受信すると、それぞれ個別に課金されます。不要になったサブスクリプションは preconfUnsubscribe で閉じてください。includeSource: ["helius"] を使用すると、BAM のみがカバレッジ対象となるスロットは課金対象から除外されます。regionInclude を設定した場合、選択したリージョン以外のカバレッジ対象スロットでは、そのサブスクリプションのクレジットは消費されません。条件に一致するスロットは、サブスクリプションが 1 件以上のメッセージを受信した場合にのみ課金されます。 請求は一意の署名単位ではなく、メッセージ単位です。Helius と BAM の両方から配信されたトランザクションは 2 回分として計算されます。Helius 事前確認のみが必要な場合は、includeSource: ["helius"] を設定してください。
コストを抑えるには、可能な場合はアカウントフィルタを 1 つのサブスクリプションにまとめ、regionInclude を使用して課金対象を必要なリージョンに限定し、BAM が不要な場合は includeSource: ["helius"] を設定してください。また、Helius Dashboardでクレジットを監視してください。
Preconfirmations は新しい製品であり、料金は変更される場合があります。

関連情報

Preconfirmations Overview

Preconfirmations の概要と、バリデータパイプライン内での位置付けについて説明します。

transactionSubscribe

豊富なフィルタリング機能を使用して、confirmed コミットメントのトランザクションをストリーミングします。

preconfSubscribe API reference

リクエストパラメータ、フィルタフィールド、バイナリ通知のレイアウトについて説明します。