> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# preprocessedSubscribe の使用方法

> WebSocket を介して preprocessedSubscribe メソッドで実行前の Solana トランザクションをストリームします。アカウントでフィルターし、処理済みのコミットメントの前にバイナリペイロードをデコードします。

<Note>
  **公開ベータ版。** `preprocessedSubscribe` は **すべての有料プラン** で利用可能で、
  **1 メッセージにつき 0.1 クレジット** で計測されます（配信されるトランザクションには 1 メッセージ）。
</Note>

## `preprocessedSubscribe` とは？

`preprocessedSubscribe` は、Helius の WebSocket メソッドであり、実行前の Solana トランザクションをストリームする方法です — **`processed` のコミットメントレベルに到達する前に** 配信されます。Helius は複数の実行前ソースを集約し、主にバリデータに到着した際に直接デコードされるシュレッドにより補完され、予約されたトランザクション（[予備確認](/docs/ja/pre-confirmations/overview)）のシグナルをシングルデデュープされたコンパクトなバイナリメッセージとして配信します。

予備確認シグナルからのトランザクションは、専用の[予備確認](/docs/ja/pre-confirmations/overview)製品よりもこのフィードに遅れて到着しますが、それでも最初にアクセスできます。

これは以前の処理済み LaserStream プロダクトの後継です。本日 [gRPC 経由で処理済みトランザクション](/docs/ja/preprocessed-transactions/grpc)を利用する場合は、このメソッドに切り替えてください — より低遅延で同じデータクラスを通常の WebSocket 接続で提供し、gRPC 配信は廃止されます。

| ストリーム                                                                            | 相対的なタイミング                  | カバレッジ                          | データ                |
| -------------------------------------------------------------------------------- | -------------------------- | ------------------------------ | ------------------ |
| [予備確認](/docs/ja/pre-confirmations/overview)                                           | 最も早い                       | 参加するバリデータによってスケジュールされたトランザクション | トランザクションと予備確認ステータス |
| `preprocessedSubscribe`                                                          | 一般的に予備確認の後、`processed`  の前 | 広範な Solana トランザクションカバレッジ       | 実行前の署名済みトランザクション   |
| [`transactionSubscribe`](/docs/ja/rpc/websocket/transaction-subscribe) at `processed` | 実行後                        | 処理済みトランザクション                   | 実行メタデータ付きトランザクション  |

<Warning>
  `preprocessedSubscribe` は **ベストエフォート方式の実行前シグナル** であり、
  コミットメントレベルではありません。ストリームされたトランザクションは失敗したり、ドロップされたり、
  異なるフォークに着陸したりする可能性があります。最終的なものとして扱う前に、処理済みまたは確認済みの
  ストリームと照合してください。
</Warning>

## エンドポイント

`preprocessedSubscribe` は `wss://beta.helius-rpc.com` — Helius ゲートキーパ―エンドポイント — から提供されます。
`mainnet.helius-rpc.com` ではありません。API キーをクエリパラメータとして
認証してください。

```
wss://beta.helius-rpc.com/?api-key=<API_KEY>
```

各 API キーは **10 の同時接続/サブスクリプション** に制限されています。

## 購読

`preprocessedSubscribe` メソッドを使用して JSON-RPC リクエストを送信します。
`params` はアカウントフィルターを含み必要です —
`accountInclude` と
`accountRequired` は、それらの間で少なくとも
1 つのアカウントを指定する必要があります（[フィルタリング](#フィルタリング)を参照）：

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "preprocessedSubscribe",
  "params": {
    "accountInclude": ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
    "accountExclude": [],
    "accountRequired": []
  }
}
```

サーバーは、サブスクリプション ID を含む JSON テキストフレームでサブスクリプションを確認します：

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "result": 1,
  "id": 1
}
```

この確認の後、トランザクションの更新は **バイナリ** WebSocket フレームとして到着します — [通知ペイロード](#通知ペイロード) を参照してください。

## フィルタリング

すべてのサブスクリプションは `params` 内のアカウントフィルターによってスコープされます。フィルタリングはサーバー側で行われるため、必要なトランザクションのみを受け取ります：

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "preprocessedSubscribe",
  "params": {
    "accountInclude": ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
    "accountExclude": ["Vote111111111111111111111111111111111111111"],
    "accountRequired": []
  }
}
```

| フィルタ              | マッチング動作                                   |
| ----------------- | ----------------------------------------- |
| `accountInclude`  | トランザクションがリストされた任意のアカウントを参照する場合にマッチします。    |
| `accountExclude`  | トランザクションがリストされた任意のアカウントを参照する場合はドロップされます。  |
| `accountRequired` | トランザクションがリストされたすべてのアカウントを参照する場合にのみマッチします。 |

フィルタルール：

* 三つのフィルターは AND ロジックで結合されます。
* `accountInclude` と `accountRequired` は、
  それらの間で**少なくとも1つのアカウント**を指定する必要があります—無フィルターの完全なストリームはありません。
* アカウントは base58 エンコードされたパブキーです。各リストは最大 **5,000** のアドレスを受け入れます。

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

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

## 通知ペイロード

通知は **バイナリ** WebSocket フレームとして配信されます（JSON ではありません）。
各フレームには、パックされたバイトレイアウトで単一のトランザクションが含まれています：

| バイト  | フィールド         | タイプ                             | 説明                              |
| ---- | ------------- | ------------------------------- | ------------------------------- |
| 0    | `version`     | `u8`                            | ペイロードスキーマバージョン。現在は `1` です。      |
| 1–8  | `slot`        | `u64` (リトルエンディアン)               | トランザクションが観測されたスロットです。           |
| 9–72 | `signature`   | 64 バイト                          | バイナリ形式のトランザクションの最初の署名。          |
| 73+  | `transaction` | `bincode(VersionedTransaction)` | 署名済みのトランザクション、bincode シリアライズ済み。 |

73 バイトの固定プリフィックスを順番に読み、残りのバイトを[`bincode`](https://docs.rs/bincode) でデシリアライズして、
`VersionedTransaction` を読み込み、命令、アカウント、アドレステーブルルックアップを読み取ります。署名はプリフィックスに含まれているため、
トランザクション本体をデコードせずにトランザクションを特定して重複排除できます。

最初に `version` バイトを読み取り、確認してください。Helius がペイロード形式を更新する必要がある場合、バージョンは増加します —
スキーマ変更にわたってデコーダーが動作し続けるようにそれに基づいて分岐してください。

## 例

```javascript theme={"system"}
const WebSocket = require('ws');
const bs58module = require('bs58');
const bs58 = bs58module.default ?? bs58module;

