Solana Geyser gRPC - Filtreler

Solana Stream SDK
Solana Stream SDK açık kaynak yazılım olarak sunulmaktadır. Daha fazla bilgi için lütfen aşağıdaki GitHub deposunu ziyaret edin.

gRPC Filtrelerine Genel Bakış

Solana Geyser gRPC, belirli hesaplar, programlar, işlemler, slotlar ve bloklar gibi yalnızca ilgilendiğiniz verileri verimli şekilde almak için filtreler kullanır.
Aşağıda Solana Stream SDK kullanan TypeScript örnekleriyle her filtrenin rolünü açıkça anlatıyoruz. Rust kullanırken de 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,
}
  • "wsol/usdc", istemci tarafından tanımlanan bir etikettir.
  • Hesaplar, programlar, bloklar ve slotlar 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 nasıl alınacağını gösterir. Bir USDC token hesabının tüm verisini (165 bayt) almak yerine, offset 32'den başlayan 40 baytı alır. Bu aralık, sahip 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 }],
}

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 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,
}
  • "solend", istemcinin serbestçe belirleyebileceği özel bir etikettir.
  • Birden fazla programa abone olmak için lütfen "Birden fazla programa abone olma" başlıklı sonraki bölüme bakın.

Birden fazla programa abone olma

Bu örnek, birden fazla programla ilişkili hesap güncellemelerine tek seferde 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,
}
Her programa ayrı bir 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,
}

Kesinleşmiş, oy işlemi olmayan ve başarısız olmayan tüm işlemlere abone olma

Bu örnek, oy işlemleri ve başarısız işlemler hariç, Finalized commitment seviyesindeki tüm işlemlere 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,
}
  • vote: false, oy işlemlerini hariç tutar.
  • failed: false, baş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, alanlar AND koşuluyla çalışır.

Bir hesaptan bahseden, oy işlemi olmayan işlemlere abone olma

Bu örnek, oy işlemleri hariç, belirli bir hesabı içeren işlemlere abone olmayı gösterir.
Aşağıdaki örnek, Serum programıyla ilişkili hesaplardan bahseden, oy işlemi olmayan 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,
}

Hesapları hariç tutarak işlemlere abone olma

Bu örnek, belirli hesapları içeren işlemler hariç işlemlere abone olmayı gösterir.
Aşağıdaki örnek, Serum ve Tokenkeg programlarına ait tüm hesapları 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,
}

Hesaplardan bahseden ve belirli hesapları hariç tutan işlemlere abone olma

Bu örnek, belirtilen diğer hesapları açıkça hariç tutarken belirli hesapları içeren işlemlere abone olmayı 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,
}

Bir işlem imzasına abone olma

Bu örnek, belirli bir işlem imzası Confirmed veya Finalized durumuna ulaşana kadar onun gerçek zamanlı güncellemelerine 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,
}

Slotlara abone olma

Bu örnek, gelen slotların bildirimlerine abone olmayı gösterir. Özel bir etiket adı atamak dışında 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,
}

Bloklara abone olma

Üretilen tüm blokların gerçek zamanlı güncellemelerine abone olun. Varsayılan olarak bir bloktaki 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,
}

İşlemleri hariç tutup yalnızca güncellenen 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,
}

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,
}

Blok metadata'sına abone olma

Bloklar işlendiğinde yalnızca blok metadata bildirimlerine abone olun. Ayrıntılı işlem verileri dahil değildir.
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

const request = {
  slots: {},
  accounts: {},
  transactions: {},
  blocks: {},
  blocksMeta: {
    blockmetadata: {},
  },
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
}

Commitment seviyelerinin yönetimi

Solana Geyser gRPC akışı varsayılan olarak Processed commitment seviyesini kullanır.
Confirmed veya Finalized gibi daha yüksek commitment seviyeleri belirtebilirsiniz. Bu durumlarda Geyser verileri arabelleğe alır ve belirtilen commitment seviyesine ulaşıldığında bildirim gönderir.
En yüksek performans için commitment seviyesi yönetiminin istemci tarafında yapılması önerilir.
Commitment seviyeleri şu şekilde belirtilir:
typescript
import { CommitmentLevel } from '@validators-dao/solana-stream-sdk'

enum CommitmentLevel {
  PROCESSED = 0,
  CONFIRMED = 1,
  FINALIZED = 2,
}
  • PROCESSED: İşlendikten hemen sonraki veriler. Hızlı alınır ancak henüz onaylanmamıştır.
  • CONFIRMED: Küme tarafından onaylanmış veriler; daha yüksek kesinlik sağlar.
  • FINALIZED: Yeniden düzenlenme riski olmayan, tamamen kesinleşmiş veriler.

Processed seviyesinde çalışmanın avantajları

Processed commitment seviyesinin temel avantajı, işlemlerin anında alınması ve böylece istemci tarafında hızlı işleme yapılabilmesidir. İstemciler ardından Confirmed veya Finalized durumuna geçişleri tespit edebilir; bu da hızlı yanıt verebilirlik sağlar.

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ı her slot için ayrı ayrı 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 ilk olarak, slot Confirmed veya Finalized seviyesine ulaşmadan önce alınır.

Finalized ile ilgili özel durum

Solana Geyser'ın spesifikasyonları nedeniyle her slot için açık bir finalized bildirimi gelmez. Bu nedenle bir slot için finalized bildirimi aldığınızda, açıkça bildirim gelmemiş olsa bile tüm ata slotları finalized olarak kabul etmelisiniz.
Somut olarak, bir finalized bildirimi aldığınızda tüm ata slotları geriye dönük olarak finalized kabul edin.