Solana Geyser gRPC - Filters

De Solana Stream SDK wordt aangeboden als open-source software. Bezoek voor meer informatie de onderstaande GitHub-repository.
Overzicht van gRPC-filters
Solana Geyser gRPC gebruikt filters om efficient alleen de gegevens op te halen waarin u geinteresseerd bent, zoals specifieke accounts, programma's, transacties, slots en blokken.
Hieronder geven we TypeScript-voorbeelden met de Solana Stream SDK, met duidelijke uitleg over de specifieke rollen van elk filter. De structuur en betekenis van de filters zijn identiek bij gebruik van Rust.
Rollen en voorbeelden van elk filter
Abonneren op een account
Abonneer op realtime updates voor een specifiek account. Het volgende voorbeeld abonneert op het SOL-USDC OpenBook-account op het Confirmed commitment-niveau:
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"is een door de client gedefinieerd label.- Meerdere filters voor accounts, programma's, blokken en slots kunnen worden gecombineerd in een enkel JSON-verzoek.
Abonneren op een account met account_data_slice
Dit voorbeeld demonstreert het ophalen van slechts een specifiek deel van accountgegevens. In plaats van de volledige gegevens (165 bytes) van een USDC-tokenaccount op te halen, worden 40 bytes opgehaald vanaf offset 32. Dit bereik bevat informatie zoals de eigenaar en het lamports-saldo.
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 }],
}Abonneren op een programma
Dit voorbeeld demonstreert het abonneren op accountupdates die zijn gekoppeld aan een specifiek programma.
Hieronder abonneren we op accountupdates voor accounts die eigendom zijn van het Solend-programma op het
Processed commitment-niveau.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"is een aangepast label dat vrij kan worden ingesteld door de client.- Om op meerdere programma's te abonneren, raadpleeg het volgende gedeelte "Abonneren op meerdere programma's."
Abonneren op meerdere programma's
Dit voorbeeld demonstreert hoe u zich tegelijkertijd kunt abonneren op accountupdates die gekoppeld zijn aan meerdere programma's.
Het onderstaande voorbeeld abonneert op updates voor accounts die eigendom zijn van zowel Solend- als Serum-programma's.
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,
}Als u de voorkeur geeft aan individuele labels voor elk programma, gebruik dan de volgende aanpak:
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,
}Abonneren op alle gefinaliseerde niet-vote en niet-gefaalde transacties
Dit voorbeeld demonstreert het abonneren op alle transacties op het
Finalized commitment-niveau, met uitzondering van vote-transacties en gefaalde transacties.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: falsesluit vote-transacties uit.failed: falsesluit gefaalde transacties uit.- Als velden leeg worden gelaten, worden alle transacties opgehaald.
- Wanneer meerdere velden worden opgegeven, werken ze met een AND-conditie.
Abonneren op niet-vote transacties die een account vermelden
Dit voorbeeld demonstreert het abonneren op transacties die betrekking hebben op een specifiek account, maar met uitsluiting van vote-transacties.
Het onderstaande voorbeeld abonneert op niet-vote transacties die accounts vermelden die gekoppeld zijn aan het Serum-programma.
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,
}Abonneren op transacties met uitsluiting van accounts
Dit voorbeeld demonstreert het abonneren op transacties met uitsluiting van transacties die betrekking hebben op specifieke accounts.
Het onderstaande voorbeeld haalt transacties op met uitsluiting van accounts die eigendom zijn van de Serum- en Tokenkeg-programma's.
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,
}Abonneren op transacties die accounts vermelden en bepaalde accounts uitsluiten
Dit voorbeeld demonstreert het abonneren op transacties die betrekking hebben op bepaalde accounts, terwijl andere opgegeven accounts expliciet worden uitgesloten.
Het onderstaande voorbeeld abonneert op transacties die Serum's account vermelden, maar sluit een opgegeven account uit:
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,
}Abonneren op een transactiehandtekening
Dit voorbeeld demonstreert het abonneren op realtime updates voor een specifieke transactiehandtekening, totdat deze de
Confirmed of Finalized status bereikt.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,
}Abonneren op slots
Dit voorbeeld demonstreert het abonneren op meldingen van binnenkomende slots. Geen aanvullende details zijn vereist naast het toewijzen van een aangepaste tagnaam:
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,
}Abonneren op blokken
Abonneer op realtime updates van alle gegenereerde blokken. Standaard worden alle transacties binnen een blok opgehaald:
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,
}Om transacties uit te sluiten en alleen bijgewerkte accountinformatie op te halen:
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,
}Om alleen transacties/accounts op te halen die betrekking hebben op specifieke accounts:
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,
}Abonneren op blokmetadata
Abonneer alleen op blokmetadata-meldingen wanneer blokken worden verwerkt. Gedetailleerde transactiegegevens zijn niet inbegrepen.
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-niveaus beheren
De Solana Geyser gRPC-stream gebruikt standaard het
Processed commitment-niveau.U kunt hogere commitment-niveaus opgeven zoals
Confirmed of Finalized. In deze gevallen buffert Geyser de gegevens en stuurt meldingen zodra het opgegeven commitment-niveau is bereikt.Voor maximale prestaties wordt aanbevolen om het beheer van commitment-niveaus aan de clientzijde af te handelen.
Zo specificeert u commitment-niveaus:
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: Directe gegevens na verwerking. Snel ophalen, maar nog niet bevestigd.CONFIRMED: Gegevens bevestigd door het cluster, wat meer zekerheid biedt.FINALIZED: Volledig gefinaliseerde gegevens zonder risico op reorganisatie.
Voordelen van werken op Processed
Het belangrijkste voordeel van het
Processed commitment-niveau is het direct ophalen van transacties, wat snelle verwerking aan de clientzijde mogelijk maakt. Clients kunnen vervolgens overgangen naar Confirmed of Finalized detecteren, wat snelle responsiviteit biedt.Hoe Confirmed en Finalized te beheren
Bij gebruik van
Confirmed of Finalized niveaus moeten events (transacties of accountupdates) per slot worden gebufferd.Buffer events slot voor slot, abonneer op slot-meldingen en geef events vrij uit de buffer zodra een specifiek slot het gewenste commitment (
Confirmed of Finalized) bereikt.Events worden aanvankelijk ontvangen voordat een slot
Confirmed of Finalized bereikt.Het bijzondere aan Finalized
Vanwege Solana Geyser-specificaties ontvangen niet alle slots expliciete gefinaliseerde meldingen. Daarom moet u, wanneer u een gefinaliseerde melding voor een slot ontvangt, alle voorouder-slots als gefinaliseerd behandelen, zelfs als er geen expliciete meldingen zijn ontvangen.
Specifiek, bij ontvangst van een gefinaliseerde melding, behandel retroactief alle voorouder-slots als gefinaliseerd.