getProgramAccounts RPC-Methode ist ein leistungsstarkes Werkzeug zum Abfragen der Solana-Blockchain. Sie ermöglicht es Ihnen, alle Konten abzurufen, die von einem bestimmten On-Chain-Programm verwaltet werden. Dies ist für eine Vielzahl von Anwendungen unerlässlich, von der Suche nach allen Token-Konten, die mit einem Benutzer für eine bestimmte Token-Prägung verbunden sind, bis hin zur Entdeckung aller benutzerspezifischen Datenkonten für eine dezentrale Anwendung.
Aufgrund der potenziell großen Anzahl von Konten, die ein Programm besitzen könnte, bietet getProgramAccounts robuste Filtermöglichkeiten, um Ihnen zu helfen, Ihre Suche einzugrenzen und nur die Daten effizient zu erfassen, die Sie benötigen.
Für Anwendungen, die sehr große Mengen an Programmkonten abfragen müssen, sollten Sie getProgramAccountsV2 verwenden, das eine Cursor-basierte Paginierung mit konfigurierbaren Seitengrößen von bis zu 10.000 Konten pro Anfrage bietet.
Häufige Anwendungsfälle
- Finden aller Token-Konten für eine Prägung: Entdecken Sie alle Inhaber eines bestimmten SPL-Tokens.
- Abrufen benutzerspezifischer Daten: Holen Sie alle Konten ab, die von einem Programm für einen bestimmten Benutzer erstellt wurden (z. B. die Positionen eines Benutzers in einem DeFi-Protokoll, ihren Spielstatus in einem Play-to-Earn-Spiel).
- Auflisten aller Instanzen eines benutzerdefinierten Kontotyps: Wenn Ihr Programm eine bestimmte Kontostruktur definiert, kann
getProgramAccountsalle Instanzen dieser Struktur finden. - Überwachung des Programmstatus: Beobachten aller Konten, die mit einem Programm verbunden sind, um seinen Gesamtstatus oder Aktivität zu verfolgen.
- Erstellen von Explorer- und Analysetools: Aggregieren von Daten über Programme und ihre zugehörigen Konten.
Anfrageparameter
-
programId(string, erforderlich):- Der base-58 codierte öffentliche Schlüssel des Programms, dessen Konten Sie abrufen möchten.
- Beispiel:
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"(für das SPL Token Programm).
-
options(object, optional): Ein Konfigurationsobjekt mit den folgenden Feldern:commitment(string): Spezifiziert das Commitment-Level (z. B."finalized","confirmed").encoding(string): Kodierung für dasdata-Feld innerhalb jedes zurückgegebenen Kontos. Standardmäßig"base64"."base58": Langsamere Alternative für Binärdaten."base64": Standard-Base64-Kodierung für Binärdaten."base64+zstd": Base64-codierte, zstd-komprimierte Binärdaten."jsonParsed": Wenn der RPC-Knoten einen Parser für den Kontotyp des Programms hat (z. B. SPL Token, Stake), wird dasdata-Feld ein strukturiertes JSON-Objekt sein. Dies wird dringend für Lesbarkeit und Benutzerfreundlichkeit empfohlen.
filters(array): Ein Array von Filterobjekten, das auf die Konten angewendet werden soll. Dies ist entscheidend für Leistung und Relevanz. Sie können bis zu 4 Filter verwenden. Häufige Filter umfassen:dataSize(object):dataSize(u64): Filtert Konten nach ihrer Datenlänge in Bytes. Beispiel:{ "dataSize": 165 }(für SPL Token Konten).
memcmp(object): Speichervergleich. Vergleicht einen Abschnitt der Kontodaten mit den bereitgestellten Bytes.offset(usize): Der Byte-Offset in die Kontodaten, an dem der Vergleich beginnen soll.bytes(string): Ein base-58 codierter String der Bytes, die übereinstimmen sollen. Der Byte-String darf kleiner als 129 Bytes sein.- Beispiel: Um Token-Konten für eine bestimmte Prägung zu finden, würden Sie
memcmpmitoffset: 0verwenden (wo die Prägeadresse in einem Token-Konto gespeichert ist) undbytesauf den öffentlichen Schlüssel der Prägung setzen.
dataSlice(object): Gibt nur einen bestimmten Abschnitt der Daten jedes Kontos zurück. Nützlich für große Konten, wenn Sie nur Teilinformationen benötigen.offset(usize): Der Byte-Offset, ab dem der Schnitt beginnen soll.length(usize): Die Anzahl der zurückzugebenden Bytes.- Hinweis:
dataSliceist hauptsächlich für Binärkodierungen, nichtjsonParsed.
withContext(boolean): Wenntrue, wird die Antwort einRpcResponse-Objekt enthalten, das einecontext(mitslot) und dievalue(das Kontenarray) enthält. Wennfalseoder weggelassen, wird normalerweise nur das Kontenarray zurückgegeben. Das Verhalten kann je nach RPC-Anbieter leicht variieren.minContextSlot(u64): Der Mindestspeicherbereich, den die Anfrage erreichen kann.
Antwortstruktur
Die Antwort ist ein Array von Objekten, bei denen jedes Objekt ein gefundenes Konto darstellt und Folgendes umfasst:pubkey(string): Der base-58 codierte öffentliche Schlüssel des Kontos.account(object):lamports(u64): Saldo des Kontos in Lamport.owner(string): Base-58 codierter öffentlicher Schlüssel des Programms, dem dieses Konto gehört (dies wird derprogramIdsein, nach dem Sie gesucht haben).data(string,arrayoderobject): Die Kontodaten, formatiert gemäß demencoding-Parameter.- Für
jsonParsed: Ein JSON-Objekt, das den deserialisierten Kontostatus darstellt. - Für
base64: Ein Array["encoded_string", "base64"].
- Für
executable(boolean): Ob das Konto ausführbar ist (d. h. ein Programm selbst).rentEpoch(u64): Das Epoche, bei der dieses Konto das nächste Mal Miete zahlen muss.space(u64, optional): Die Datenlänge des Kontos in Bytes. Manchmal auchdata.lengthgenannt, wenn Daten ein Puffer sind oder Teil der analysierten Struktur.
withContext: true verwendet wird, wird dieses Array unter dem value-Feld eines RpcResponse-Objekts verschachtelt.
Beispiele
1. Finden aller Token-Konten für eine spezifische Prägung (USDC)
Dieses Beispiel findet alle SPL-Token-Konten, die USDC halten. Es verwendetdataSize, um nach Token-Konten (165 Bytes) zu filtern, und memcmp, um die USDC-Prägeadresse bei Offset 0 abzugleichen.
2. Finden aller Token-Konten, die von einer bestimmten Wallet verwaltet werden
Dieses Beispiel findet alle SPL-Token-Konten, die von einer bestimmten Wallet-Adresse verwaltet werden. Es verwendetdataSize (165 Bytes) und memcmp bei Offset 32 (wo der Besitzer-Pubkey in einem Token-Konto gespeichert ist).
Erweiterte Filterung
Optimieren Sie Ihre Abfragen mit Filtern, um die Antwortgröße zu verringern und die Leistung zu verbessern:API Reference
getProgramAccounts
Filterarten
memcmp: Filterkonten, die einem bestimmten Muster bei einem bestimmten Offset entsprechendataSize: Filterkonten nach ihrer genauen Datengröße- Mehrere Filter: Alle Bedingungen müssen erfüllt sein (logisches UND)
Entwicklertipps
- Leistung:
getProgramAccountskann ressourcenintensiv auf RPC-Knoten sein, insbesondere ohne Filter oder für Programme mit vielen Konten. Verwenden Sie immer Filter (dataSize,memcmp) unddataSlice, wo möglich, um den Abfrageumfang und die Antwortgröße zu reduzieren. - Große Ergebnismengen: Bei Abfragen, die viele Ergebnisse zurückgeben, könnte die Antwort abgeschnitten oder ein Timeout auftreten. Verwenden Sie Filter, um den Umfang zu reduzieren, oder ziehen Sie
getProgramAccountsV2für Unterstützung bei der Paginierung in Betracht. - Ratenbeschränkungen: Beachten Sie die Ratenbeschränkungen des RPC-Anbieters, da häufige oder schwere
getProgramAccounts-Anrufe diese Grenzen erreichen können. - Wissen über Datenlayout: Effektive Nutzung von
memcmperfordert das Verständnis des Byte-Layouts der Kontodaten, die Sie abfragen. - Verfügbarkeit von
jsonParsed: DiejsonParsed-Kodierung hängt davon ab, ob der RPC-Knoten einen Parser für die spezifischen Kontotypen des Programms hat. Sie wird häufig für gängige Programme wie SPL Token unterstützt.
getProgramAccounts ist eine unverzichtbare Methode für Entwickler, die Sätze von Konten abfragen und mit ihnen interagieren müssen, die von einem Programm verwaltet werden. Die Beherrschung seiner Filteroptionen ist entscheidend für den Aufbau effizienter und robuster Solana-Anwendungen.
Paginierung für große Datensätze
Für Anwendungen, die mit Programmen arbeiten, die eine große Anzahl von Konten besitzen (10.000+), verwenden SiegetProgramAccountsV2, das Folgendes bietet:
- Cursor-basierte Paginierung: Setzen Sie
limit(1-10.000) und verwenden SiepaginationKey, um durch Ergebnisse zu navigieren - Inkrementelle Aktualisierungen: Verwenden Sie
changedSinceSlot, um nur Konten abzurufen, die seit einem bestimmten Slot geändert wurden - Bessere Leistung: Verhindert Timeouts und reduziert den Speicherverbrauch
- Paginierungverhalten: Das Ende der Paginierung wird nur angezeigt, wenn keine Konten zurückgegeben werden. Weniger Konten als das Limit können aufgrund von Filtern zurückgegeben werden – setzen Sie die Paginierung fort, bis
paginationKeynull ist.
Verwandte Methoden
getProgramAccountsV2
Paginierte Version mit Cursor-basierter Navigation für große Datensätze