Ana içeriğe atla

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

ParametreTürAçıklama
accountstring[]İzlenecek belirli hesap açık anahtarları. Listedeki herhangi biriyle eşleşir (mantıksal VEYA).
ownerstring[]Bu program kimliklerine ait tüm hesapları izle (mantıksal VEYA).
filtersobject[]Ek veri filtreleri — dataSize ve/veya memcmp (mantıksal VE).
nonemptyTxnSignaturebooleanYalnı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 SenaryosuYaklaşım
Cüzdan bakiyesini takip etmeBelirli açık anahtarlarla account filtresi
Tüm token mint’lerini izlemeowner: ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"] + dataSize: 82 filtresi
Belirli bir programın durumunu izlemeowner: ["YourProgramId"] filtresi
Yeni AMM havuzu oluşturulmasını tespit etmeSahip + havuz hesap boyutuyla eşleşen dataSize filtresi