> ## 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.

# 事前処理されたトランザクションでの取引

> 事前処理されたトランザクションを使用して、プログラムのSolanaトランザクションが処理済みコミットメントレベルに達する前に監視します。

`preprocessedSubscribe` は署名されたトランザクションを `processed` コミットメントレベルに達する前にストリームするため、デシュレッディングのインフラを必要とせずに、トランザクションがバリデータに届くときにシュレッドからデコードされます。

このガイドでは、取引プログラムを実行前に監視し、フィードを重複排除し、サーバーのバックプレッシャー制限内に留まり、処理済みデータと照合してから実行するモニターを構築します。

<Tip>
  [事前処理されたトランザクション](/docs/ja/preprocessed-transactions/overview)はすべての有料プランで利用でき、1メッセージあたり0.1クレジットがかかり、1つのAPIキーで最大10の同時接続が可能です。
</Tip>

## サブスクリプションをターゲットに絞る

フィルターされていないストリームはありません：`accountInclude` と `accountRequired` は少なくとも1つのアカウントをその間に指定する必要があります。取引モニターでは、取引するプログラムを含め、余計なノイズを除外してください。そうしないと余計なコストがかかります：

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

フィルターはANDで組み合わせられ、各リストは最大5,000のアドレスを受け入れ、Heliusはサーバー側でアドレスのルックアップテーブルを解決するため、ALTを通じてロードされたアカウントも一致します。特定のウォレットとプログラムとのインタラクションを監視するには、両方を`accountRequired`フィールドに入れます。

## フレームをデコードし、署名で重複排除

通知はバイナリフレームとして届きます：73バイトのプレフィックスに続いて、bincodeでシリアル化されたトランザクションです。プレフィックスに署名が含まれているため、本体をデコードせずに重複排除できます。このストリームは複数の実行前ソースを集約しており、同じトランザクションが複数回届くことがあります：

```javascript monitor.js 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=YOUR_API_KEY');
const seen = new Set(); // rotate or expire entries in production
const queue = [];       // decode off the receive path; see next step

ws.on('open', () => {
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'preprocessedSubscribe',
    params: {
      accountInclude: ['JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4'],
      accountExclude: ['Vote111111111111111111111111111111111111111'],
      accountRequired: []
    }
  }));
  setInterval(() => ws.ping(), 30_000);
});

ws.on('message', (data, isBinary) => {
  if (!isBinary) {
    const msg = JSON.parse(data.toString());
    if (msg.id === 1) console.log('Subscribed, ID:', msg.result);
    return;
  }

  // version (u8) | slot (u64 LE) | signature ([u8; 64]) | bincode(VersionedTransaction)
  const buf = Buffer.from(data);
  if (buf.readUInt8(0) !== 1) return; // unknown schema version; update your decoder
  const signature = bs58.encode(buf.subarray(9, 73));
  if (seen.has(signature)) return;
  seen.add(signature);

  queue.push({
    slot: buf.readBigUInt64LE(1),
    signature,
    txBytes: buf.subarray(73)
  });
});

ws.on('error', console.error);
ws.on('close', () => process.exit(1)); // supervisor restarts and resubscribes
```

## 受信ループをストリームより速く保つ

Heliusは遅い消費者に無期限にバッファリングしません：サーバー側で4,000以上のメッセージがバックアップされた場合、接続は終了されます。そのため、上記のハンドラは73バイトのプレフィックスのみを読み取り、エンキューするという仕様です。

デシリアライズと戦略ロジックは別のループで実行されます：

```javascript theme={"system"}
setImmediate(async function drain() {
  const { VersionedTransaction } = require('@solana/web3.js');
  while (true) {
    const item = queue.shift();
    if (!item) { await new Promise(r => setTimeout(r, 1)); continue; }
    const tx = VersionedTransaction.deserialize(item.txBytes);
    strategy.onPreExecution(item.slot, item.signature, tx);
  }
});
```

もしキューが無限に成長する場合は、フィルターを強化してください。クライアント側で破棄するトランザクションも、1件あたり0.1クレジットがかかり、バックプレッシャー制限にカウントされます。

## 処理済みデータと照合

事前処理されたトランザクションは、送信者が何をしようとしたかを示しますが、実際に何が起こったかは示しません。実行ステータス、残高変動、ログは含まれておらず、失敗したり、ドロップされたり、異なるフォークに着陸することがあります。配信は最善の努力で行われ、履歴のリプレイはないため：

* あなたの戦略が何かを事実として記録する前に、[`transactionSubscribe`](/docs/ja/rpc/websocket/transaction-subscribe)で `processed` または `confirmed` コミットメントと照合します。
* 切断時には、隙間を受け入れながらただちに再サブスクライブしてください。バックフィルするリプレイがないためです。
* 取引の意図ではなく、リアルタイムのアカウント状態が必要な場合、それは実行後にのみ存在します：[LaserStream gRPC](/docs/ja/laserstream)を`processed`で使用してください。

## 関連ガイド

<CardGroup cols={2}>
  <Card title="preprocessedSubscribe リファレンス" icon="code" href="/docs/ja/preprocessed-transactions/preprocessed-subscribe">
    完全なペイロードレイアウト、フィルタールール、バックプレッシャー、そして価格設定
  </Card>

  <Card title="事前確認での取引" icon="stopwatch" href="/docs/ja/pre-confirmations/guides/trade-on-preconfirmations">
    スケジューラ自体からのHeliusが提供する最早のトランザクションシグナル
  </Card>
</CardGroup>
