Ön Koşullar
İhtiyacınız olanlar:
Node.js 18+ (veya Rust istemcisi için Rust ortamı)
OrbitFlare gRPC uç nokta URL’si ve token’ı (Lisanslar bölümündeki Pano ’dan edinilebilir)
Kurulum
Resmi Yellowstone gRPC TypeScript istemcisini yükleyin:
npm install @triton-one/yellowstone-grpc
Veya yarn ile:
yarn add @triton-one/yellowstone-grpc
Uç Noktanıza Bağlanın
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 client = new Client ( GRPC_URL , X_TOKEN , {
"grpc.max_receive_message_length" : 64 * 1024 * 1024 , // 64 MiB
});
gRPC URL’niz ve token’ınız OrbitFlare Panosu’nun Lisanslar bölümünde bulunur. Token, new Client()’ın ikinci argümanı olarak iletilir — TypeScript istemcisinde bir HTTP başlığı değildir.
Akış Açın
const stream = await client . subscribe ();
// Handle errors and stream lifecycle
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 ());
});
// Handle incoming data
stream . on ( "data" , ( data ) => {
if ( data . slot ) {
console . log ( "Slot update:" , data . slot . slot );
} else if ( data . transaction ) {
console . log ( "Transaction:" , data . transaction );
} else if ( data . account ) {
console . log ( "Account update:" , data . account );
} else if ( data . pong ) {
console . log ( "Pong received" );
}
});
İlk Aboneliğinizi Gönderin
confirmed taahhüt düzeyinde tüm slot güncellemelerine abone olun:
const subscribeRequest : SubscribeRequest = {
slots: {
slot: { filterByCommitment: true },
},
commitment: CommitmentLevel . CONFIRMED ,
accounts: {},
accountsDataSlice: [],
transactions: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
entry: {},
};
await new Promise < void >(( resolve , reject ) => {
stream . write ( subscribeRequest , ( err ) => {
if ( err == null ) resolve ();
else reject ( err );
});
});
// Wait for the stream to close
await streamClosed ;
Bağlantıyı Canlı Tutun
Bulut yük dengeleyicileri, yaklaşık 10 dakika sonra boşta kalan gRPC bağlantılarını sonlandırır. Her 30 saniyede bir ping gönderin:
const pingRequest : SubscribeRequest = {
ping: { id: 1 },
accounts: {},
accountsDataSlice: [],
transactions: {},
transactionsStatus: {},
blocks: {},
blocksMeta: {},
slots: {},
entry: {},
};
const pingInterval = setInterval ( async () => {
await new Promise < void >(( resolve , reject ) => {
stream . write ( pingRequest , ( err ) => {
if ( err == null ) resolve ();
else reject ( err );
});
});
}, 30_000 );
// Clear the interval when the stream closes
streamClosed . finally (() => clearInterval ( pingInterval ));
Yeniden Bağlanma
Üretim uygulamaları için üstel geri alma ile otomatik yeniden bağlanma uygulayın:
async function connectWithRetry ( maxRetries = 10 ) {
let attempt = 0 ;
let delay = 1000 ;
while ( attempt < maxRetries ) {
try {
const stream = await client . subscribe ();
// ... attach handlers and send subscription
await streamClosed ; // waits until stream closes
break ; // clean exit
} catch ( err ) {
attempt ++ ;
console . error ( `Stream error (attempt ${ attempt } ):` , err );
if ( attempt >= maxRetries ) throw err ;
await new Promise (( r ) => setTimeout ( r , delay ));
delay = Math . min ( delay * 2 , 30_000 ); // max 30s backoff
}
}
}
Sonraki Adımlar
Hesap İzleme Token bakiyelerini, cüzdan değişikliklerini ve program hesabı güncellemelerini akış olarak alın.
İşlem İzleme Canlı işlemleri programa veya hesaba göre filtreleyin ve işleyin.
Slotlar ve Bloklar Konsensüs ilerlemesini ve tam blok verisini takip edin.
Giriş İzleme Düşük seviyeli blok girişlerine erişin.