const ws = new WebSocket('wss://beta.helius-rpc.com/?api-key=<API_KEY>');

ws.on('open', () => {
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'preprocessedSubscribe',
    // Only Jupiter v6 transactions — accountInclude/accountRequired must
    // specify at least one account between them.
    params: {
      accountInclude: ['JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4'],
      accountExclude: [],
      accountRequired: []
    }
  }));

  // Keep the connection alive
  setInterval(() => ws.ping(), 30_000);
});

ws.on('message', (data, isBinary) => {
  // The subscribe acknowledgement arrives as a JSON text frame
  if (!isBinary) {
    const msg = JSON.parse(data.toString());
    if (msg.id === 1) console.log('Subscribed, ID:', msg.result);
    return;
  }

  // Notifications arrive as binary frames:
  // version (u8) | slot (u64 LE) | signature ([u8; 64]) | bincode(VersionedTransaction)
  const buf = Buffer.from(data);
  const version = buf.readUInt8(0); // currently 1 — branch on this if it changes
  if (version !== 1) return; // unknown schema version; update your decoder
  const slot = buf.readBigUInt64LE(1);
  const signature = bs58.encode(buf.subarray(9, 73));
  const txBytes = buf.subarray(73); // bincode-serialized VersionedTransaction

  console.log('Preprocessed transaction:', { slot, signature, bytes: txBytes.length });
  // Deserialize txBytes (bincode) into a VersionedTransaction with your Solana tooling
});

ws.on('error', console.error);
ws.on('close', () => process.exit(1));
```

## どのようなデータが利用可能か？

各通知には、署名済みのトランザクション、その最初の署名、およびそのスロットが含まれます。配信は実行前に行われるため、ストリームには以下が含まれません：

* 実行ステータスやエラー
* 実行前/後のバランスやトークンバランスの変化
* ログメッセージや内部命令
* 消費された計算ユニット

これは「提案」を受け取るようなもので、実際に何が起こったかではなく、送信者が何をしようとしたかを確認できます。この段階ではアカウントとプログラムの状態更新もまだ存在しません。リアルタイムのアカウント状態が必要な場合は、[LaserStream gRPC](/docs/ja/laserstream)を
`processed` コミットメントで使用してください。

## バックプレッシャー

ストリームは遅い消費者のために無期限にバッファリングしません。クライアントが遅く読み取り、サーバー側で **4,000 メッセージ** 以上がバックアップされる場合、Helius は接続を閉じます—
クリーンな WebSocket クローズフレームを受け取ります。フレームが到着するよりも速くドレインする：
トランザクションのデコードや戦略ロジックなどの重い作業を受信ループから外し、切断後に再接続および再サブスクリプションを行います。

## 配信保証

配信はベストエフォートであり、保証されていません。履歴再生もありません。クライアントは次のことを行うべきです：

1. 接続が閉じた後に再接続および再サブスクリプションする。
2. トランザクション署名で重複を排除する。
3. スロットを観測として扱い、最終的なものとして扱わない。
4. 実行結果が重要な場合は、処理済みまたは確認済みのストリームと照合する。

## 価格設定

`preprocessedSubscribe` は **すべての有料プラン** で利用可能で、
**1 メッセージにつき 0.1 クレジット** で計測されます — 配信されたトランザクションあたり1メッセージ、
プランから課金されます。[クレジット](/docs/ja/billing/credits) を参照してください。

## 関連

<CardGroup cols={2}>
  <Card title="処理済みトランザクション (gRPC)" icon="binary" href="/docs/ja/preprocessed-transactions/grpc">
    同じ実行前データを gRPC 経由で。将来このメソッドが優先されて廃止されます。
  </Card>

  <Card title="予備確認" icon="bolt" href="/docs/ja/pre-confirmations/overview">
    シュレッドになる前にストリームされた予約されたトランザクション—最も早いトランザクションシグナル。
  </Card>

  <Card title="生のシュレッド (UDP)" icon="network-wired" href="/docs/ja/shred-delivery/raw-shreds">
    UDP 経由の未処理のシュレッドパケット。デシュレディングを実装します。
  </Card>

  <Card title="transactionSubscribe" icon="tower-broadcast" href="/docs/ja/rpc/websocket/transaction-subscribe">
    リッチなフィルタリングと実行メタデータを含む実行後のトランザクション。
  </Card>
</CardGroup>
