> ## 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トランザクションに迅速に対応するには、preconfSubscribeフィルターを購読し、バイナリペイロードをデコードして、Sender Maxで行動します。

[事前確認](/docs/ja/pre-confirmations/overview)は、トランザクションがシュレッダーにかけられる前に、バリデーターのスケジューラーが実行を約束した瞬間にストリームで送信されます。このガイドでは、ターゲットアカウントを監視し、スケジュールされた各トランザクションをデコードし、[Sender Max](/docs/ja/sending-transactions/sender-max)を使用して反応するリスナーを構築します。

<Tip>
  事前確認には[Professionalプラン以上](/docs/ja/billing/plans)が必要であり、メッセージごとに10クレジットかかります。
</Tip>

## 接続する前にストリームの範囲を決定する

フィルタリングされていない`preconfSubscribe`は、スケジュールされたすべてのトランザクションを10クレジットで配信しますので、サーバー側でフィルターし、取引したものにだけ支払ってください。

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "preconfSubscribe",
  "params": [
    {
      "failed": false,
      "regionInclude": ["ewr"],
      "accountInclude": ["TARGET_WALLET_OR_PROGRAM"]
    }
  ]
}
```

ほとんどのトレーディングリスナーに対応する3つのフィルター:

* `failed: false`は、すでに逆転が知られているトランザクションを除外します。競争する理由がありません。
* `regionInclude`は、インフラに最も近い[地域](/docs/ja/pre-confirmations/preconf-subscribe#場所フィルタリング)にストリームを固定します。クロスリージョンのホップがスタートを消費しないようにします。
* `accountInclude`は、ターゲットに関連する任意のtxと一致します。ウォレット、AMMプール、プログラムなどです。Heliusはアドレス検索テーブルをサーバー側で解決するため、アカウントがALT経由で読み込まれてもフィルターが一致します。

## 接続、購読、デコード

`preconfSubscribe`はゲートキーパーエンドポイント(`wss://beta.helius-rpc.com`)から提供され、通知はバイナリフレームとして送信され、JSONではありません。

各フレームは固定の18バイトのプレフィックスに続き、bincodeでシリアライズされたトランザクションが続きます:

```javascript listener.js theme={"system"}
const WebSocket = require('ws');
const { VersionedTransaction } = require('@solana/web3.js');

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

ws.on('open', () => {
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'preconfSubscribe',
    params: [{
      failed: false,
      regionInclude: ['ewr'],
      accountInclude: ['TARGET_WALLET_OR_PROGRAM']
    }]
  }));
  setInterval(() => ws.ping(), 30_000); // keep the connection alive
});

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) | tx_index (u64 LE) | status (u8) | bincode(VersionedTransaction)
  const buf = Buffer.from(data);
  if (buf.readUInt8(0) !== 1) return; // unknown schema version; update your decoder
  const slot = buf.readBigUInt64LE(1);
  const status = buf.readUInt8(17); // 0 = failed, 1 = success, 2 = unknown
  const tx = VersionedTransaction.deserialize(buf.subarray(18));

  onScheduledTransaction({ slot, status, tx });
});

ws.on('error', console.error);
ws.on('close', () => process.exit(1)); // let your supervisor restart and resubscribe
```

最初にバージョンバイトを確認します。Heliusがペイロードフォーマットを更新するとバージョンが増加し、それに基づいて分岐することでデコーダーを正常に動作させ続けます。デシリアライズされたトランザクションは、命令、アカウント、および署名を提供します。

## Sender Maxで行動する

事前確認は、反応が最初に着地する場合にのみ価値があります。

[Sender Max](/docs/ja/sending-transactions/sender-max)を介して反応を送信します。0.001 SOLのチップは優先チップバッファに入り、すべての高速経路を通ります:

```javascript theme={"system"}
async function onScheduledTransaction({ slot, status, tx }) {
  if (!strategy.shouldReact(tx)) return;

  // strategy is your own code: it decides whether to react and returns a
  // signed, base64-encoded transaction that includes the tip and priority fee
  const reaction = await strategy.buildTransaction(tx);
  await fetch('http://ewr-sender.helius-rpc.com/fast', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: Date.now().toString(),
      method: 'sendTransaction',
      params: [reaction, { encoding: 'base64', skipPreflight: true, maxRetries: 0 }]
    })
  });
}
```

このハンドラーを短く保ちます。決定して送信し、ログ、会計、調整を受信パスから外してください。フル送信ループ、接続のウォーミングアップ、手数料見積もりについては[Send Trades with Sender](/docs/ja/sending-transactions/guides/land-trades-with-sender)を参照してください。

## 着地を確認しギャップを予測する

事前確認は早期の確認です。トランザクションはまだ着地しておらず、失敗またはドロップされる可能性があるため、次の2つのルールが適用されます。

* 標準のコミットメントチェック(`getSignatureStatuses`、または`processed`コミットメントストリーム経由)で確認し、観測されたトランザクションまたは反応を最終的なものとして扱う前に確認してください。
* ギャップを予測します。カバレッジはHeliusに転送されるステークのシェアとともにスケールするため、いくつかのスロットではメッセージが生成されません。それは[期待される動作](/docs/ja/pre-confirmations/overview#カバー範囲)であり、切断された接続とは異なります。キープアライブのpingがそれを区別します。接続が閉じたら再購読してください。

## 関連ガイド

<CardGroup cols={2}>
  <Card title="preconfSubscribe APIリファレンス" icon="code" href="/docs/ja/pre-confirmations/preconf-subscribe">
    フィルターの完全なセマンティクス、地域コード、バイナリペイロードのレイアウト
  </Card>

  <Card title="事前処理されたトランザクションでの取引" icon="bolt" href="/docs/ja/preprocessed-transactions/guides/trade-on-preprocessed">
    すべての有料プランで、メッセージごとに0.1クレジットの事前実行カバレッジ
  </Card>
</CardGroup>
