Skip to main content

Übersicht

Die Solana-Blockchain speichert Daten in einem sequenziellen, nur anhängbaren Ledger. Dies ist großartig für die Datenintegrität und den Transaktionsdurchsatz, hat aber einen erheblichen Nachteil: Es macht das Abfragen von historischen Daten sehr ineffizient und prohibitively langsam. Komplexe Operationen umfassen oft das Filtern, Aggregieren oder Verknüpfen von Daten aus mehreren Quellen. In diesen Fällen sind direkte Abfragen an Solana für die meisten realen Anwendungen unpraktisch. Um dies zu lösen, erstellen die meisten Unternehmen private Indizes der historischen Daten von Solana. Dieses Handbuch behandelt den gesamten Lebenszyklus: Auffüllen historischer Daten mit getTransactionsForAddress und anderen archivierten RPC-Methoden, Auswahl einer Datenbank und Halten des Indexes mit Echtzeit-Streaming aktuell.

Wann dies zu verwenden ist

Erstellen Sie einen Index, wenn:
  • Ihr Produkt schnelle, gefilterte Abfragen benötigt, für die direkte RPC-Aufrufe zu langsam sind (z. B. die Token-Konten und Salden einer Wallet oder die vollständige Geschichte eines Handelspaars)
  • Sie benötigen, um On-Chain-Daten zu filtern, zu aggregieren oder zu verknüpfen, oder um sie mit Off-Chain-Daten zu kombinieren (CEX-Preise, KYC, Labels)
  • Sie berechnen Dinge wie PnL, Inhaberanalysen oder NFT-Verkaufsgeschichte, die vorverarbeitete, abfragbare Daten erfordern
  • Sie bedienen viele Benutzer und können sich keine Latenz pro Anfrage gegen die Kette leisten
Wenn Sie nur standardmäßige Wallet- oder Asset-Daten benötigen, kann eine verwaltete API einfacher sein als das Ausführen eines eigenen Indexes. Siehe Ergänzende Optionen unten.

Was bedeutet Solana-Daten zu indexieren?

Indexierung ist der Prozess des Abfragens von Daten aus der Solana-Blockchain und deren Speicherung in einer Backend-Datenbank (z. B. PostgreSQL, ClickHouse), die dann verwendet werden kann, um Kundenanfragen ohne direkte Abfrage der Blockchain mit Solana-RPC-Aufrufen schnell zu bedienen. Ein Indexer führt in der Regel vier Dinge aus:
  1. Historische Daten auffüllen: Verwenden Sie Archiv-RPC-Methoden, um alle historischen Daten abzufragen
  2. Neue Daten streamen: Verarbeiten Sie neue Blöcke, wenn sie vom Netzwerk bestätigt werden
  3. Daten parsen und transformieren: Extrahieren Sie relevante Daten aus den bestätigten Blöcken (z. B. Transaktionen, Zustandsänderungen usw.)
  4. Daten in eine Datenbank organisieren: Aktualisieren Sie den Index mit den neuen Daten

Warum erstellen die meisten Unternehmen Solana-Indizes?

Unternehmen erstellen Solana-Indizes, weil ihr Geschäft darauf angewiesen ist, schnellen, Echtzeitzugriff auf spezifische Blockchain-Daten zu bieten, die native RPCs nicht bieten (z. B. NFT-Verkaufsgeschichte). Unternehmen nutzen auch benutzerdefinierte Indizes, um Off-Chain-Daten (z. B. Preise von zentralisierten Börsen, KYC-Informationen usw.) mit ihren On-Chain-Daten zu kombinieren.

Wallet-Beispiel

Wenn eine Solana-Wallet beispielsweise schnell die Token-Konten und Salden eines Benutzers zurückgeben muss, ist das Abfragen von Solana direkt mit getTokenAccountsByOwner und getTokenAccountBalance zu langsam und könnte ihr Produkt unbenutzbar machen. Stattdessen pflegen Wallets in der Regel eigene Indizes der Kundenadressen, Token und Kontostände.

Handelsbeispiel

