> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbitflare.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 账户监控

> 使用 Yellowstone gRPC 精确过滤并流式传输实时 Solana 账户更新

## 概述

账户订阅在账户的 lamport 余额、数据或所有者发生变化时提供实时更新。您可以监控特定地址、由程序拥有的所有账户，或应用字节级数据过滤器。

## 过滤参数

| 参数                     | 类型         | 描述                                        |
| ---------------------- | ---------- | ----------------------------------------- |
| `account`              | `string[]` | 要监控的特定账户公钥。列表中任意匹配（逻辑 OR）。                |
| `owner`                | `string[]` | 监控由这些程序 ID 拥有的所有账户（逻辑 OR）。                |
| `filters`              | `object[]` | 附加数据过滤器——`dataSize` 和/或 `memcmp`（逻辑 AND）。 |
| `nonemptyTxnSignature` | `boolean`  | 仅发出属于交易的更新。                               |

### dataSize 过滤器

仅接收数据长度完全匹配的账户更新：

```typescript theme={null}
filters: [{ dataSize: 165 }]
```

### memcmp 过滤器

在给定偏移量处按特定字节序列匹配账户（适用于鉴别器）：

```typescript theme={null}
filters: [
  {
    memcmp: {
      offset: 0,
      bytes: "base58EncodedBytes",
    },
  },
]
```

<Note>
  组合多种过滤器类型时，它们以逻辑 AND 运算。在 `account` 或 `owner` 数组中，值以逻辑 OR 运算。
</Note>

## 示例：监控特定钱包

```typescript theme={null}
import Client, { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc";

const client = new Client(
  "https://your-endpoint.grpc.orbitflare.com",
  "YOUR_GRPC_TOKEN",
  { "grpc.max_receive_message_length": 64 * 1024 * 1024 }
);

async function main() {
  const stream = await client.subscribe();

  const streamClosed = new Promise<void>((resolve, reject) => {
    stream.on("error", (error) => { reject(error); stream.end(); });
    stream.on("end", () => resolve());
    stream.on("close", () => resolve());
  });

  stream.on("data", (data) => {
    if (data.account) {
      const { account, slot } = data.account;
      console.log(`Slot ${slot} 的账户更新:`);
      console.log(`  公钥: ${account.pubkey}`);
      console.log(`  Lamports: ${account.lamports}`);
      console.log(`  所有者: ${account.owner}`);
      console.log(`  数据长度: ${account.data.length} 字节`);
    }
  });

  const request: SubscribeRequest = {
    accounts: {
      walletMonitor: {
        account: ["YourWalletPublicKeyHere"],
        owner: [],
        filters: [],
      },
    },
    commitment: CommitmentLevel.CONFIRMED,
    accountsDataSlice: [],
    transactions: {},
    transactionsStatus: {},
    slots: {},
    blocks: {},
    blocksMeta: {},
    entry: {},
    ping: { id: 1 },
  };

  await new Promise<void>((resolve, reject) => {
    stream.write(request, (err) => {
      if (err == null) resolve(); else reject(err);
    });
  });

  await streamClosed;
}

main();
```

## 示例：按所有者程序监控所有代币账户

```typescript theme={null}
const request: SubscribeRequest = {
  accounts: {
    tokenAccounts: {
      account: [],
      owner: [
        "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", // SPL Token 程序
      ],
      filters: [
        { dataSize: 165 }, // 标准代币账户大小
      ],
    },
  },
  commitment: CommitmentLevel.CONFIRMED,
  accountsDataSlice: [],
  transactions: {},
  transactionsStatus: {},
  slots: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
};
```

## 使用 accountsDataSlice 优化

如果您只需要账户数据的一部分（例如前 64 字节用于鉴别器），使用 `accountsDataSlice` 减少带宽：

```typescript theme={null}
const request: SubscribeRequest = {
  accounts: {
    myFilter: {
      account: ["AccountPubkeyHere"],
      owner: [],
      filters: [],
    },
  },
  accountsDataSlice: [
    { offset: 0, length: 64 },
  ],
  commitment: CommitmentLevel.CONFIRMED,
  transactions: {},
  transactionsStatus: {},
  slots: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
};
```

## 常见使用场景

| 使用场景        | 方法                                                                        |
| ----------- | ------------------------------------------------------------------------- |
| 追踪钱包余额      | 使用特定公钥的 `account` 过滤器                                                     |
| 监控所有代币铸币    | `owner: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"]` + `dataSize: 82` |
| 监控特定程序的状态   | `owner: ["YourProgramId"]` 过滤器                                            |
| 检测新 AMM 池创建 | owner + 匹配池账户大小的 `dataSize`                                               |
