Genel Bakış
Hesap abonelikleri, bir hesabın lamport bakiyesi, verileri veya sahibi değiştiğinde gerçek zamanlı güncellemeler sunar. Belirli adresleri, bir program tarafından sahip olunan tüm hesapları izleyebilir veya bayt düzeyinde veri filtreleri uygulayabilirsiniz.
Filtre Parametreleri
| Parametre | Tür | Açıklama |
|---|
account | string[] | İzlenecek belirli hesap açık anahtarları. Listedeki herhangi biriyle eşleşir (mantıksal VEYA). |
owner | string[] | Bu program kimliklerine ait tüm hesapları izle (mantıksal VEYA). |
filters | object[] | Ek veri filtreleri — dataSize ve/veya memcmp (mantıksal VE). |
nonemptyTxnSignature | boolean | Yalnızca bir işlemin parçası olan güncellemeleri yayınla. |
dataSize Filtresi
Yalnızca veri uzunluğu tam olarak eşleşen hesaplar için güncellemeler alın:
filters: [{ dataSize: 165 }]
memcmp Filtresi
Belirli bir ofset konumundaki belirli bir bayt dizisiyle hesapları eşleştirin (discriminator’lar için kullanışlı):
filters: [
{
memcmp: {
offset: 0,
bytes: "base58EncodedBytes",
},
},
]
Birden fazla filtre türü birleştirildiğinde mantıksal VE olarak çalışırlar. account veya owner dizilerinde değerler mantıksal VEYA olarak çalışır.
Örnek: Belirli Bir Cüzdanı İzleme
import Client, { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc";
const GRPC_URL = "https://your-endpoint.grpc.orbitflare.com";
const X_TOKEN = "YOUR_GRPC_TOKEN";
const PING_INTERVAL_MS = 30_000;
const client = new Client(GRPC_URL, X_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(`Account update at slot ${slot}:`);
console.log(` Pubkey: ${account.pubkey}`);
console.log(` Lamports: ${account.lamports}`);
console.log(` Owner: ${account.owner}`);
console.log(` Data length: ${account.data.length} bytes`);
} else if (data.pong) {
console.log("Pong received");
}
});
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);
});
});
// Ping to keep alive
setInterval(() => {
stream.write({ ping: { id: 1 }, accounts: {}, accountsDataSlice: [], transactions: {}, transactionsStatus: {}, slots: {}, blocks: {}, blocksMeta: {}, entry: {} }, () => {});
}, PING_INTERVAL_MS);
await streamClosed;
}
main();
Örnek: Sahip Programa Göre Tüm Token Hesaplarını İzleme
const request: SubscribeRequest = {
accounts: {
tokenAccounts: {
account: [],
owner: [
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", // SPL Token program
],
filters: [
{ dataSize: 165 }, // Standard token account size
],
},
},
commitment: CommitmentLevel.CONFIRMED,
accountsDataSlice: [],
transactions: {},
transactionsStatus: {},
slots: {},
blocks: {},
blocksMeta: {},
entry: {},
};
accountsDataSlice ile Optimizasyon
Hesap verisinin yalnızca bir bölümüne ihtiyacınız varsa (örn. bir discriminator için ilk 64 bayt), bant genişliğini azaltmak için accountsDataSlice kullanın:
const request: SubscribeRequest = {
accounts: {
myFilter: {
account: ["AccountPubkeyHere"],
owner: [],
filters: [],
},
},
accountsDataSlice: [
{ offset: 0, length: 64 }, // Only receive the first 64 bytes
],
commitment: CommitmentLevel.CONFIRMED,
transactions: {},
transactionsStatus: {},
slots: {},
blocks: {},
blocksMeta: {},
entry: {},
};
Yaygın Kullanım Senaryoları
| Kullanım Senaryosu | Yaklaşım |
|---|
| Cüzdan bakiyesini takip etme | Belirli açık anahtarlarla account filtresi |
| Tüm token mint’lerini izleme | owner: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"] + dataSize: 82 filtresi |
| Belirli bir programın durumunu izleme | owner: ["YourProgramId"] filtresi |
| Yeni AMM havuzu oluşturulmasını tespit etme | Sahip + havuz hesap boyutuyla eşleşen dataSize filtresi |