Ähnlich könnte ein Krypto-Handelsunternehmen alle Handelsaktivitäten protokollieren wollen, die bei einem bestimmten Handelspaar (z. B. SOL-USDC) oder einem bestimmten Markt auftreten, um ihre Handelsalgorithmen rückzutesten. Das direkte Abfragen der Blockchain nach diesen Daten wäre viel zu langsam für jede praktische Handelsanalyse. Stattdessen könnten Quant-Trader entscheiden, Indizes für den SOL-USDC-Markt zu erstellen und ihn mit den neuesten Trades unter Verwendung von Echtzeit-Streaming-Produkten wie LaserStream auf dem neuesten Stand zu halten.

Filterbeispiel

Stellen Sie sich vor, ein Benutzer möchte Transaktionen nach bestimmten Kriterien in seiner Frontend-Anwendung filtern (z. B. nach Tokentyp, Transferhöhe, Datum oder Wallet-Adresse). Ohne einen Indexer müsste Ihre App Millionen von Transaktionen über Hunderttausende von Blöcken scannen und jeden gegen die Filterkriterien prüfen. Dieser Prozess ist zu langsam für moderne Produkterlebnisse.

PnL-Beispiel

Um den Gewinn und Verlust (PnL) eines Traders zu berechnen, müssten Sie:
  • Jede Transaktion in einem bestimmten Zeitraum, die mit seiner Wallet in Verbindung steht, finden
  • Swap-Transaktionen herausfiltern und als Käufe oder Verkäufe markieren
  • Bestimmen, wie viele Gebühren der Benutzer während jedes Swaps gezahlt hat
  • Die historischen Preisdaten für jedes Token zum Zeitpunkt jedes Trades abrufen
  • Den PnL jeder Transaktion aggregieren, um den Gesamterlös des Traders zu berechnen
Dies alles in Echtzeit zu berechnen, ist unpraktisch und erfordert eine schnellere, skalierbarere Lösung. Mit einem Index sind all diese Informationen bereits verarbeitet und in einer abfragbaren Datenbank gespeichert. Jetzt wird das Berechnen des PnL eines Traders zu einem einzigen API-Aufruf, der sofort bedient wird. Schauen wir uns drei Ansätze zum Auffüllen eines Solana-Indexes und dessen Aktualisierung an.

Schritt 1: Holen Sie sich die historischen Daten

Der erste Schritt beim Erstellen eines Solana-Indexes besteht darin, alle historischen Daten zu erhalten, die Sie interessieren. Es gibt drei Hauptwege, dies zu tun:
  1. getTransactionsForAddress (empfohlen)
  2. getSignaturesForAddress und getTransaction
  3. getBlock

Methode 1: getTransactionsForAddress (empfohlen)

Die getTransactionsForAddress RPC-Methode ermöglicht es Ihnen, die vollständigen Transaktionsdetails für ein beliebiges Segment von Blockchain-Daten abzurufen. Aufgrund ihrer leistungsstarken Filterfunktionen verschwenden Sie keine Zeit damit, Daten abzurufen, die für Ihren Index nicht benötigt werden. Und durch die umgekehrte Suchfunktion können Sie Transaktionen in chronologischer Reihenfolge abrufen.

Schritte zur Verwendung dieser Methode

  • Bestimmen Sie den Zeitraum, für den Sie Daten benötigen, und setzen Sie den Filter entsprechend
  • Setzen Sie transactionDetails auf full, um alle Transaktionsdetails abzurufen
  • Konfigurieren Sie den tokenAccounts Filter, um bei Bedarf Transaktionen mit zugehörigen Token-Konten einzuschließen
  • Paginieren Sie durch die Ergebnisse mithilfe von paginationToken
  • Extrahieren Sie bei jeder Iteration die benötigten Daten und speichern Sie sie in Ihrer Datenbank

Vorteile der Verwendung von getTransactionsForAddress

Die Hauptvorteile der Verwendung des gTFA-Endpunkts sind Geschwindigkeit und Einfachheit. Mit slot- und zeitbasierten Filtern, Unterstützung von Token-Konten, umgekehrter Suche und Paginierung können Sie alle Daten abrufen, die Sie möchten, aus jeder Zeit in der Solana-Geschichte, alles mit einem einzigen Aufruf ohne komplexe Schleifen oder Wiederholungslogik. Im Gegensatz zu getSignaturesForAddress kann es auch Transaktionen mit zugehörigen Token-Konten enthalten, die der Adresse gehören. Wenn sich Ihr Index speziell mit der Bewegung von Token und nativem SOL befasst (Zahlungen, Kontenabgleiche, Saldenabstimmung), gibt getTransfersByAddress geparste, abgleichbereite Transferzeilen anstelle von vollständigen Transaktionen zurück, was Ihnen einen Parsing-Schritt ersparen kann.

