Kontext zum Kontomodell
Überspringe diesen Abschnitt, wenn du mit Solana-Konten und ihrer Struktur vertraut bist.
- Daten: Die eigentlichen Bytes, in denen Programmzustand, token-Guthaben oder andere Informationen gespeichert sind
- Eigentümer: Das Programm, das dieses Konto kontrolliert und seine Daten ändern kann
- Lamports: Das SOL-Guthaben des Kontos für die Befreiung von der Rent-Gebühr
- Ausführbar: Gibt an, ob dieses Konto Programmcode enthält
Einfaches Kontoabonnement
Beginnen wir mit einem einfachen Beispiel, das Änderungen an token-Konten abonniert. Dieses Skript benachrichtigt dich, sobald sich token-Guthaben ändern:BKMHWYLAX4un3HUbR7a3u9jPmzCiLNa4mSj1RiX11eWF erhalten.
Dieses Konto hat:
- 2.039.280 Lamports (~0,002 SOL Guthaben – dies ist der Betrag für die Befreiung von der Rent-Gebühr bei diesem token-Konto)
- Eigentümerprogramm
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA(dies ist das SPL Token Program) - Transaktionssignatur
5C9Hr5nG2j8eQz6inxPmfyjbYdmXddzUDyR1iQgEnjYQ3RNvuP4Zzc8t1enLNy7Rk8KNCtQPEQztENYWxkt9GaVDzeigt, welche konkrete Transaktion die Änderung dieses Kontos verursacht hat - Slot 352366983 gibt an, wann dieses Update auf der Blockchain stattfand
- Datenfeld enthält 165 Bytes Kontodaten, die als base58 codiert sind
Kontofilterung mit datasize verstehen
Das Datenfeld ist entscheidend – es enthält die eigentliche Struktur des token-Kontos. Nutzen wir dieses Wissen für eine intelligente Kontofilterung.Warum datasize-Filterung verwenden?
Um zu verstehen, warum wir filtern müssen, sehen wir uns zunächst an, was token-Konten tatsächlich sind. Für jedes token in einer Wallet gibt es ein separates On-Chain-Konto. Wenn deine Wallet drei verschiedene token enthält (USDC, BONK und SOL), hast du tatsächlich ein Wallet-Konto (dein primäres SOL-Konto) sowie drei token-Konten (eines für jeden token-Typ). Jedes token-Konto ist genau 165 Bytes groß und speichert, welches token es enthält (Mint-Adresse), wem es gehört (deine Wallet-Adresse) und wie viel von diesem token es enthält (Betrag). Das Token Program besitzt Millionen von Konten auf Solana. Nicht alle davon sind jedoch das, was wir als „token-Konten“ mit Benutzerguthaben verstehen. Folgendes geschieht mit und ohne Filterung: Ohne Filterung – die Flut:- token-Konten (165 Bytes) – Benutzerguthaben: Millionen von Konten
- Mint-Konten (82 Bytes) – token-Definitionen: Hunderttausende Konten
- Multisig-Konten (355 Bytes) – gemeinsame Wallet-Kontrollen: Zehntausende Konten
- Konten des Associated Token Program (verschiedene Größen) – Millionen von Konten
- Ohne Filterung: Millionen von Konto-Updates (Erstellung von Mints, Multisig-Änderungen usw.)
- Mit datasize-Filterung: Nur Änderungen an token-Guthaben
Woher kommen die 165 Bytes?
Das ist keine Magie – die Größe ergibt sich aus der Kontostruktur des SPL Token Program. Im Quellcode sehen wir, dass die StrukturAccount genau 165 Bytes definiert:
- Mint-Konten (82 Bytes)
- Multisig-Konten (355 Bytes)
- Konten des Associated Token Account Program
- Andere token-bezogene Konten mit abweichenden Größen
Kontostruktur decodieren
Da wir jetzt wissen, warum wir nach 165 Bytes gefiltert haben, decodieren wir den Inhalt unseres Beispielkontos:- Bytes 0–31: Mint-Adresse (welches token dieses Konto enthält)
- Bytes 32–63: Eigentümeradresse (wem dieses token-Konto gehört)
- Bytes 64–71: token-Betrag (wie viele token sich im Konto befinden)
- Bytes 72–164: Zusätzliche Metadaten (Delegierter, Zustand, Berechtigung zum Schließen usw.)
Filter kombinieren: datasize + memcmp für höchste Präzision
Da wir jetzt wissen, dass sich die Mint-Adresse in den Bytes 0–31 befindet, können wir noch spezifischer filtern. Nehmen wir an, wir möchten nur USDC-token-Konten überwachen. Wir können unseren Filterdatasize mit einem Filter memcmp kombinieren, um gezielt nach der exakten Mint-Adresse zu filtern:
- Eigentümerfilter: „Zeige mir Konten des Token Program“ (Millionen von Konten)
- Datasize-Filter: „Aber nur Standard-token-Konten mit 165 Bytes“ (Hunderttausende)
- Memcmp-Filter: „Und nur solche, die USDC enthalten“ (Tausende)
USDC-Konto-Updates lesen: Wer, wie viel, wo?
Sehen wir uns nun an, was diese gefilterten Updates tatsächlich enthalten. Erstellen wir einen USDC-spezifischen Monitor, der bei einer Änderung eines token-Kontos die wichtigsten Fragen beantwortet:- Wem gehört dieses token-Konto?
- Wie viel USDC enthält es jetzt?
- Wo (welches konkrete Konto) gab es eine Änderung?
- Wann ist diese Änderung erfolgt?
- Welche Transaktion hat die Änderung verursacht?
bs58.encode() in lesbare Strings.
Vollständige Filterreferenz
Zusätzlich zu den grundlegenden Filternowner, datasize und memcmp, die wir verwendet haben, unterstützen Kontoabonnements weitere Filteroptionen, mit denen du deine Ergebnisse noch stärker eingrenzen kannst:
Nach bestimmten Konten filtern
Überwache bestimmte Konten anhand ihrer öffentlichen Schlüssel:Kombinierte Filterstrategien
Die Stärke liegt in der Kombination mehrerer Filtertypen. Verwende dafür dieses mentale Modell:- Wirf ein weites Netz aus mit
owner– „Zeige mir alle Konten, die von diesem Programm verwaltet werden“ - Filtere nach Struktur mit
datasize– „Aber nur Konten dieses bestimmten Typs“ - Filtere nach bestimmten Daten mit
memcmp– „Und nur solche, die diese konkreten Informationen enthalten“ - Überwache bekannte Konten mit
account– „Oder überwache nur genau die Konten, die für mich relevant sind“
Das Gesamtbild verstehen
Stell dir Kontoabonnements wie einen Live-Feed mit Datenbankänderungen vor. Der Zustand von Solana ist im Wesentlichen ein riesiger Key-Value-Speicher, in dem jedes Konto einen Eintrag darstellt. Wenn Programme ausgeführt werden, ändern sie diese Konten. Mit deinem Abonnement kannst du die Änderungen bestimmter Einträge in Echtzeit verfolgen. Das Filtersystem funktioniert wie Datenbankindizes: Du überwachst nicht einfach „alle Änderungen“, sondern „Änderungen an Konten, die diesen Kriterien entsprechen“. So kannst du reaktionsfähige Anwendungen entwickeln, die sofort auf relevante On-Chain-Ereignisse reagieren, ohne dein System mit irrelevanten Daten zu überlasten.Dieses Muster auf andere Programme anwenden
Der hier beschriebene Ansatz funktioniert für jedes Solana-Programm. Dies ist das allgemeine Muster:- Recherchiere die Kontostruktur – Prüfe den Quellcode oder die Dokumentation des Programms
- Beginne mit der Eigentümerfilterung – Wähle das Programm aus, das die Konten verwaltet
- Wende Strukturfilter an – Verwende Kontogröße, Datenmuster oder andere Merkmale, um auf bestimmte Kontotypen einzugrenzen
- Füge gezielte Filter hinzu – Konzentriere dich auf bestimmte Konten, Zustände oder Datenwerte, die für deine Anwendung relevant sind