> ## 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 до того, как они достигнут уровня подтверждения processed, с помощью preprocessedSubscribe.

`preprocessedSubscribe` передает подписанные транзакции до того, как они достигнут уровня подтверждения `processed`. Транзакции декодируются из шредов по мере их поступления валидатору, поэтому вам не нужна собственная инфраструктура для десериализации шредов.

В этом руководстве вы создадите монитор, который отслеживает торговую программу до выполнения транзакций, удаляет дубликаты из потока, не превышает серверное ограничение обратного давления и сверяется с обработанными данными перед выполнением действий.

<Tip>
  [Предварительно обработанные транзакции](/docs/ru/preprocessed-transactions/overview) доступны на всех платных тарифах и стоят 0,1 кредита за сообщение. Для каждого ключа API допускается до 10 одновременных подключений.
</Tip>

## Ограничьте подписку целевыми данными

Поток без фильтров недоступен: в `accountInclude` и `accountRequired` должна быть указана как минимум одна учетная запись. Для торгового монитора включите программу, с которой вы торгуете, и исключите лишние данные, за которые иначе пришлось бы платить:

```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);
  }
});
```

Если очередь растет без ограничений, сузьте фильтры. Каждая транзакция, которую вы отбрасываете на стороне клиента, по-прежнему стоит 0,1 кредита и учитывается при проверке ограничения обратного давления.

## Сверяйтесь с обработанными данными

Предварительно обработанная транзакция показывает, что пытался сделать отправитель, а не то, что произошло фактически. Она не содержит статуса выполнения, изменений баланса или журналов и может завершиться ошибкой, быть отброшена или попасть в другую ветвь. Доставка выполняется по мере возможности без исторического воспроизведения, поэтому:

* Прежде чем стратегия зафиксирует что-либо как факт, сверьтесь с [`transactionSubscribe`](/docs/ru/rpc/websocket/transaction-subscribe) на уровне подтверждения `processed` или `confirmed`.
* При отключении немедленно оформите подписку заново и учитывайте образовавшийся пробел, поскольку воспроизведение для его заполнения недоступно.
* Если вместо намерений транзакций вам нужно состояние учетной записи в реальном времени, оно доступно только после выполнения: используйте [LaserStream gRPC](/docs/ru/laserstream) на уровне подтверждения `processed`.

## Связанные руководства

<CardGroup cols={2}>
  <Card title="preprocessedSubscribe reference" icon="code" href="/docs/ru/preprocessed-transactions/preprocessed-subscribe">
    Полная структура полезной нагрузки, правила фильтрации, обратное давление и цены
  </Card>

  <Card title="Trade on Preconfirmations" icon="stopwatch" href="/docs/ru/pre-confirmations/guides/trade-on-preconfirmations">
    Самый ранний сигнал о транзакции, который предлагает Helius, непосредственно от планировщика
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.