Methode 2: getSignaturesForAddress und getTransaction

Vor der Veröffentlichung von gTFA war der Standardansatz zur Abfrage historischer Daten, rekursiv über Signaturen mit getSignaturesForAddress (von neu nach alt) zu schleifen und dann getTransaction aufzurufen, um die vollständigen Transaktionsdetails zu extrahieren.

Schritte zur Verwendung dieser Methode

Hier sind die grundlegenden Schritte zur Verwendung dieser Methode:
  • Aufruf von getSignaturesForAddress
  • Speichern der Signatur der letzten empfangenen Transaktion dieses Aufrufs
  • Für den nächsten Aufruf von getSignaturesForAddress, setzen Sie den before Parameter auf diese Signatur
  • Wiederholen Sie dies in einer Schleife, solange es erforderlich ist
  • Für jede auf diese Weise abgerufene Transaktionssignatur rufen Sie getTransaction auf, um die vollständigen Transaktionsdetails zu erhalten
  • Die relevanten Daten in Ihrer Datenbank einfügen

Nachteile dieser Methode

Leider müssen Sie bei Verwendung dieser Methode:
  • Bei der neuesten Transaktion beginnen und rückwärts arbeiten
  • Einen zusätzlichen RPC-Aufruf für jede Transaktion machen
  • Eine threadsichere Warteschlange für die gleichzeitige Verarbeitung aufbauen
  • Logik für Wiederholungen und Zurücksetzungen aufbauen, um verpasste Daten zu vermeiden und nicht rate-limitiert zu werden
  • Transaktionen mit zugehörigen Token-Konten, die der Adresse gehören, nicht einschließen
Obwohl diese Methode funktioniert, ist sie komplizierter, weniger flexibel und verbraucht viel mehr Credits. Für eine vollständige Wallet-Geschichte, einschließlich Token-Konten, verwenden Sie getTransactionsForAddress stattdessen.

Methode 3: Verwendung von getBlock

Die getBlock Methode ist am effektivsten, wenn ein hoher Prozentsatz der Transaktionen in Ihren Zielblöcken für Ihre Analyse relevant ist, wie z. B. das Indexieren der Transaktionen von häufig verwendeten Solana-Programmen wie DFlows Aggregator, das Pump.fun-Programm oder Solanas Token-Programm.

Schritte zur Verwendung dieser Methode

Der grundlegende Prozess zum Abfragen historischer Daten mit getBlock umfasst:
  • Entscheiden Sie sich für einen Zeitrahmen, den Sie abfragen möchten
  • Konvertieren Sie diesen Zeitrahmen in Slot-Nummern
  • Abrufen der entsprechenden Blöcke sequentiell (vorwärts oder rückwärts)
  • Filtern Sie für jeden Block die Transaktionen, die für Ihren Index relevant sind
  • Speichern Sie die relevanten Informationen daraus in Ihrem Index
Für die meisten Anwendungsfälle ist diese Methode von Natur aus verschwenderisch, da Sie alle Transaktionen in einem Block abrufen, während in der Regel nur ein kleiner Bruchteil für Ihre Analyse relevant ist. Verwenden Sie diese Methode nur dann, wenn Sie die Transaktionen häufig verwendeter Programme untersuchen oder wenn die Adress-basierte Filterung Ihre Ziel-Daten nicht erfassen kann.

Schritt 2: Synchronisieren Sie Solana-Daten mit Ihrer Datenbank

Nach dem Abrufen historischer Daten müssen Sie diese transformieren und effizient in einer Datenbank speichern. Ihre Speicherwahl sollte auf Ihren spezifischen Anwendungsfall zugeschnitten sein — es gibt keine Universallösung. Die richtige Datenbank hängt von der Größe Ihres Datensatzes, den Latenzanforderungen, den Abfragemustern und der Expertise Ihres Teams ab.

