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

# Handeln mit vorausverarbeiteten Transaktionen

> Beobachten Sie die Solana-Transaktionen eines Programms, bevor sie das verarbeitete Bestätigungsniveau mit preprocessedSubscribe erreichen.

`preprocessedSubscribe` streamt signierte Transaktionen, bevor sie das `processed` Bestätigungsniveau erreichen, dekodiert aus Shreds, sobald sie beim Validator ankommen, ohne dass eine Deshredding-Infrastruktur auf Ihrer Seite erforderlich ist.

Diese Anleitung erstellt einen Monitor, der ein Handelsprogramm vor der Ausführung beobachtet, den Feed dedupliziert, unter dem Drucklimit des Servers bleibt und gegen verarbeitete Daten abstimmt, bevor er handelt.

<Tip>
  [Vorausverarbeitete Transaktionen](/docs/de/preprocessed-transactions/overview) sind in allen kostenpflichtigen Plänen verfügbar und kosten 0,1 Credits pro Nachricht, mit bis zu 10 gleichzeitigen Verbindungen pro API-Schlüssel.
</Tip>

## Beschränken Sie das Abonnement auf Ihr Ziel

Es gibt keinen ungefilterten Stream: `accountInclude` und `accountRequired` müssen mindestens ein Konto zwischen sich benennen. Für einen Handelsmonitor schließen Sie das Programm ein, gegen das Sie handeln, und schließen Sie Rauschen aus, das Sie sonst bezahlen müssten:

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

Filter kombinieren sich mit UND, jede Liste akzeptiert bis zu 5.000 Adressen, und Helius löst Adressensuchtabellen serverseitig auf, sodass ein Konto, das über eine ALT geladen wird, weiterhin übereinstimmt. Um die Interaktionen eines bestimmten Wallets mit dem Programm zu beobachten, setzen Sie beide stattdessen in das `accountRequired` Feld.

## Dekodieren von Frames und Deduplizieren nach Signatur

Benachrichtigungen kommen als binäre Frames an: ein 73-Byte-Präfix, dann die bincode-serialisierte Transaktion. Die Signatur befindet sich im Präfix, sodass Sie deduplizieren können, ohne den Körper zu dekodieren. Der Stream aggregiert mehrere Vor-Ausführungsquellen, und die gleiche Transaktion kann mehrmals ankommen:

```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
```

## Halten Sie die Empfangsschleife schneller als den Stream

Helius puffert nicht unbegrenzt für langsame Verbraucher: Wenn mehr als 4.000 Nachrichten serverseitig zurückbleiben, wird die Verbindung geschlossen. Deshalb liest der obige Handler nur das 73-Byte-Präfix und stellt es in die Warteschlange.

Deserialisierungs- und Strategielogik laufen in einer separaten Schleife:

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

Wenn die Warteschlange unbegrenzt wächst, verschärfen Sie die Filter. Transaktionen, die Sie clientseitig verwerfen, kosten immer noch 0,1 Credits und zählen immer noch gegen das Drucklimit.

## Abstimmung gegen verarbeitete Daten

Eine vorausverarbeitete Transaktion zeigt, was der Absender zu tun versuchte, nicht das, was tatsächlich geschah. Sie enthält keinen Ausführungsstatus, keine Saldoänderungen oder Logs, und sie kann fehlschlagen, verworfen werden oder auf einem anderen Zweig landen. Die Lieferung erfolgt bestmöglich ohne historischen Rückblick, also:

* Stimmen Sie gegen [`transactionSubscribe`](/docs/de/rpc/websocket/transaction-subscribe) bei `processed` oder `confirmed` Bestätigung ab, bevor Ihre Strategie etwas als Tatsache bucht.
* Beim Trennen sofort wieder abonnieren und die Lücke akzeptieren, da es keinen Rückblick zur Auffüllung gibt.
* Wenn Sie den Echtzeitkontostand anstelle von Transaktionsabsichten benötigen, existiert dieser nur nach der Ausführung: Verwenden Sie [LaserStream gRPC](/docs/de/laserstream) bei `processed`.

## Verwandte Anleitungen

<CardGroup cols={2}>
  <Card title="preprocessedSubscribe Referenz" icon="code" href="/docs/de/preprocessed-transactions/preprocessed-subscribe">
    Vollständiges Payload-Layout, Filterregeln, Rückwärtsdruck und Preisgestaltung
  </Card>

  <Card title="Handeln bei Vorbestätigungen" icon="stopwatch" href="/docs/de/pre-confirmations/guides/trade-on-preconfirmations">
    Das früheste Transaktionssignal, das Helius bietet, direkt vom Scheduler
  </Card>
</CardGroup>
