Solana Geyser gRPC - Filtreler

Solana Stream SDK, açık kaynaklı yazılım olarak sunulur. Daha fazla ayrıntı için lütfen aşağıdaki GitHub deposunu ziyaret edin.
gRPC Filtrelerine Genel Bakış
Solana Geyser gRPC, belirli hesaplar, programlar, işlemler, slot'lar ve bloklar gibi yalnızca ilgilendiğiniz verileri verimli bir şekilde getirmek için filtreler kullanır.
Aşağıda, Solana Stream SDK kullanan TypeScript örnekleri sunuyor ve her filtrenin özel rollerini açıkça açıklıyoruz. Rust kullanırken filtrelerin yapısı ve anlamı aynıdır.
Her Filtrenin Rolü ve Örnekleri
Bir hesaba abone olma
Belirli bir hesabın gerçek zamanlı güncellemelerine abone olun. Aşağıdaki örnek, SOL-USDC OpenBook hesabına Confirmed commitment seviyesinde abone olur:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: { slots: {} },
accounts: {
'wsol/usdc': {
account: ['8BnEgHoWFysVcuFFX7QztDmzuH8r5ZFvyP3sYwn1XTh6'],
},
},
transactions: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.CONFIRMED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: { slots: {} },
accounts: {
'wsol/usdc': {
account: ['8BnEgHoWFysVcuFFX7QztDmzuH8r5ZFvyP3sYwn1XTh6'],
},
},
transactions: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.CONFIRMED,
}"wsol/usdc"istemci tarafından tanımlanan bir etikettir.- Hesaplar, programlar, bloklar ve slot'lar için birden fazla filtre tek bir JSON isteğinde birleştirilebilir.
account_data_slice ile bir hesaba abone olma
Bu örnek, hesap verilerinin yalnızca belirli bir bölümünün alınmasını gösterir. Bir USDC token hesabının verilerinin tamamını (165 bytes) getirmek yerine, offset 32'den başlayarak 40 bytes alır. Bu aralık, owner ve lamports bakiyesi gibi bilgileri içerir.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {
usdc: {
owner: ['TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'],
filters: [
{
tokenAccountState: true,
},
{
memcmp: {
offset: 0,
data: {
base58: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
},
},
},
],
},
},
transactions: {},
blocks: {},
blocksMeta: {},
entry: {},
commitment: CommitmentLevel.CONFIRMED,
accountsDataSlice: [{ offset: 32, length: 40 }],
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {
usdc: {
owner: ['TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'],
filters: [
{
tokenAccountState: true,
},
{
memcmp: {
offset: 0,
data: {
base58: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
},
},
},
],
},
},
transactions: {},
blocks: {},
blocksMeta: {},
entry: {},
commitment: CommitmentLevel.CONFIRMED,
accountsDataSlice: [{ offset: 32, length: 40 }],
}Bir programa abone olma
Bu örnek, belirli bir programla ilişkili hesap güncellemelerine abone olmayı gösterir.
Aşağıda, Solend programına ait hesapların hesap güncellemelerine
Processed commitment seviyesinde abone oluyoruz.typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {
solend: {
owner: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
},
},
transactions: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {
solend: {
owner: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
},
},
transactions: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}"solend"istemci tarafından serbestçe ayarlanabilen özel bir etikettir.- Birden fazla programa abone olmak için lütfen "Birden fazla programa abone olma" başlıklı bir sonraki bölüme bakın.
Birden fazla programa abone olma
Bu örnek, birden fazla programla ilişkili hesap güncellemelerine aynı anda nasıl abone olunacağını gösterir.
Aşağıdaki örnek, hem Solend hem de Serum programlarına ait hesapların güncellemelerine abone olur.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {
programs: {
owner: [
'So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo',
'9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin',
],
},
},
transactions: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {
programs: {
owner: [
'So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo',
'9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin',
],
},
},
transactions: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}Her programa ayrı ayrı etiket atamayı tercih ederseniz, aşağıdaki yaklaşımı kullanın:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {
solend: {
owner: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
},
serum: {
owner: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
},
},
transactions: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {
solend: {
owner: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
},
serum: {
owner: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
},
},
transactions: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}Oy dışı ve başarısız olmayan tüm finalize edilmiş işlemlere abone olma
Bu örnek, oy işlemleri ve başarısız işlemler hariç olmak üzere tüm işlemlere
Finalized commitment seviyesinde abone olmayı gösterir.typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {},
transactions: {
alltxs: {
vote: false,
failed: false,
},
},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.FINALIZED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {},
transactions: {
alltxs: {
vote: false,
failed: false,
},
},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.FINALIZED,
}vote: falseoy işlemlerini hariç tutar.failed: falsebaşarısız işlemleri hariç tutar.- Alanlar boş bırakılırsa, tüm işlemler alınır.
- Birden fazla alan belirtildiğinde, bunlar bir AND koşuluyla çalışır.
Bir hesaptan bahseden oy dışı işlemlere abone olma
Bu örnek, belirli bir hesabı içeren ancak oy işlemlerini hariç tutan işlemlere abone olmayı gösterir.
Aşağıdaki örnek, Serum programıyla ilişkili hesaplardan bahseden oy dışı işlemlere abone olur.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {},
transactions: {
serum: {
vote: false,
accountInclude: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
},
},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {},
transactions: {
serum: {
vote: false,
accountInclude: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
},
},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}Hesapları hariç tutan işlemlere abone olma
Bu örnek, belirli hesapları içeren işlemleri hariç tutan işlemlere abone olmayı gösterir.
Aşağıdaki örnek, Serum ve Tokenkeg programlarına ait herhangi bir hesabı hariç tutarak işlemleri alır.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {},
transactions: {
serum: {
accountExclude: [
'9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin',
'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
],
},
},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {},
transactions: {
serum: {
accountExclude: [
'9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin',
'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
],
},
},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}Hesaplardan bahseden ve belirli hesapları hariç tutan işlemlere abone olma
Bu örnek, belirli hesapları içeren işlemlere abone olmayı, aynı zamanda belirtilen diğer hesapları açıkça hariç tutmayı gösterir.
Aşağıdaki örnek, Serum'un hesabından bahseden işlemlere abone olur ancak belirtilen bir hesabı hariç tutar:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {},
transactions: {
serum: {
accountInclude: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
accountExclude: ['9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT'],
},
},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
slots: {},
},
accounts: {},
transactions: {
serum: {
accountInclude: ['9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin'],
accountExclude: ['9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT'],
},
},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}Bir işlem imzasına abone olma
Bu örnek, belirli bir işlem imzasının gerçek zamanlı güncellemelerine,
Confirmed veya Finalized durumuna ulaşana kadar abone olmayı gösterir.typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {},
transactions: {
sign: {
signature:
'5rp2hL9b6kexex11Mugfs3vfU9GhieKruj4CkFFSnu52WLxiGn4VcLLwsB62XURhMmT1j4CZiXT6FFtYbXsLq2Zs',
},
},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {},
transactions: {
sign: {
signature:
'5rp2hL9b6kexex11Mugfs3vfU9GhieKruj4CkFFSnu52WLxiGn4VcLLwsB62XURhMmT1j4CZiXT6FFtYbXsLq2Zs',
},
},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}Slot'lara abone olma
Bu örnek, gelen slot'ların bildirimlerine abone olmayı gösterir. Özel bir etiket adı atamanın ötesinde ek bir ayrıntı gerekmez:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
incoming_slots: {},
},
accounts: {},
transactions: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {
incoming_slots: {},
},
accounts: {},
transactions: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}Bloklara abone olma
Üretilen tüm blokların gerçek zamanlı güncellemelerine abone olun. Varsayılan olarak, bir blok içindeki tüm işlemler alınır:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {},
transactions: {},
blocks: {
blocks: {},
},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {},
transactions: {},
blocks: {
blocks: {},
},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}İşlemleri hariç tutup yalnızca güncellenmiş hesap bilgilerini almak için:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {},
transactions: {},
blocks: {
blocks: {
includeTransactions: false,
includeAccounts: true,
},
},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {},
transactions: {},
blocks: {
blocks: {
includeTransactions: false,
includeAccounts: true,
},
},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}Yalnızca belirli hesapları içeren işlemleri/hesapları almak için:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {},
transactions: {},
blocks: {
blocks: {
accountInclude: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
},
},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {},
transactions: {},
blocks: {
blocks: {
accountInclude: ['So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo'],
},
},
blocksMeta: {},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}Blok meta verilerine abone olma
Bloklar işlendiğinde yalnızca blok meta verisi bildirimlerine abone olun. Ayrıntılı işlem verileri dahil edilmez.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {},
transactions: {},
blocks: {},
blocksMeta: {
blockmetadata: {},
},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
const request = {
slots: {},
accounts: {},
transactions: {},
blocks: {},
blocksMeta: {
blockmetadata: {},
},
accountsDataSlice: [],
commitment: CommitmentLevel.PROCESSED,
}Commitment seviyelerini yönetme
Solana Geyser gRPC akışı, varsayılan olarak
Processed commitment seviyesini kullanır.Confirmed veya Finalized gibi daha yüksek commitment seviyelerini belirtebilirsiniz. Bu durumlarda, Geyser verileri arabelleğe alır ve belirtilen commitment seviyesine ulaşıldığında bildirimleri gönderir.Maksimum performans için, commitment seviyesi yönetiminin istemci tarafında ele alınması önerilir.
Commitment seviyelerinin nasıl belirtileceği şöyledir:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
enum CommitmentLevel {
PROCESSED = 0,
CONFIRMED = 1,
FINALIZED = 2,
}import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'
enum CommitmentLevel {
PROCESSED = 0,
CONFIRMED = 1,
FINALIZED = 2,
}PROCESSED: İşlendikten hemen sonraki veriler. Hızlı erişim, ancak henüz onaylanmamış.CONFIRMED: Cluster tarafından onaylanmış, daha yüksek kesinlik sağlayan veriler.FINALIZED: Yeniden düzenleme riski olmayan, tamamen finalize edilmiş veriler.
Processed seviyesinde çalışmanın avantajları
Processed commitment seviyesinin temel avantajı, işlemin hemen alınması olup hızlı istemci tarafı işlemeyi mümkün kılar. İstemciler ardından Confirmed veya Finalized durumlarına geçişleri tespit edebilir ve bu da hızlı yanıt verme imkânı sunar.Confirmed ve Finalized nasıl yönetilir
Confirmed veya Finalized seviyeleri kullanılırken, olaylar (işlemler veya hesap güncellemeleri) slot başına arabelleğe alınmalıdır.Olayları slot slot arabelleğe alın, slot bildirimlerine abone olun ve belirli bir slot istenen commitment seviyesine (
Confirmed veya Finalized) ulaştığında olayları arabellekten serbest bırakın.Olaylar başlangıçta, bir slot
Confirmed veya Finalized durumuna ulaşmadan önce alınır.Finalized ile ilgili özel durum
Solana Geyser spesifikasyonları nedeniyle, tüm slot'lar açık finalize bildirimleri almaz. Bu nedenle, bir slot için finalize bildirimi aldığınızda, açıkça bildirim alınmamış olsa bile tüm ata slot'ları finalize edilmiş olarak kabul etmelisiniz.
Özellikle, bir finalize bildirimi aldığınızda, tüm ata slot'ları geriye dönük olarak finalize edilmiş kabul edin.