Option 1: SQL-Datenbanken

Es wird empfohlen, Solana-Daten in relationalen Datenbanken wie PostgreSQL zu speichern, da SQL flexibel, allgegenwärtig und einfach zu erlernen ist. Moderne relationale Datenbanken können auf über 100 Mio.+ Zeilen skaliert werden und bieten Ihnen dennoch die Vorteile von ACID-Konformität, komplexen Joins und leistungsstarken sekundären Indizes. Verwenden Sie SQLite für Prototyping, lokale Entwicklung oder wenn Sie keine Konfiguration mit einer Ein-Datei-Datenbank möchten. Sie ist ideal, wenn Ihr Datensatz unter ein paar Gigabyte bleibt. Verwenden Sie PostgreSQL für produktionsreife Anwendungen, die Datenreplikation, gleichzeitigen Zugriff von mehreren Clients oder erweiterte Funktionen wie Volltextsuchen und JSON-Operatoren benötigen. Für die meisten produktionsfähigen Solana-Indexer ist PostgreSQL unsere empfohlene Wahl.

Implementierungsbeispiel:

Als Beispiel zeigen wir, wie Token-Transfers in einer PostgreSQL-Datenbank gespeichert werden. Erstellen Sie zunächst eine Tabelle:
Fügen Sie dann Indizes auf häufig abgefragten Spalten hinzu:
Sie können auch Teilindizes erstellen, falls nur ein Teil der Daten häufig abgefragt wird. So erstellen Sie beispielsweise einen Index nur für hochpreisige Transfers:
Stellen Sie beim Auffüllen von Daten sicher, dass Sie Bulk INSERTs und vorbereitete Anweisungen für optimale Schreibgeschwindigkeit verwenden.

Option 2: Säulendatenbanken

Säulendatenbanken sind für analytische Abfragen, Aggregationen und umfangreiche Zeitreihendaten optimiert. Wenn Sie mehrere Milliarden Transaktionen indexieren müssen, sind Säulendatenbanken wie ClickHouse oder Cassandra die beste Option. Verwenden Sie ClickHouse, wenn Sie Echtzeitanalysen auf großen Datensätzen benötigen — es ist optimiert für schnelle Lesezugriffe, Aggregationen und Zeitreihenanalysen. Verwenden Sie Cassandra, wenn Sie extrem hohen Schreibdurchsatz, mühelose horizontale Skalierung und hohe Fehlertoleranz benötigen. Dies macht es ideal für die kontinuierliche Aufnahme massiver Volumen von Solana-Daten.

Implementierungsbeispiel:

Wir zeigen, wie man Token-Transfers in einer ClickHouse-Datenbank speichert. Erstellen Sie zu diesem Zweck eine Tabelle, die die MergeTree-Tabellen-Engine verwendet. Sie ist auf hohe Ingest-Raten ausgelegt, daher ideal zum Indexieren. Verwenden Sie diesen Befehl:
In diesem Setup wird (token_mint, date) sowohl als Primärschlüssel als auch als Sortierschlüssel gesetzt. ClickHouse ordnet die Daten auf der Festplatte entsprechend Ihrem Sortierschlüssel. Dies ist optimal zum Abfragen eines einzelnen Token-Mints und zum Eingrenzen der Antwort nach Datumsbereichen. Hier ist eine Beispielabfrage:
Transaktionssignaturen und -adressen werden mit dem FixedString(N)-Datenformat gespeichert, das genau N Bytes speichert. ClickHouse komprimiert Daten automatisch, was die Speicherkosten um 10-20x reduziert und die Abfrageleistung verbessert. Um die Abfrageleistung zu optimieren, verwenden Sie materialisierte Ansichten, um häufige Aggregationen vorab zu berechnen. Sie können beispielsweise das tägliche Transfer-Volumen von Tokens vorab berechnen, das von volumenbezogenen Diagrammen auf einem Dashboard verwendet wird.

Option 3: Datenseen

