Ana içeriğe atla

Girişler Nedir?

Girişler, bir Solana bloğu içindeki temel yürütme birimleridir. Her blok, sıralı olarak yürütülen bir işlem grubunu içeren bir veya daha fazla girişten oluşur. Girişler, blok verisinin en ayrıntılı düzeyini temsil eder — blokların altında ve bireysel işlemlerin üstünde. Girişleri izlemek şu durumlarda kullanışlıdır:
  • Hassas işlem sıralamasına ihtiyaç duyan özel blok ayrıştırıcıları oluşturma
  • Bir blok içindeki yürütme sırasını yeniden oluşturma
  • Bir slot içindeki belirli işlemlerin düşük gecikmeli tespiti
Çoğu kullanım senaryosunda işlem veya blok abonelikleri daha basittir. Blok altı ayrıntı düzeyine ihtiyaç duyduğunuzda veya girişleri doğrudan işleyen altyapı oluşturduğunuzda (örn. özel bir defter ayrıştırıcısı) giriş izlemeyi kullanın.

Filtre Parametreleri

Giriş abonelikleri, içerik tabanlı filtreleri desteklemez — abone olunan taahhüt düzeyi için tüm girişleri alırsınız. Tek yapılandırma, abonelik isteğinde belirlenen taahhüt düzeyidir.

Örnek: Tüm Girişleri Akış Olarak Alma

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": 1024 * 1024 * 1024, // 1 GiB
});

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

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

  stream.on("data", (data) => {
    if (data.entry) {
      const { slot, index, numHashes, hash, transactions, startingTransactionIndex } = data.entry;
      console.log(`Entry [slot ${slot}, index ${index}]:`);
      console.log(`  Hash: ${Buffer.from(hash).toString("base64")}`);
      console.log(`  Num hashes: ${numHashes}`);
      console.log(`  Transactions in entry: ${transactions?.length ?? 0}`);
      console.log(`  Starting tx index: ${startingTransactionIndex}`);
    } else if (data.pong) {
      console.log("Pong received");
    }
  });

  const request: SubscribeRequest = {
    entry: {
      entryStream: {},
    },
    commitment: CommitmentLevel.PROCESSED,
    accounts: {},
    accountsDataSlice: [],
    transactions: {},
    transactionsStatus: {},
    slots: {},
    blocks: {},
    blocksMeta: {},
    ping: { id: 1 },
  };

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

  setInterval(() => {
    stream.write({ ping: { id: 1 }, accounts: {}, accountsDataSlice: [], transactions: {}, transactionsStatus: {}, slots: {}, blocks: {}, blocksMeta: {}, entry: {} }, () => {});
  }, PING_INTERVAL_MS);

  await streamClosed;
}

main();

Giriş Veri Alanları

AlanTürAçıklama
slotuint64Bu girişin ait olduğu slot
indexuint64Bu girişin slot içindeki konumu (0’dan başlar)
numHashesuint64Önceki girişten bu yana PoH hash sayısı
hashbytesBu giriş için PoH hash’i
transactionsConfirmedTransaction[]Bu girişe dahil edilen işlemler
startingTransactionIndexuint64Bu girişin blok içindeki ilk işleminin indeksi

Girişleri Diğer Aboneliklerle Birleştirme

Girişlere nadiren tek başına abone olunur. Yaygın bir desen, bir slot’un ne zaman kesinleştiğini bilmek ve ardından girişlerini işlemek için giriş aboneliğini slot aboneliğiyle birleştirmektir:
const request: SubscribeRequest = {
  entry: {
    entryStream: {},
  },
  slots: {
    slotUpdates: {
      filterByCommitment: true,
    },
  },
  commitment: CommitmentLevel.CONFIRMED,
  accounts: {},
  accountsDataSlice: [],
  transactions: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
};
Bu, slot başına girişleri tamponlamanıza ve slot hedef taahhüt düzeyine ulaştığında bunları atomik olarak işlemenize olanak tanır.