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

# LaserStream gRPC 快速入门

> 安装 SDK，选择一个端点，并通过 LaserStream gRPC 流式传输您的第一个 Solana 交易。包括端点、订阅请求参考、代码示例和常见问题。

## 概述

LaserStream 是一个托管的 Solana gRPC 流式服务。它与开放的 Yellowstone gRPC 协议线兼容，因此任何 Yellowstone 客户端都可以直接使用，并增加了生产功能，如历史重放、多节点故障转移和完全托管的环境。

LaserStream使用开源的gRPC协议，确保没有供应商锁定，并与现有的gRPC实现最大限度兼容。

您可以使用标准 `@triton-one/yellowstone-grpc` 客户端连接，或使用性能优化的 **[Helius LaserStream SDK](/zh/laserstream/clients)** 以获得更高的吞吐量、自动重连、订阅管理、错误处理等额外优势。

<Card title="LaserStream SDK比JavaScript Yellowstone客户端快40倍" icon="bolt" href="https://www.helius.dev/blog/laserstream-sdks">
  了解我们如何使用Rust Core与零拷贝NAPI绑定来最大化JavaScript SDK的性能
</Card>

<Warning>
  **性能提示**：如果您在使用LaserStream连接时遇到任何延迟或性能问题，请参考[故障排除部分](#troubleshooting-%2F-faq)以了解常见原因和解决方案。
</Warning>

<Note>
  **无压缩**：为了最小化延迟，LaserStream 不会压缩 gRPC 响应消息。将 `Accept-Encoding` 设置为 gzip 或 zstd 将无效——响应始终以未压缩形式返回。
</Note>

<Divider />

## 终端节点和地区

LaserStream 在全球多个地区提供。

选择离您的应用程序最近的终端节点以获得最佳性能：

### 主网端点

| 地区       | 位置            | 终端节点                                              |
| -------- | ------------- | ------------------------------------------------- |
| **ewr**  | 纽瓦克，新泽西（纽约附近） | `https://laserstream-mainnet-ewr.helius-rpc.com`  |
| **pitt** | 匹兹堡，美国（中部）    | `https://laserstream-mainnet-pitt.helius-rpc.com` |
| **slc**  | 盐湖城，美国（西海岸）   | `https://laserstream-mainnet-slc.helius-rpc.com`  |
| **lax**  | 洛杉矶，美国（西海岸）   | `https://laserstream-mainnet-lax.helius-rpc.com`  |
| **lon**  | 伦敦，欧洲         | `https://laserstream-mainnet-lon.helius-rpc.com`  |
| **ams**  | 阿姆斯特丹，欧洲      | `https://laserstream-mainnet-ams.helius-rpc.com`  |
| **fra**  | 法兰克福，欧洲       | `https://laserstream-mainnet-fra.helius-rpc.com`  |
| **tyo**  | 东京，亚洲         | `https://laserstream-mainnet-tyo.helius-rpc.com`  |
| **sgp**  | 新加坡，亚洲        | `https://laserstream-mainnet-sgp.helius-rpc.com`  |

### 开发网端点

| 网络         | 位置            | 终端节点                                            |
| ---------- | ------------- | ----------------------------------------------- |
| **Devnet** | 纽瓦克，新泽西（纽约附近） | `https://laserstream-devnet-ewr.helius-rpc.com` |

<Note>
  **网络和地区选择**：

  * 对于 **生产应用**，选择最靠近服务器的 mainnet 终端节点以获得最佳性能（例如，如果在欧洲部署，请使用阿姆斯特丹 (`ams`) 或法兰克福 (`fra`)）
  * 对于 **测试**，使用：`https://laserstream-devnet-ewr.helius-rpc.com`。
</Note>

## 快速入门

<Tip>
  从您的 [Helius Dashboard](https://dashboard.helius.dev/laserstream) 开始使用 LaserStream。 主网需要商业或专业计划；开发网可在开发者及以上计划中使用。 详情请参见 [Plans & Pricing](/zh/billing/plans)。
</Tip>

<Steps>
  <Step title="创建新项目">
    ```bash theme={"system"}
    mkdir laserstream-grpc-demo
    cd laserstream-grpc-demo
    npm init -y
    ```
  </Step>

  <Step title="安装依赖项">
    ```bash theme={"system"}
    npm install helius-laserstream
    npm install --save-dev typescript tsx @types/node
    ```

    我们使用 `tsx` 是因为 TypeScript 5.x 上的默认 `npx tsc --init` 设置了 `verbatimModuleSyntax`、`module: "nodenext"` 和 `types: []`，所有这些都会破坏快速 `ts-node index.ts` 运行。 `tsx` 运行 `.ts` 文件而无需 tsconfig。
  </Step>

  <Step title="获取您的 API 密钥">
    从 [Helius Dashboard](https://dashboard.helius.dev/) 生成一个密钥。

    该密钥将作为 LaserStream 的身份验证令牌。

    <Note>
      **计划要求**：LaserStream 开发网在所有 [计划](/zh/billing/plans) 中可用。 LaserStream 主网需要商业或专业计划。
    </Note>
  </Step>

  <Step title="创建订阅脚本">
    创建 **`index.ts`**，内容如下：

    ```typescript theme={"system"}
    import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'

    async function main() {
      const subscriptionRequest: SubscribeRequest = {
        transactions: {
          "token-filter": { // user-defined label for this filter
            accountInclude: ['TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'],
            accountExclude: [],
            accountRequired: [],
            vote: false,
            failed: false
          }
        },
        commitment: CommitmentLevel.CONFIRMED,
        accounts: {},
        slots: {},
        transactionsStatus: {},
        blocks: {},
        blocksMeta: {},
        entry: {},
        accountsDataSlice: [],
        // Optionally, you can replay missed data by specifying a `fromSlot` (u64 number):
        // fromSlot: currentSlot - 1000,
        // Note: replay is currently limited to the last ~216,000 slots (≈24 hours).
      };

    // Replace the values below with your actual LaserStream API key and endpoint
    const config: LaserstreamConfig = {
      apiKey: 'YOUR_API_KEY', // Replace with your key from https://dashboard.helius.dev/
      endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com', // Choose your closest region
    }

      await subscribe(config, subscriptionRequest, async (data) => {
        
        console.log(data);

      }, async (error) => {
        console.error(error);
      });
    }

    main().catch(console.error);
    ```
  </Step>

  <Step title="替换您的API密钥并选择您的区域">
    在`index.ts`中，更新`config`对象：

    1. 您的实际API密钥来自[Helius Dashboard](https://dashboard.helius.dev/)
    2. 离您的服务器位置最近的LaserStream端点

    ```typescript theme={"system"}
    const config: LaserstreamConfig = {
      apiKey: 'YOUR_ACTUAL_API_KEY', // Replace with your key from Helius Dashboard
      endpoint: 'https://laserstream-mainnet-fra.helius-rpc.com', // Example: Frankfurt mainnet
      // For devnet: endpoint: 'https://laserstream-devnet-ewr.helius-rpc.com'
    }
    ```

    **网络和区域选择示例：**

    * **用于生产（Mainnet）**：
      * 欧洲：使用`fra`（法兰克福）、`ams`（阿姆斯特丹）或`lon`（伦敦）
      * 美国东部：使用`ewr`（纽约）
      * 美国西部：使用`slc`（盐湖城）或`lax`（洛杉矶）
      * 亚洲：使用`tyo`（东京）或`sgp`（新加坡）
    * **用于开发（Devnet）**：
      * 使用`https://laserstream-devnet-ewr.helius-rpc.com`
  </Step>

  <Step title="运行并查看结果">
    ```bash theme={"system"}
    npx tsx index.ts
    ```

    每当一个`confirmed`令牌交易涉及`TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`时，您将在控制台中看到数据。
  </Step>
</Steps>

<Divider />

## 常见工作流程

您可以参考我们最常见的工作流程分步指南。每个指南都使用带有自动重连和历史重播功能的 [`helius-laserstream`](/zh/laserstream/clients) SDK。

<CardGroup cols={2}>
  <Card title="账户订阅" icon="user" href="/zh/laserstream/guides/account-subscription">
    通过过滤器监控特定账户的余额、数据和所有权变更。
  </Card>

  <Card title="交易监控" icon="receipt" href="/zh/laserstream/guides/transaction-monitoring">
    流式传输涉及目标账户的交易，并按程序、投票或失败状态进行过滤。
  </Card>

  <Card title="插槽和区块监控" icon="cube" href="/zh/laserstream/guides/slot-and-block-monitoring">
    跟踪网络共识、区块生产和承诺级别转换。
  </Card>

  <Card title="解码交易数据" icon="binary" href="/zh/laserstream/guides/decoding-transaction-data">
    将二进制 `transactionUpdate` 有效负载解析为可读的 Solana 交易。
  </Card>

  <Card title="流式传输 Pump AMM 数据" icon="chart-line" href="/zh/laserstream/guides/stream-pump-amm-data">
    真实示例：使用重连安全过滤器监控 Pump AMM 交易。
  </Card>
</CardGroup>

<Tip>
  如果您更喜欢原始Yellowstone协议，`@triton-one/yellowstone-grpc`客户端也可以使用相同的端点。查看[Yellowstone gRPC参考](/zh/grpc)以获取协议级别的详细信息。
</Tip>

<Divider />

## 订阅请求

在订阅请求中，您需要包括以下一般参数：

<Note>
  **历史重放：** 您可以选择在主 `SubscribeRequest` 对象中包含一个 `fromSlot` 字段（一个 `u64` 数字）以从特定插槽开始重放数据。重放目前仅限于最近的 216,000 个插槽（约 24 小时）；请注意，[超过约 20 分钟的重放只能返回最终数据](/zh/laserstream/historical-replay#how-far-back-you-can-replay)。
</Note>

<ParamField type="enum">
  指定承诺级别，可以是**processed**、**confirmed**或**finalized**。
</ParamField>

<ParamField type="array">
  一个对象数组`{ offset: uint64, length: uint64 }`，允许您仅从账户接收所需的数据片段。
</ParamField>

<ParamField type="boolean">
  一些云提供商（如Cloudflare）可能会在一段时间的不活动后关闭空闲流。为了防止这种情况并保持连接无需重新发送过滤器，请将此设置为**true**。服务器将每15秒响应一次Pong消息。
</ParamField>

```typescript theme={"system"}
const subscriptionRequest: SubscribeRequest = {
  commitment: CommitmentLevel.CONFIRMED,
  accountsDataSlice: [],
  transactions: {},
  accounts: {},
  slots: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
}
```

接下来，您需要指定要订阅的数据过滤器，例如账户、区块、槽位或交易。

<Accordion title="Slots">
  定义槽位更新的过滤器。您使用的键（例如，`mySlotLabel`）是此特定过滤器配置的**用户定义标签**，如果需要，可以定义多个命名配置（尽管通常一个就足够了）。

  <ParamField type="boolean">
    默认情况下，所有承诺级别的槽位都会发送。使用此过滤器，您可以选择仅接收选定的承诺级别。
  </ParamField>

  <ParamField type="boolean">
    启用订阅以接收槽位内部的更改更新，而不仅仅是在新槽开始时。对于更精细、低延迟的槽位数据，这非常有用。
  </ParamField>

  ```typescript theme={"system"}
  slots: {
    // mySlotLabel is a user-defined name for this slot update filter configuration
    mySlotLabel: {
      // filterByCommitment: true => Only broadcast slot updates at the specified subscribeRequest commitment
      filterByCommitment: true
      // interslotUpdates: true allows receiving updates for changes occurring within a slot, not just new slots.
      interslotUpdates: true
    }
  },
  ```
</Accordion>

<Accordion title="Accounts">
  为账户数据更新定义过滤器。使用的键（例如，`tokenAccounts`）是此特定过滤器配置的**用户定义标签**。

  <ParamField type="array">
    匹配提供数组中的任何公钥。
  </ParamField>

  <ParamField type="array">
    账户所有者的公钥。匹配提供数组中的任何公钥。
  </ParamField>

  <ParamField type="array">
    类似于[getProgramAccounts](https://solana.com/docs/rpc/http/getprogramaccounts)中的过滤器。这是一个包含`datasize`和/或`memcmp`过滤器的数组。对于`memcmp`，比对器直接放在`memcmp`对象中的`bytes`、`base58`或`base64`之一上。
  </ParamField>

  如果所有字段为空，则所有账户都会被广播。否则：

  * 字段作为逻辑**AND**操作。
  * 数组内的值作为逻辑**OR**操作（除了在`filters`中的情况外，那里作为逻辑**AND**操作）。

  ```typescript theme={"system"}
  accounts: {
    // tokenAccounts is a user-defined label for this account filter configuration
    tokenAccounts: {
      // Matches any of these public keys (logical OR)
      account: ["9SHQTA66Ekh7ZgMnKWsjxXk6DwXku8przs45E8bcEe38"],
      // Matches owners that are any of these public keys
      owner: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],
      // Filters - all must match (AND logic)
      filters: [
        { datasize: 165 },
        {
          memcmp: {
            offset: 0,
            base58: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
          }
        }
      ]
    }
  },
  ```

  跟踪超过 \~10,000 个账户？与其使用显式的 pubkey 列表（每个账户 32 字节），不如使用压缩的 [cuckoo filter](/zh/laserstream/cuckoo-filters)（每个账户约 3–4 字节）来订阅单个流中的数十万个账户。 在 Rust 和 JavaScript SDK 中可用。
</Accordion>

<Accordion title="Transaction">
  为交易更新定义过滤器。使用的键（例如，`myTxSubscription`）是此特定过滤器配置的**用户定义标签**。

  <ParamField type="boolean">
    启用或禁用投票事务的广播。
  </ParamField>

  <ParamField type="boolean">
    启用或禁用失败事务的广播。
  </ParamField>

  <ParamField type="string">
    仅广播与指定签名匹配的事务。
  </ParamField>

  <ParamField type="array">
    筛选涉及提供列表中任何账户的事务。
  </ParamField>

  <ParamField type="array">
    排除涉及提供列表中任何账户的事务（与 `accountInclude` 相反）。
  </ParamField>

  <ParamField type="array">
    筛选涉及提供列表中所有账户的事务（必须使用所有账户）。
  </ParamField>

  <ParamField type="string">
    可选的 `tokenAccounts`（关联代币账户）扩展。当设置时，`accountInclude` 钱包也匹配它**拥有**SPL 代币余额的事务——例如，接收的代币转账触及钱包的代币账户而不是其 pubkey。接受 `"balanceChanged"`（余额增减匹配）、`"all"`（任何引用，较高容量）或 `"none"`（无扩展，默认）。 SDK 将字符串转换为线级 `TokenAccountExpansionControlFlag` 枚举（属于 `yellowstone-grpc-proto` 12.5.0+）。详情请参见 [Transaction Monitoring](/zh/laserstream/guides/transaction-monitoring)。
  </ParamField>

  如果所有字段均为空，则所有事务均被广播。否则：

  * 字段作为逻辑**AND**操作。
  * 数组内的值作为逻辑**OR**处理（除了对于`accountRequired`，所有必须匹配的情况）。

  ```typescript theme={"system"}
  transactions: {
    // myTxSubscription is a user-defined label for this transaction filter configuration
    myTxSubscription: {
      vote: false,
      failed: false,
      signature: "",
      // Transaction must include at least one of these public keys (OR)
      accountInclude: ["86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY"],
      // Exclude if it matches any of these
      accountExclude: [],
      // Require all accounts in this array (AND)
      accountRequired: []
    }
  },
  ```
</Accordion>

<Accordion title="块">
  为块更新定义过滤器。您使用的键（例如，`myBlockLabel`）是这个特定过滤器配置的**用户定义标签**。

  <ParamField type="array">
    过滤涉及提供列表中任何账户的交易和账户。
  </ParamField>

  <ParamField type="boolean">
    在广播中包含所有交易。
  </ParamField>

  <ParamField type="boolean">
    在广播中包含所有账户更新。
  </ParamField>

  <ParamField type="boolean">
    在广播中包含所有条目。
  </ParamField>

  ```typescript theme={"system"}
  blocks: {
    // myBlockLabel is a user-defined label for this block filter configuration
    myBlockLabel: {
      // Only broadcast blocks referencing these accounts
      accountInclude: ["86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY"],
      includeTransactions: true,
      includeAccounts: false,
      includeEntries: false
    }
  },
  ```
</Accordion>

<Accordion title="块元数据">
  其功能类似于块，但不包括交易、账户和条目。您使用的键（例如，`blockmetadata`）是此订阅的**用户定义标签**。目前，不提供块元数据的过滤器——所有消息默认广播。

  ```typescript theme={"system"}
  blocksMeta: {
    blockmetadata: {}
  },
  ```
</Accordion>

<Accordion title="条目">
  订阅账本条目。您使用的键（例如，`entrySubscribe`）是此订阅的**用户定义标签**。目前，条目没有可用的过滤器；所有条目都被广播。

  ```typescript theme={"system"}
  entry: {
    entrySubscribe: {}
  },
  ```
</Accordion>

<Divider />

## 代码示例（LaserStream SDK）

<Tabs>
  <Tab title="插槽更新">
    ```typescript theme={"system"}
    import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'

    async function main() {
        const subscriptionRequest: SubscribeRequest = {
            transactions: {},
            commitment: CommitmentLevel.CONFIRMED,
            accounts: {},
            slots: {
                slot: { filterByCommitment: true },
            },
            transactionsStatus: {},
            blocks: {},
            blocksMeta: {},
            entry: {},
            accountsDataSlice: [],
        };

        const config: LaserstreamConfig = {
            apiKey: 'YOUR_API_KEY', // Replace with your key
            endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com', // Choose your closest region
        }

        await subscribe(config, subscriptionRequest, async (data) => {
            console.log(data);
        }, async (error) => {
            console.error(error);
        });
    }

    main().catch(console.error);
    ```
  </Tab>

  <Tab title="账户更新">
    ```typescript theme={"system"}
    import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'

    async function main() {
        const subscriptionRequest: SubscribeRequest = {
            accounts: {
                "usdc-account": { // user-defined label for this filter
                    account: ["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"], // USDC mint account
                    owner: [],
                    filters: []
                }
            },
            accountsDataSlice: [],
            commitment: CommitmentLevel.CONFIRMED,
            slots: {},
            transactions: {},
            transactionsStatus: {},
            blocks: {},
            blocksMeta: {},
            entry: {}
        };

        const config: LaserstreamConfig = {
            apiKey: 'YOUR_API_KEY', // Replace with your key
            endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com', // Choose your closest region
        }

        await subscribe(config, subscriptionRequest, async (data) => {
            console.log(data);
        }, async (error) => {
            console.error(error);
        });
    }

    main().catch(console.error);
    ```
  </Tab>

  <Tab title="交易更新">
    ```typescript theme={"system"}
    import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'

    async function main() {
        const subscriptionRequest: SubscribeRequest = {
            transactions: {
                "token-filter": { // user-defined label for this filter
                    accountInclude: ['TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'],
                    accountExclude: [],
                    accountRequired: [],
                    vote: false,
                    failed: false
                }
            },
            commitment: CommitmentLevel.CONFIRMED,
            accounts: {},
            slots: {},
            transactionsStatus: {},
            blocks: {},
            blocksMeta: {},
            entry: {},
            accountsDataSlice: [],
        };

        const config: LaserstreamConfig = {
            apiKey: 'YOUR_API_KEY', // Replace with your key
            endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com', // Choose your closest region
        }

        await subscribe(config, subscriptionRequest, async (data) => {
            console.log(data);
        }, async (error) => {
            console.error(error);
        });
    }

    main().catch(console.error);
    ```
  </Tab>

  <Tab title="块">
    ```typescript theme={"system"}
    import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'

    async function main() {
        const subscriptionRequest: SubscribeRequest = {
            entry: {},
            accounts: {},
            accountsDataSlice: [],
            slots: {},
            blocks: {
                blocks: {
                    accountInclude: []
                }
            },
            blocksMeta: {},
            transactions: {},
            transactionsStatus: {},
            commitment: CommitmentLevel.CONFIRMED,
        };

        const config: LaserstreamConfig = {
            apiKey: 'YOUR_API_KEY', // Replace with your key
            endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com', // Choose your closest region
        }

        await subscribe(config, subscriptionRequest, async (data) => {
            console.log(data);
        }, async (error) => {
            console.error(error);
        });
    }

    main().catch(console.error);
    ```
  </Tab>

  <Tab title="块元数据">
    ```typescript theme={"system"}
    import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'

    async function main() {
        const subscriptionRequest: SubscribeRequest = {
            entry: {},
            accounts: {},
            accountsDataSlice: [],
            slots: {},
            blocks: {},
            blocksMeta: {
                blockmetadata: {}
            },
            transactions: {},
            transactionsStatus: {},
            commitment: CommitmentLevel.CONFIRMED,
        };

        const config: LaserstreamConfig = {
            apiKey: 'YOUR_API_KEY', // Replace with your key
            endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com', // Choose your closest region
        }

        await subscribe(config, subscriptionRequest, async (data) => {
            console.log(data);
        }, async (error) => {
            console.error(error);
        });
    }

    main().catch(console.error);
    ```
  </Tab>

  <Tab title="条目">
    ```typescript theme={"system"}
    import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream'

    async function main() {
        const subscriptionRequest: SubscribeRequest = {
            entry: {
                entrySubscribe: {}  // Subscribe to all entries
            },
            accounts: {},
            accountsDataSlice: [],
            slots: {},
            blocks: {},
            blocksMeta: {},
            transactions: {},
            transactionsStatus: {},
            commitment: CommitmentLevel.CONFIRMED,
        };

        const config: LaserstreamConfig = {
            apiKey: 'YOUR_API_KEY', // Replace with your key
            endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com', // Choose your closest region
        }

        await subscribe(config, subscriptionRequest, async (data) => {
            console.log(data);
        }, async (error) => {
            console.error(error);
        });
    }

    main().catch(console.error);
    ```
  </Tab>
</Tabs>

<Divider />

## SDK 选项

我们为多种编程语言提供了官方 SDK：

* **TypeScript**: [LaserStream TypeScript SDK](https://github.com/helius-labs/laserstream-sdk)
* **Rust**: [LaserStream Rust SDK](https://github.com/helius-labs/laserstream-sdk/tree/main/rust)
* **Go**: [LaserStream Go SDK](https://github.com/helius-labs/laserstream-sdk/tree/main/go)

对于其他语言或自定义实现，您可以直接使用 [Yellowstone gRPC proto files](https://github.com/rpcpool/yellowstone-grpc/tree/v6.0.0%2Bsolana.2.2.12/yellowstone-grpc-proto/proto) 来生成您喜欢语言的 gRPC 客户端。

<Divider />

## 疑难解答 / 常见问题

<Accordion title="Q: 我的 LaserStream 连接出现延迟或性能缓慢。这可能是什么原因？">
  **A:** LaserStream 连接的性能问题通常由以下原因导致：

  * **JavaScript 客户端缓慢**：JavaScript 客户端在处理过多消息或消耗过多带宽时可能会滞后。请考虑更精确地过滤您的订阅以减少消息量，切换到 [LaserStream JavaScript SDK](/zh/laserstream/clients)，或尝试使用其他语言。

  * **本地带宽有限**：大量订阅可能会使带宽有限的客户端不堪重负。监控您的网络使用情况，并考虑升级您的连接或减少订阅范围。

  * **地理距离**：较长的网络路径会增加延迟和数据包丢失。请使用 [距离您服务器最近的端点](#mainnet-endpoints)。对于高延迟连接，请增加网络读取缓冲区大小（可以提高5倍以上的带宽）：

    ```bash theme={"system"}
    sudo sysctl -w net.core.rmem_max=67108864 net.ipv4.tcp_rmem="4096 87380 67108864"
    ```

    为在重启后保持配置，添加到 `/etc/sysctl.conf`：

    ```bash theme={"system"}
    net.core.rmem_max=67108864
    net.ipv4.tcp_rmem=4096 87380 67108864
    ```

    增加 HTTP/2 流窗口大小到 64MB 以防止流量控制瓶颈：

    ```rust theme={"system"}
    // Rust (tonic)
    Channel::from_static("https://laserstream-mainnet-ewr.helius-rpc.com")
        .initial_stream_window_size(1024 * 1024 * 64)  // 64MB window
        .connect()
        .await?;
    ```

  * **客户端处理瓶颈**：确保您的消息处理逻辑经过优化，并且不会长时间堵塞主线程。

  **调试客户端延迟**：为帮助您调试客户端，我们构建了一个工具来测试从您的节点到 Laserstream gRPC 服务器的最大带宽。要使用它，请运行：

  ```
  cargo install helius-laserstream-bandwidth
  helius-laserstream-bandwidth --laserstream-url $LASERSTREAM_URL --api-key $API_KEY
  ```

  输出返回您的服务器和Laserstream服务器之间的最大网络容量。至少需要10MB/s来订阅所有交易数据，80MB/s来订阅所有账户数据。我们建议至少具备所需容量的2倍以获得最佳性能。
</Accordion>

<Accordion title="Q: 我收到连接错误。我应该检查什么？">
  **A:** 验证您的API密钥和端点是否正确，并确保您的网络允许向指定端点的外发gRPC连接。检查[Helius状态页面](https://helius.statuspage.io/)是否有正在进行的事件。
</Accordion>

<Accordion title="Q: 为什么我的过滤器没有按预期工作？">
  **A:** 重新检查过滤器部分描述的逻辑运算符（AND/OR）。确保公钥正确。查看请求中指定的承诺级别。
</Accordion>

<Accordion title="Q: 我可以在一个请求中订阅多种类型的数据（例如账户和交易）吗？">
  **A:** 可以，您可以在同一个`SubscribeRequest`对象下定义多个键（例如，`accounts`，`transactions`）的过滤器配置。
</Accordion>

<Accordion title="Q: LaserStream支持消费组吗？">
  **A:** 我们不实现消费组。相反，LaserStream提供团队所需的相同结果：恢复、重放和多节点可靠性，而无需协调层（以及随之而来的延迟/开销）。我们认为大多数工作负载不需要消费组，而且消费组会增加延迟和操作开销。举个例子，单个LaserStream gRPC连接可以发出多达10倍Solana的交易和账户数据，而大多数客户端只订阅一个小的、过滤后的片段。在这种情况下使用消费组会消耗性能空间并引入另一个故障点。
</Accordion>

<Accordion title="Q: 为什么我只收到 Pong 响应，而没有账户或插槽数据？">
  **A:** 在您的初始 `ping` 中包含一个字段会导致 LaserStream 静默忽略所有订阅过滤器，仅返回一个不包含账户、交易或插槽数据的 Pong。要解决此问题，请从初始订阅请求中移除 `ping`，然后在订阅建立后，通过流的 sink 单独发送 ping。这可以保持连接活跃而不干扰您的过滤器。
</Accordion>