Datenseen sind ideal zum Speichern riesiger Mengen roher und verarbeiteter Blockchain-Daten für langfristige Archivierung und analytische Abfragen geeignet. Eine einfache Implementierung verwendet das Parquet-Datenformat mit Amazon Athena. Parquet ist ein spaltenorientiertes Dateiformat, das für effiziente Datenspeicherung und -abruf entwickelt wurde. Amazon Athena ist ein interaktiver Abfrageservice, der es Ihnen ermöglicht, Daten, die in Amazon S3 gespeichert sind, mithilfe von Standard-SQL zu analysieren, ohne Infrastruktur einzurichten oder die Daten in eine separate Datenbank zu laden.
Datenseen werden nur empfohlen, wenn Sie große Mengen unstrukturierter Daten abfragen müssen. Für die meisten Anwendungsfälle empfehlen wir die Verwendung einer SQL-Datenbank (Option 1).

Implementierungsbeispiel:

Wir möchten ein Archiv von Token-Transfers erstellen und abfragen. Zuerst müssen wir sie in S3 speichern: Erstellen Sie einen Bucket namens solana_index und partitionieren Sie Ihre Token-Transfer-Daten nach Zeit mit dieser Schlüsselstruktur:
Die Transfers jedes Tages werden in einer separaten Parquet-Datei in ihrem entsprechenden Datumsordner gespeichert. Während Sie Transfers von Solana verarbeiten, transformieren Sie sie in das Parquet-Format und schreiben Sie sie in das jeweilige S3-Objekt. Später erstellen Sie eine Tabelle in Athena und verbinden diese mit dem Bucket. Dies ermöglicht es Ihnen, Abfragen wie diese direkt auf den Daten im Bucket auszuführen:

Verwenden Sie Indexierungs-Frameworks

Verwenden Sie Carbon und ähnliche Frameworks, um Boilerplate-Code zu vermeiden und Ihren Indexer in Stunden statt Tagen einzurichten.

Hauptmerkmale:

  • Vorgefertigte Decoder für beliebte Programme (Token-Programm, DeFi-Protokolle, Metaplex)
  • Konfigurierbare Datenquellen (RPC, LaserStream, erweiterte WebSockets)
  • Eingebauter Support für sowohl Auffüllen als auch Echtzeit-Streaming
  • Ausgaben an mehrere Speichersysteme (Postgres ist bereits integriert)
  • Vollständig anpassbar: Sie können Ihre eigenen Datenquellen, Decoder und Data Sinks einrichten

Schritt 3: Halten Sie Ihren Index auf dem neuesten Stand

Nach dem Auffüllen historischer Daten benötigen Sie eine Echtzeit-Streaming-Lösung, um Ihren Index mit neuen Blockchain-Aktivitäten auf dem neuesten Stand zu halten. Andernfalls wird Ihr Index veraltet.

Methode 1: LaserStream (empfohlen)

Wir empfehlen LaserStream gRPC als Standardwahl für alle produktionsrelevanten Indexierungsfälle. Es ist speziell für zuverlässiges, extrem latenzarmes und fehlertolerantes Datenstreaming entwickelt. Einige Vorteile der Nutzung von LaserStream sind:
  • 24-Stunden-Wiederholung: Wenn Ihr Indexer die Verbindung verliert, spielt LaserStream automatisch alle verpassten Transaktionen vom letzten Stand ab
  • Automatische Wiederverbindung: Unsere LaserStream SDKs (Rust, Go, JS/TS) handhaben Netzwerkunterbrechungen nahtlos für Sie
  • Node-Failover: Ihre LaserStream-Verbindung aggregiert Daten von mehreren Nodes gleichzeitig, um maximale Betriebszeit sicherzustellen
Durch die Kombination aus Geschwindigkeit und Zuverlässigkeit ist LaserStream ideal für Echtzeitanwendungen wie Live-Transaktionsfeeds, Handels-Dashboards und sofortige Saldenaktualisierungen.

Wie man LaserStream für die Indexierung verwendet

