Solana Geyser gRPC - Filter

The Solana Stream SDK disediakan sebagai perangkat lunak open-source. Untuk rincian lebih lanjut, silakan kunjungi GitHub repositori di bawah.
Perbaikan gRPC Filter
Solana Geyser gRPC menggunakan filter untuk secara efisien mengambil hanya data yang menarik bagi Anda, seperti akun tertentu, program, transaksi, slot, dan blok.
Di bawah ini, kami menyediakan TypeScript contoh menggunakan Solana Stream SDK, jelas menjelaskan peran spesifik dari setiap filter. Struktur dan makna dari filter identik ketika menggunakan Rust.
Baris dan Contoh Setiap Penyaring
Berlangganan ke akun
Berlangganan update waktu untuk akun spesifik. Contoh berikut subscripts ke akun SOL- USDC OpenBook di tingkat komitmen yang dikonfirmasi:
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"adalah sebuah label yang didefinisikan oleh klien.- Beberapa filter untuk akun, program, blok, dan slot dapat dikombinasikan dalam satu permintaan JSON.
Berlangganan akun dengan account_data_slice
Contoh ini menunjukkan hanya mengambil sebagian data akun tertentu. Alih-alih mengambil seluruh data (165 byte) dari akun token USDC, ia mengambil 40 byte dari ofset 32. Jangkauan ini termasuk informasi seperti pemilik dan keseimbangan lamports.
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 }],
}Berlangganan ke suatu program
Contoh ini menunjukkan subscribing untuk update akun yang terkait dengan program tertentu.
Di bawah ini, kami berlangganan untuk akun pembaruan untuk akun yang dimiliki oleh program Solend di
Processed Tingkat komitmen.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"adalah label kustom yang dapat diatur secara bebas oleh klien.- Untuk berlangganan ke beberapa program, mohon mengacu ke bagian berikutnya berjudul "Berlangganan ke beberapa program".
Berlangganan ke beberapa program
Contoh ini menunjukkan bagaimana berlangganan untuk menghubungkan pemutakhiran dengan beberapa program sekaligus.
Contoh di bawah subguru untuk update untuk akun yang dimiliki oleh baik program Solend dan Serum.
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,
}Jika Anda lebih suka menugaskan label individu ke setiap program, gunakan pendekatan berikut:
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,
}Berlangganan semua pilihan non- terfinalisasi dan transaksi yang tidak-gagal
Contoh ini menunjukkan subscribing untuk semua transaksi di
Finalized tingkat komitmen, termasuk transaksi suara dan transaksi yang gagal.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: falsejangan sampai melakukan transaksi suara.failed: falsetidak termasuk transaksi yang gagal.- Jika ladang kosong, semua transaksi akan diambil.
- Ketika beberapa bidang yang ditentukan, mereka beroperasi dengan kondisi AND.
Berlangganan transaksi tidak memilih menyebutkan akun
Contoh ini menunjukkan subscribing untuk transaksi yang melibatkan akun tertentu tapi mengecualikan transaksi suara.
Contoh di bawah subguru untuk transaksi suara yang tidak menyebutkan akun yang berhubungan dengan program Serum.
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,
}Berlangganan ke transaksi excluding account
Contoh ini menunjukkan subscribing untuk transaksi tidak termasuk mereka yang melibatkan akun tertentu.
Contoh di bawah ini mengambil transaksi yang tidak termasuk rekening yang dimiliki oleh program Serum dan Topengracks.
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,
}Berlangganan transaksi menyebutkan akun & excluding certain account
Contoh ini menunjukkan subscribing untuk transaksi yang melibatkan akun tertentu, sementara secara eksplisit mengecualikan akun lain yang dinyatakan.
Contoh di bawah subguru untuk transaksi menyebutkan akun Serum ini tetapi tidak termasuk akun tertentu:
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,
}Berlangganan ke tanda tangan transaksi
Contoh ini menunjukkan subscribing ke pemutakhiran waktu real untuk tanda transaksi tertentu, sampai mencapai
Confirmed or Finalized Negara.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,
}Berlangganan ke slot
Contoh ini menunjukkan langganan pemberitahuan dari slot yang masuk. Tak ada rincian tambahan yang diperlukan selain mendata nama tag gubahan:
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,
}Berlangganan ke blok
Berlangganan pemutakhiran real-time dari semua blok yang dihasilkan. Secara baku, semua transaksi dalam sebuah blok akan diambil:
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,
}Untuk mengecualikan transaksi dan hanya mengambil informasi akun yang dimutakhirkan:
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,
}Untuk hanya mengambil transaksi / akun yang melibatkan akun tertentu:
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,
}Berlangganan ke blok metadata
Berlangganan hanya untuk memblokir pemberitahuan metadata ketika blok diproses. Data transaksi yang dikurangi tidak termasuk.
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,
}Mengatur tingkat komitmen
The Solana Geyser gRPC stream default ke
Processed Tingkat komitmen.Anda dapat menentukan tingkat komitmen yang lebih tinggi seperti
Confirmed or FinalizedDalam kasus ini, Geyser buffer data dan mengirimkan pemberitahuan setelah tingkat komitmen yang ditentukan dicapai.Untuk kinerja maksimum, disarankan untuk menangani manajemen tingkat komitmen di sisi klien.
Begini cara menentukan tingkat komitmen:
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,
}- **
PROCESSEDSegera data setelah pemrosesan. - **
CONFIRMEDData dikonfirmasi oleh kelompok, yang memberikan peningkatan kepastian. - **
FINALIZEDData terfinalisasi penuh tanpa resiko untuk reorganisasi.
Keuntungan bekerja di Processed
Keuntungan utama dari
Processed tingkat komitmen adalah penerimaan transaksi langsung, memungkinkan pemrosesan sisi klien dengan cepat. Klien dapat mendeteksi transisi ke Confirmed or Finalized, menawarkan responsif cepat.Bagaimana mengelola Confirmed dan Finalized
Ketika menggunakan
Confirmed or Finalized tingkat, kejadian (transaksi atau update akun) seharusnya disangga setiap slot.Buffer event slot demi slot, subscribe to slot notifications, and release event from the buffer once a specific slot reaches the desired compliment (
Confirmed or Finalized).Kejadian pada awalnya akan diterima sebelum sebuah slot mencapai
Confirmed or Finalized.Hal khusus tentang Finalized
Karena Solana Spesifikasi Geyser, tidak semua slot menerima pemberitahuan terakhir. walaupun tidak ada pemberitahuan yang diterima secara eksplisit.
Secara khusus, setelah menerima pemberitahuan terfinalisasi, secara retroaktif memperlakukan semua nenek moyang sebagai akhir.