Der historische Account-Zustand befindet sich in der Beta-Phase. Parameter, Preise, response-Formate und Datenabdeckung können sich ändern.
Was ist der historische Account-Zustand?
Standardmäßige Solana-RPC-Methoden wiegetAccountInfo und getTokenAccountsByOwner geben nur den aktuellen Zustand eines Accounts zurück. Validatoren speichern nur die neueste Version jedes Accounts. Daher ersetzt jeder Schreibvorgang den vorherigen. Auch der Transaktionsverlauf schließt diese Lücke nicht: getTransaction und getBlock geben Anweisungen, Protokolle und Saldoänderungen zurück, aber nicht die Account-Daten, die ein Programm geschrieben hat.
Die Methoden von Helius für historische Accounts geben Accounts so zurück, wie sie an einem vergangenen slot oder unmittelbar nach einer bestimmten Transaktion innerhalb dieses slots vorlagen. Da du den Zustand zwischen zwei Transaktionen im selben slot lesen kannst, siehst du genau, was eine Transaktion geändert hat. Das gilt auch, wenn ein Account innerhalb eines einzigen slots mehrfach beschrieben wurde. Verwende die Methoden für folgende Aufgaben:
- Prüfe die token-Salden einer Wallet zu einem bestimmten Zeitpunkt, etwa für Audits, Buchhaltung oder Steuererklärungen
- Debugge eine Transaktion, indem du die von ihr verwendeten Accounts direkt vor und nach ihrer Ausführung liest
- Lies die Accounts eines Protokolls, etwa Pools, Vaults oder Oracles, an einem vergangenen slot, ohne das Ledger selbst erneut abzuspielen
Welche Methode sollte ich verwenden?
Beide erwarten dieselben drei Parameter: eine Adresse, ein Abfrageobjekt zur Auswahl der Position im Verlauf und ein Konfigurationsobjekt.
Verfügbarkeit und Preise
- Tarife: Business-Tarife und höher.
- Kosten: 0 Credits pro Aufruf während der Beta-Phase (Preise können sich ändern).
- rate limit:
getHistoricalAccountInfoerlaubt 100 requests pro Sekunde mit maximal 100 requests auf einmal.getHistoricalTokenAccountsByOwnererlaubt 10 requests pro Sekunde mit maximal 10 requests auf einmal. Diese Limits gelten unabhängig vom RPC-rate limit deines Tarifs. Darüber hinausgehende requests geben HTTP429zurück. Siehe rate limits. - Netzwerk: Nur Mainnet. Rufe die Methoden über den standardmäßigen Mainnet-endpoint
https://mainnet.helius-rpc.comoder den Gatekeeper-endpointhttps://beta.helius-rpc.comauf. Devnet gibt den Fehler-32601zurück.
Datenabdeckung
Der Verlauf ist ab slot 444,959,999 (7. September 2026) verfügbar. Das ist der letzte slot der Epoche 1029. Er enthält daher den Zustand zu Beginn der Epoche 1030. requests für frühere slots geben den Fehler-32018 (“Account history not available”) zurück.
Position im Verlauf auswählen
Der zweite Parameter ist ein Abfrageobjekt mit zwei optionalen Feldern:slot und transactionIndex:
transactionIndex erfordert slot.
Nicht transaktionsbezogene Schreibvorgänge wie Epochen-Rewards werden am Ende des slots angewendet. Eine Abfrage mit transactionIndex enthält sie nie, auch nicht bei der letzten Transaktion im slot. Um sie einzubeziehen, frage slot ohne transactionIndex ab.
Zustand vor und nach einer Transaktion lesen
Lies den Account zweimal, um die Änderungen einer Transaktion zu untersuchen:- Nach der Transaktion: Frage ihre eigenen Werte für
slotundtransactionIndexab. - Vor der Transaktion: Frage denselben Wert für
slotab und ziehe 1 vontransactionIndexab. Wenn die Transaktion die erste in ihrem slot ist (Index 0), frage den vorherigen slot ohnetransactionIndexab.
getTransactionsForAddress gibt slot und transactionIndex für jede Transaktion zurück. So kannst du dort die Position einer Transaktion ermitteln und direkt an diese Methoden übergeben.
lastUpdatedAt verstehen
Jeder zurückgegebene Account enthältlastUpdatedAt. Das ist die Position des Schreibvorgangs, der den empfangenen Zustand erzeugt hat:
slotundtransactionIndexverweisen auf den letzten Schreibvorgang an oder vor der abgefragten Position. Im obigen Beispiel gab eine Abfrage für slot 445,000,000 den Zustand zurück, den zuletzt die Transaktion mit Index 700 in slot 444,999,837 geschrieben hatte.transactionIndex: nullbedeutet, dass der Schreibvorgang außerhalb einer Transaktion stattfand, etwa durch Epochen-Rewards.slot: 444959999mittransactionIndex: nullbedeutet, dass sich der Account seit Beginn der Verlaufsabdeckung nicht geändert hat. Es bedeutet nicht, dass der Account in diesem slot beschrieben wurde.
Bedeutung eines null-Werts
value ist null, wenn der Account an der abgefragten Position nicht existierte. Entweder war er noch nicht erstellt oder bereits geschlossen worden.
- Eine response mit
nullenthält keinlastUpdatedAt. Sie zeigt daher nicht, wann der Account erstellt oder geschlossen wurde. VerwendegetTransactionsForAddress, um diese Transaktionen zu finden. - Eine Adresse, die nie existiert hat, gibt ebenfalls
nullund keinen Fehler zurück. - Ein slot vor Beginn der Verlaufsabdeckung gibt für jede Adresse den Fehler
-32018zurück, unabhängig davon, ob der Account existierte.
Account-Verlauf rückwärts durchlaufen
VerwendelastUpdatedAt als Cursor, um alle bisherigen Zustände eines Accounts aufzulisten, beginnend mit dem neuesten. Frage nach jedem Lesevorgang die Position direkt vor dem erhaltenen Schreibvorgang ab:
Beende den Vorgang, wenn
value den Wert null hat. Das bedeutet, dass der gerade übersprungene Schreibvorgang den Account erstellt hat. Beende den Vorgang auch, wenn lastUpdatedAt.slot den Wert 444,959,999 erreicht, an dem die Verlaufsabdeckung beginnt.
- Accounts, die inzwischen geschlossen wurden, geben am neuesten slot
nullzurück. Übergib einestart-Position aus einem Zeitpunkt, an dem der Account noch existierte. - Nicht transaktionsbezogene Schreibvorgänge springen zum vorherigen slot. Wenn derselbe Account zuvor in diesem slot auch durch eine Transaktion beschrieben wurde, überspringt der Durchlauf diesen Zustand.
- Um den Verlauf vorwärts zu durchlaufen, liste die Transaktionen des Accounts mit
getTransactionsForAddressundsortOrder: "asc"von der ältesten zur neuesten auf. Lies dann den Zustand an den WertenslotundtransactionIndexjeder Transaktion.
response-Kontext
context.slot in jeder response ist der neueste slot, den Helius beim Verarbeiten des requests indiziert hatte. Es ist nicht der abgefragte slot. Verwende slot aus deinem request oder lastUpdatedAt, um die empfangenen Daten einzuordnen.
Konsistent paginieren
getHistoricalTokenAccountsByOwner gibt die Ergebnisse seitenweise zurück. Jede response enthält value.accounts und value.paginationKey.
- Übergib
paginationKeyerneut im Konfigurationsobjekt, um die nächste Seite abzurufen. - Beende den Vorgang erst, wenn
paginationKeyden Wertnullhat. Eine Seite kann kurz oder leer sein und trotzdem weitere Ergebnisse enthalten. - Verwende für jede Seite denselben Wert für
slot. Wenn duslotweglässt, liest jede Seite den neuesten indizierten slot. Deine Seiten können dann von unterschiedlichen Zeitpunkten stammen. - Setze
limitauf einen Wert zwischen 1 und 5.000. Der Standardwert ist 5.000.
Codierungen und geparste Daten
- Unterstützte Codierungen sind
base64(Standard),base64+zstdundjsonParsed.base58undbinarywerden nicht unterstützt. jsonParsed-token-Accounts verwenden die Dezimalstellen der Mint an der abgefragten Position. Dadurch bleiben die Beträge korrekt, auch wenn sich die Mint inzwischen geändert hat. Wenn die Mint an dieser Position nicht gelesen werden kann, verwendet der Account stattdessen base64.dataSlicefunktioniert genauso wie ingetAccountInfo.
Commitment
commitment akzeptiert finalized (Standard) und confirmed. processed wird nicht unterstützt. Ein slot, das neuer ist, als das angeforderte commitment zulässt, gibt den Fehler -32004 zurück.
Fehler
Häufig gestellte Fragen
Wie erhalte ich den Zustand eines Solana-Accounts an einem bestimmten slot?
RufegetHistoricalAccountInfo mit der Adresse und { "slot": S } auf. Die Methode gibt den Account so zurück, wie er am Ende von slot S vorlag. Das Format entspricht getAccountInfo.
Kann ich einen Account zwischen zwei Transaktionen im selben slot lesen?
Ja. Füge der AbfragetransactionIndex hinzu, um den Zustand des Accounts unmittelbar nach der Ausführung dieser Transaktion abzurufen. Siehe Zustand vor und nach einer Transaktion lesen.
Wie weit kann ich zurückgehen?
Der Verlauf beginnt am 7. September 2026 bei slot 444,959,999. Frühere slots geben den Fehler-32018 zurück.
Welche Tarife enthalten Methoden für historische Accounts?
Business-Tarife und höher. Während der Beta-Phase kosten Aufrufe 0 Credits. Die Preise können sich ändern. Die Methoden sind nur in Mainnet verfügbar.Welche rate limits gelten?
getHistoricalAccountInfo erlaubt 100 requests pro Sekunde und getHistoricalTokenAccountsByOwner erlaubt 10 requests pro Sekunde. Beide Limits gelten unabhängig vom RPC-rate limit deines Tarifs. Siehe Verfügbarkeit und Preise.
Wie erhalte ich jeden früheren Zustand eines Accounts?
Gehe mithilfe vonlastUpdatedAt von einem Schreibvorgang rückwärts zum vorherigen. Siehe Account-Verlauf rückwärts durchlaufen.
Benötige ich ein neues SDK?
Nein. Dies sind JSON-RPC-Methoden. Daher funktioniert jeder HTTP-Client. Standardmäßige Solana-Clientbibliotheken enthalten sie nicht. Sende den request deshalb wie in den obigen Beispielen direkt.Nächste Schritte
getHistoricalAccountInfo
Lies einen einzelnen Account an einem vergangenen slot oder einer vergangenen Transaktion
getHistoricalTokenAccountsByOwner
Liste die token-Accounts einer Wallet an einem vergangenen slot auf
getTransactionsForAddress
Ermittle den slot und den transactionIndex der Transaktionen, die du untersuchen möchtest
Historical data overview
Transaktionsverlauf, Übertragungen und weitere Archivmethoden