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

> 使用 preprocessedSubscribe 方法，通过 WebSocket 流式传输预执行 Solana 交易。订阅、按账户过滤，并在处理承诺之前解码二进制有效负载。

<Note>
  **公共测试版。** `preprocessedSubscribe` 可在 **所有付费计划** 上使用，并按 **每条消息 0.1 积分** （每交易一条消息）计费。
</Note>

## 什么是 `preprocessedSubscribe`？

`preprocessedSubscribe` 是一种 Helius WebSocket 方法，用于流式传输预处理交易 — 即在交易达到 `processed` 承诺级别之前交付的预执行 Solana 交易。Helius 聚合多个预执行源 — 主要是直接从抵押节点到达时解码的碎片，并通过计划交易（[预确认](/docs/zh/pre-confirmations/overview)）信号补充 — 将它们作为单个去重的紧凑二进制消息流交付，无需您方的消除碎片基础设施。

从预确认信号获取的交易在此馈送上到达的时间比专用的 [Preconfirmations](/docs/zh/pre-confirmations/overview) 产品要晚，该产品仍是最早接收交易的途径。

这是早期的预处理 LaserStream 产品的继任者。如果您今天通过 [gRPC 预处理交易](/docs/zh/preprocessed-transactions/grpc) 消费，请切换到此方法 — 它通过普通 WebSocket 连接以更低的延迟交付同类数据，而 gRPC 交付将被弃用。

| 流                                                                                | 相对时间                                   | 覆盖范围              | 数据         |
| -------------------------------------------------------------------------------- | -------------------------------------- | ----------------- | ---------- |
| [Preconfirmations](/docs/zh/pre-confirmations/overview)                               | 最早                                     | 参与验证者计划的交易        | 交易和预确认状态   |
| `preprocessedSubscribe`                                                          | 通常在 Preconfirmations 之后，`processed` 之前 | 广泛的 Solana 交易覆盖范围 | 签名的预执行交易   |
| [`transactionSubscribe`](/docs/zh/rpc/websocket/transaction-subscribe) at `processed` | 执行后                                    | 处理的交易             | 具有执行元数据的交易 |

<Warning>
  `preprocessedSubscribe` 是一个 **尽力而为的预执行信号**，而不是承诺级别。流式传输的交易可能会失败、被丢弃或落在不同的分叉上。在视为最终结果之前，请与处理或确认的流进行对账。
</Warning>

## 端点

`preprocessedSubscribe` 从 `wss://beta.helius-rpc.com` 提供服务 — Helius Gatekeeper 端点 — 而不是 `mainnet.helius-rpc.com`。使用您的 API 密钥作为查询参数进行身份验证：

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

每个 API 密钥最多可建立 **10 个并发连接/订阅**。

## 订阅

使用 `preprocessedSubscribe` 方法发送一个 JSON-RPC 请求。`params` 携带账户过滤器并且是必需的 — `accountInclude` 和 `accountRequired` 必须在它们之间至少指定一个账户（参见[过滤](#过滤)）：

```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` 必须在它们之间指定 **至少一个账户** — 没有没有过滤的完整流。
* 账户是 base58 编码的公钥。每个列表最多接受 **5,000** 个地址。

### 地址查找表（ALT）解析

账户过滤器不仅匹配交易的静态账户键 — Helius 在服务器端解析 [地址查找表](/docs/zh/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));
```

## 可用数据是什么？

每个通知携带签名交易、其第一个签名和其插槽。由于交付发生在执行之前，流**不**包括：

* 执行状态或错误
* 执行前/执行后的余额或代币余额变化
* 日志消息或内部指令
* 所消耗的计算单元

可以看作是接收到了“提案”而非“结果” — 您可以看到发送者尝试执行的内容，但无法看到真正发生了什么。在此阶段账目和程序状态更新尚不存在；如果您需要实时账户状态，请在 `processed` 承诺下使用 [LaserStream gRPC](/docs/zh/laserstream)。

## 背压

对于慢速消费者，流不会无限期缓冲。如果您的客户端读取速度太慢，服务器端积压超过 **4,000 条消息**，Helius 会关闭连接 — 您将收到一个干净的 WebSocket 关闭帧。请比消息到达更快地排出帧：将繁重工作（如交易解码和策略逻辑）保持在接收循环之外，并在断开连接后重新连接和重新订阅。

## 交付保证

交付是尽力而为的，无法保证，并且没有历史重播。客户端应该：

1. 连接关闭后重新连接和重新订阅。
2. 按交易签名去重。
3. 将插槽视为观察而非终结。
4. 当执行结果重要时，与处理或确认的流对账。

## 定价

`preprocessedSubscribe` 可在 **所有付费计划** 上使用，并按 **每条消息 0.1 积分** 计费 — 每交易一条消息，从您的计划中扣除。详见 [积分](/docs/zh/billing/credits)。

## 相关

<CardGroup cols={2}>
  <Card title="预处理交易 (gRPC)" icon="binary" href="/docs/zh/preprocessed-transactions/grpc">
    相同的预执行数据通过 gRPC 提供。将弃用，建议使用此方法。
  </Card>

  <Card title="预确认" icon="bolt" href="/docs/zh/pre-confirmations/overview">
    在成为碎片前进行流式传输的计划交易 — 最早的交易信号。
  </Card>

  <Card title="原始碎片 (UDP)" icon="network-wired" href="/docs/zh/shred-delivery/raw-shreds">
    未处理的 UDP 碎片包。您需要实现碎片重组。
  </Card>

  <Card title="transactionSubscribe" icon="tower-broadcast" href="/docs/zh/rpc/websocket/transaction-subscribe">
    具有丰富过滤和执行元数据的后执行交易。
  </Card>
</CardGroup>
