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ı
| Alan | Tür | Açıklama |
|---|
slot | uint64 | Bu girişin ait olduğu slot |
index | uint64 | Bu girişin slot içindeki konumu (0’dan başlar) |
numHashes | uint64 | Önceki girişten bu yana PoH hash sayısı |
hash | bytes | Bu giriş için PoH hash’i |
transactions | ConfirmedTransaction[] | Bu girişe dahil edilen işlemler |
startingTransactionIndex | uint64 | Bu 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.