账户订阅在账户的 lamport 余额、数据或所有者发生变化时提供实时更新。您可以监控特定地址、由程序拥有的所有账户,或应用字节级数据过滤器。
过滤参数
| 参数 | 类型 | 描述 |
|---|
account | string[] | 要监控的特定账户公钥。列表中任意匹配(逻辑 OR)。 |
owner | string[] | 监控由这些程序 ID 拥有的所有账户(逻辑 OR)。 |
filters | object[] | 附加数据过滤器——dataSize 和/或 memcmp(逻辑 AND)。 |
nonemptyTxnSignature | boolean | 仅发出属于交易的更新。 |
dataSize 过滤器
仅接收数据长度完全匹配的账户更新:
filters: [{ dataSize: 165 }]
memcmp 过滤器
在给定偏移量处按特定字节序列匹配账户(适用于鉴别器):
filters: [
{
memcmp: {
offset: 0,
bytes: "base58EncodedBytes",
},
},
]
组合多种过滤器类型时,它们以逻辑 AND 运算。在 account 或 owner 数组中,值以逻辑 OR 运算。
示例:监控特定钱包
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();
示例:按所有者程序监控所有代币账户
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 减少带宽:
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 |