Solana Geyser gRPC - Filter

Das Solana Stream SDK wird als Open-Source-Software bereitgestellt. Weitere Informationen finden Sie im GitHub Repository unten.
Übersicht der gRPC Filter
Solana Geyser gRPC verwendet Filter, um nur die von Ihnen interessierten Daten effizient abzuholen, wie z. B. bestimmte Konten, Programme, Transaktionen, Slots und Blöcke.
Im Folgenden stellen wir TypeScript-Beispiele mit dem Solana Stream SDK zur Verfügung, die die spezifischen Rollen jedes Filters deutlich erklären. Struktur und Bedeutung der Filter sind bei der Verwendung von Rust identisch.
Rollen und Beispiele für jeden Filter
Konto anmelden
Abonnieren Sie Echtzeit-Updates für ein bestimmtes Konto. Das folgende Beispiel abonniert das SOL-USDC Open Book-Konto auf der bestätigten Verpflichtungsebene:
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"ist ein Client-definiertes Etikett.- Mehrere Filter für Konten, Programme, Blöcke und Slots können in einer einzigen JSON-Anfrage kombiniert werden.
Abonnieren eines Kontos mit account_data_slice
Dieses Beispiel zeigt das Abrufen nur eines bestimmten Teils von Kontodaten. Anstatt die gesamten Daten (165 Bytes) eines USDC-Token-Accounts abzuholen, werden 40 Bytes ab Offset 32 abgerufen. Dieser Bereich umfasst Informationen wie Eigentümer und Lampenwaage.
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 }],
}Abonnieren eines Programms
Dieses Beispiel zeigt die Anmeldung von Kontoaktualisierungen, die mit einem bestimmten Programm verbunden sind.
Im Folgenden abonnieren wir Konto-Updates für Konten im Besitz des Programms Solend bei der
Processed Einsatzniveau.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"ist ein benutzerdefiniertes Label, das vom Client frei eingestellt werden kann.- Um mehrere Programme zu abonnieren, lesen Sie bitte den nächsten Abschnitt mit dem Titel "Abonnieren Sie mehrere Programme."
Abonnieren Sie mehrere Programme
Dieses Beispiel zeigt, wie man Konto-Updates mit mehreren Programmen gleichzeitig abonniert.
Das untenstehende Beispiel abonniert Updates für Konten, die sowohl im Besitz von Solend- als auch von Serum-Programmen sind.
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,
}Wenn Sie es vorziehen, einzelne Etiketten jedem Programm zuzuordnen, verwenden Sie den folgenden Ansatz:
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,
}Abonnieren Sie alle abgeschlossenen nicht abgerufenen und nicht verfehlten Transaktionen
Dieses Beispiel zeigt die Anmeldung aller Transaktionen an der
Finalized Verpflichtungsniveau, ohne Stimmrechtstransaktionen und fehlgeschlagene Transaktionen.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: falseschließt Vote-Transaktionen aus.failed: falseschließt fehlgeschlagene Transaktionen aus.- Wenn Felder leer gelassen werden, werden alle Transaktionen abgerufen.
- Wenn mehrere Felder angegeben sind, arbeiten sie mit einem UND-Zustand.
Abonnieren Sie Non-vote-Transaktionen, die ein Konto erwähnen
Dieses Beispiel zeigt die Anmeldung von Transaktionen mit einem bestimmten Konto, jedoch ohne Abstimmungstransaktionen.
Das nachfolgende Beispiel abonniert Non-vote-Transaktionen, die Konten im Zusammenhang mit dem Serum-Programm erwähnen.
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,
}Abonnieren von Transaktionen ohne Konten
Dieses Beispiel zeigt die Anmeldung von Transaktionen mit Ausnahme von Transaktionen mit spezifischen Konten.
Das nachfolgende Beispiel ruft Transaktionen ab, ohne dass die Konten im Besitz der Programme Serum und Tokenkeg sind.
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,
}Abonnieren von Transaktionen, die Konten erwähnen und bestimmte Konten ausschließen
Dieses Beispiel zeigt die Anmeldung von Transaktionen mit bestimmten Konten, wobei andere Konten explizit ausgeschlossen werden.
Das nachfolgende Beispiel abonniert Transaktionen, die Serums Konto erwähnen, jedoch ein bestimmtes Konto ausschließen:
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,
}Abonnieren einer Transaktionssignatur
Dieses Beispiel zeigt die Anmeldung von Echtzeit-Updates für eine bestimmte Transaktionssignatur, bis es die
Confirmed oder Finalized Zustand.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,
}Abonnieren von Slots
Dieses Beispiel zeigt die Anmeldung von Meldungen von eingehenden Slots. Es sind keine zusätzlichen Details erforderlich, die einen benutzerdefinierten Tagsnamen zuordnen:
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,
}Blocks abonnieren
Abonnieren Sie Echtzeit-Updates aller generierten Blöcke. Standardmäßig werden alle Transaktionen innerhalb eines Blocks abgerufen:
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,
}Um Transaktionen auszuschließen und nur aktualisierte Kontoinformationen abzurufen:
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,
}Nur Transaktionen abrufen/accounts mit spezifischen Konten:
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,
}Metadaten blockieren
Abonnieren Sie nur, um Metadaten-Benachrichtigungen zu blockieren, wenn Blöcke verarbeitet werden. Detaillierte Transaktionsdaten sind nicht enthalten.
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,
}Engagement Levels verwalten
Der Solana Geyser gRPC-Stream setzt sich aus dem
Processed Einsatzniveau.Sie können höhere Engagements wie
Confirmed oder FinalizedIn diesen Fällen puffert Geyser die Daten und sendet Meldungen, sobald die angegebene Verpflichtungsstufe erreicht ist.Für maximale Leistung wird empfohlen, das Engagement-Level-Management auf der Kundenseite zu bewältigen.
Hier ist, wie man Engagement Levels angibt:
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: Sofortige Daten nach der Verarbeitung. Schnelles Abrufen, aber noch nicht bestätigt. - *
CONFIRMED: Daten, die durch den Cluster bestätigt werden und erhöhte Sicherheit bieten. - *
FINALIZED: Vollständig abgeschlossene Daten ohne Risiko einer Neuorganisation.
Vorteile der Arbeit an Processed
Der Hauptvorteil des
Processed Das Engagement Level ist eine sofortige Transaktionsabrufung, die eine schnelle clientseitige Verarbeitung ermöglicht. Clients können anschließend Übergänge zu Confirmed oder Finalized, bietet schnelle Reaktionsfähigkeit.Wie zu verwalten Confirmed und Finalized
Bei Verwendung
Confirmed oder Finalized Levels, Ereignisse (Transaktionen oder Kontoupdates) sollten pro Slot gepuffert werden.Buffer Events Slot per Slot, abonnieren Sie Slot-Benachrichtigungen und veröffentlichen Sie Ereignisse aus dem Puffer, sobald ein bestimmter Slot das gewünschte Engagement erreicht (
Confirmed oder Finalized).Veranstaltungen werden zunächst empfangen, bevor ein Slot erreicht
Confirmed oder Finalized.Das Besondere an Finalized
Aufgrund der Solana Geyser Spezifikationen erhalten nicht alle Slots explizite abschließende Benachrichtigungen. Wenn Sie also eine abschließende Benachrichtigung für einen Slot erhalten, müssen Sie alle Vorfahren-Slots als abgeschlossen behandeln, auch wenn keine Benachrichtigungen ausdrücklich empfangen wurden.
Insbesondere, wenn eine abschließende Benachrichtigung erhalten, behandeln Sie alle Vorfahrschlitze rückwirkend als abgeschlossen.