Verwenden Sie die subscribe Methode, um sich bei Blockchain-Ereignissen zu abonnieren. Hier einige bewährte Verfahren:
  • Verfeinern Sie Ihren Filter so weit wie möglich: Abonnieren Sie nur die Daten, die Sie tatsächlich indexieren müssen, um den Bandbreitenverbrauch und die erforderliche Verarbeitung zu minimieren.
  • Verwenden Sie das confirmed-Verpflichtungsniveau: Dies balanciert Latenz und Finalität. Das processed Niveau könnte zu unzuverlässig sein, während finalized etwa 13 Sekunden Latenz hinzufügt
  • Setzen Sie failed: false, es sei denn, Sie müssen gescheiterte Transaktionen verfolgen
  • Schließen Sie Abstimmungstransaktionen (vote: false) aus, da sie nicht für das Indexieren relevant sind
Schauen wir uns ein Beispiel an. Verwenden Sie das folgende Abonnement, um alle neuen Token-Transfers zu indexieren:

Methode 2: Verwenden von LaserStream WebSocket

LaserStream WebSocket — die WebSocket-Variante von LaserStream, einschließlich der Helius-spezifischen transactionSubscribe-Erweiterung — läuft auf dem gleichen Backend wie LaserStream gRPC und ist eine kostengünstige Echtzeit-Streaming-Alternative, wenn Sie kein gRPC benötigen. Sie sollten LaserStream WebSocket verwenden, wenn:
  • Ihre Anwendung gelegentliche Datenlücken tolerieren kann
  • Echtzeit-Updates wichtig, aber nicht geschäftskritisch sind
  • Sie bereits vorhandene Infrastruktur haben, um fehlende Daten zu erkennen und aufzufüllen
  • Budgetbeschränkungen erheblich sind und Sie die Streaming-Kosten minimieren müssen
  • Sie Prototyping oder Tests durchführen, bevor Sie sich für LaserStream entscheiden
Es gibt jedoch einige Kompromisse, die berücksichtigt werden müssen, wenn Sie sich für WebSockets entscheiden:
  • Geschwindigkeit: LaserStream WebSocket läuft auf dem gleichen Backend wie LaserStream gRPC, aber das WebSocket-Protokoll fügt JSON-Framing und Overhead pro Nachricht hinzu — für die niedrigstmögliche Latenz bei den gleichen Daten verwenden Sie LaserStream gRPC
  • Zuverlässigkeit: Keine Garantie für die wiederholte Wiedergabe. Wenn Ihre WebSocket-Verbindung getrennt wird, müssen Sie manuell Lücken mit Hilfe von RPC-Methoden erkennen und auffüllen
  • Komplexität: Erfordert zusätzliche Überwachungsinfrastruktur, um die Vollständigkeit der Daten sicherzustellen

Wie man WebSockets für die Indexierung verwendet

Um einen Index zu aktualisieren, der alle Token-Transfers speichert, würden Sie sich bei transactionSubscribe wie folgt abonnieren:

Erste Schritte

Der Aufbau eines robusten Solana-Index und das Auffüllen von Daten erfordert die Lösung von drei zentralen Herausforderungen:
  1. Effizientes Abrufen historischer Daten
  2. Transformieren und Speichern von Daten für schnelle Abrufe
  3. Halten Sie indexierte Solana-Daten in Echtzeit auf dem neuesten Stand
Mit unserem neuen hochmodernen Archival-System, Archivaufrufe wie getTransactionsForAddress und branchenführenden Daten-Streaming-Lösungen wie LaserStream ist das Erstellen eines Solana-Index einfacher und praktikabler als je zuvor.

Ergänzende Optionen

Der Betrieb eines eigenen Indexes gibt Ihnen die volle Kontrolle, ist jedoch nicht immer notwendig. Für gemeinsame Bedürfnisse kann eine verwaltete Helius-API einen benutzerdefinierten Index ersetzen oder ergänzen:
  • DAS API — Abfrage von NFTs, Fungible Tokens und komprimierten Assets (Metadaten, Eigentum, Salden, nach Eigentümer/Sammlung/Ersteller), ohne Asset-Daten selbst indexieren zu müssen.
  • Wallet API — High-Level-REST-Endpunkte für Wallet-Salden, Verlauf, Übertragungen und Identität, mit USD-Werten und einer einfacheren Antwortform.
Viele Teams verwenden diese für Portfolio-, Token- und Wallet-Daten und reservieren einen benutzerdefinierten Index für zweckbezogene Daten, die die verwalteten APIs nicht abdecken.

Nächste Schritte