---
title: "Solana Geyser gRPC - Filtreler"
description: "SLV - Solana Geyser gRPC - Filtreler"
canonical: "https://erpc.global/tr/doc/geyser-grpc/filter/"
locale: "tr"
---

# Solana Geyser gRPC - Filtreler

![Solana Stream SDK](https://storage.validators.solutions/SolanaStreamSDK.jpg)

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.

[https://github.com/ValidatorsDAO/solana-stream](https://github.com/ValidatorsDAO/solana-stream)

### 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.

## Mevcut Shared plan filtre kuralları

Mevcut Shared planında, `accountInclude` ile daraltılmış veya işlemleri hariç tutan istekler dahil, boş olmayan her `blocks` eşlemesi yalnızca Dedicated planda kullanılabilir. Gereksinimi karşılıyorsa bir işlem aboneliği veya `blocksMeta` kullanın; ikisi de tam bloğun eşdeğeri değildir. Tam bloklar için Dedicated Geyser gRPC stream'i gerekir.

Her hesap filtresi girdisi `account`, `owner` veya desteklenen bir cuckoo filtresi içermelidir. Tek başına bir `memcmp` veya `dataSize` koşulu, desteklenen bir hesap yapısı seçmez. İsteği bu seçicilerden biriyle daraltın ya da tam bir hesap stream'i gerektiğinde Dedicated Geyser gRPC kullanın.

## 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 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 }],
}
```

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

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

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

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

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

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

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

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

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

### Bloklara abone olma (mevcut Shared planında Dedicated-only)

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

#### İşlemleri hariç tutup yalnızca güncellenmiş hesap bilgilerini almak için (mevcut Shared planında Dedicated-only):

```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 (mevcut Shared planında Dedicated-only):

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

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

- **`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.
