Der Kontext des Kontomodells
Überspringen Sie diesen Abschnitt, wenn Sie mit Solana-Konten und ihrer Struktur vertraut sind.
- Daten: Die tatsächlichen Bytes, die den Programmzustand, Token-Salden oder andere Informationen speichern
- Besitzer: Das Programm, das dieses Konto kontrolliert und seine Daten ändern kann
- Lamports: Der SOL-Saldo des Kontos für Freistellung von Miete
- Ausführbar: Ob dieses Konto Programmcode enthält
Einfaches Kontoabonnement
Beginnen wir mit einem einfachen Beispiel, das sich auf Änderungen in Token-Konten abonniert. Dieses Skript benachrichtigt Sie, wann immer sich Token-Salden ändern:BKMHWYLAX4un3HUbR7a3u9jPmzCiLNa4mSj1RiX11eWF geliefert.
Dieses Konto hat:
- 2.039.280 Lamports (~0,002 SOL-Saldo - dies ist der mietfreie Betrag für dieses Token-Konto)
- Besitzerprogramm
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA(dies ist das SPL-Token-Programm) - Transaktionssignatur
5C9Hr5nG2j8eQz6inxPmfyjbYdmXddzUDyR1iQgEnjYQ3RNvuP4Zzc8t1enLNy7Rk8KNCtQPEQztENYWxkt9GaVD, die zeigt, welche spezifische Transaktion dieses Konto geändert hat - Slot 352366983, der angibt, wann dieses Update auf der Blockchain aufgetreten ist
- Datenfeld mit 165 Bytes Kontodaten kodiert als base58
Verständnis der Kontofilterung mit datasize
Das Datenfeld ist entscheidend - es enthält die tatsächliche Token-Kontostruktur. Lassen Sie uns dieses Verständnis für ein intelligentes Kontofiltering nutzen.Warum datasize-Filterung verwenden?
Um zu verstehen, warum wir filtern müssen, lassen Sie uns zuerst verstehen, was Token-Konten tatsächlich sind. Für jedes Token, das eine Wallet hält, gibt es ein separates Konto on-chain. Wenn Ihre Wallet 3 verschiedene Token hält (USDC, BONK und SOL), haben Sie tatsächlich 1 Wallet-Konto (Ihr Haupt-SOL-Konto) plus 3 Token-Konten (eines für jeden Token-Typ). Jedes Token-Konto ist genau 165 Bytes lang und speichert: welches Token es hält (Mint-Adresse), wem es gehört (Ihre Wallet-Adresse) und wie viel von diesem Token es enthält (Menge). Das Token-Programm besitzt Millionen von Konten auf Solana, aber nicht alle sind das, was wir als “Token-Konten” verstehen, die Benutzerbilanzen halten. Hier ist, was mit und ohne Filterung passiert: Ohne Filterung - Die Flut:- Token-Konten (165 Bytes) - Benutzerbilanzen: Millionen von Konten
- Mint-Konten (82 Bytes) - Token-Definitionen: Hunderttausende von Konten
- Multisig-Konten (355 Bytes) - Gemeinsame Wallet-Kontrollen: Zehntausende von Konten
- Verbundene Token-Programmkonten (verschiedene Größen) - Millionen von Konten
- Ohne Filterung: Millionen von Kontoaktualisierungen (Mint-Erstellungen, Multisig-Änderungen usw.)
- Mit datasize-Filterung: Nur Token-Saldoänderungen
Woher kommen die 165 Bytes?
Das ist keine Magie - es stammt aus der SPL-Token-Programm-Kontostruktur. Im Quellcode sehen wir, dass dieAccount-Struktur genau 165 Bytes definiert:
- Mint-Konten (82 Bytes)
- Multisig-Konten (355 Bytes)
- Verbundene Token-Programmkonten
- Andere tokenbezogene Konten mit unterschiedlichen Größen
Dekodierung der Kontostruktur
Jetzt, da wir verstehen, warum wir nach 165 Bytes gefiltert haben, lassen Sie uns dekodieren, was sich in unserem Beispielkonto befindet:- Bytes 0-31: Mint-Adresse (welches Token dieses Konto hält)
- Bytes 32-63: Eigentümeradresse (wem dieses Token-Konto gehört)
- Bytes 64-71: Token-Menge (wie viele Token sich im Konto befinden)
- Bytes 72-164: Zusätzliche Metadaten (Bevollmächtigter, Zustand, Schließberechtigung usw.)
Kombinieren von Filtern: datasize + memcmp für höchste Genauigkeit
Jetzt, wo wir wissen, dass sich die Mint-Adresse bei Bytes 0-31 befindet, können wir noch spezifischer werden. Angenommen, wir möchten nur USDC-Token-Konten überwachen. Wir können unserendatasize-Filter mit einem memcmp-Filter kombinieren, um die genaue Mint-Adresse zu treffen:
- Besitzerfilter: „Gib mir Konten, die vom Token-Programm verwaltet werden“ (Millionen von Konten)
- Datasize-Filter: „Aber nur 165-Byte-Standard-Token-Konten“ (Hunderttausende)
- Memcmp-Filter: „Und nur diejenigen, die USDC halten“ (Tausende)
Lesen von USDC-Kontoaktualisierungen: Wer, Wie viel, Wo?
Sehen wir uns nun an, was diese gefilterten Updates tatsächlich enthalten. Lassen Sie uns einen USDC-spezifischen Monitor erstellen, der die entscheidenden Fragen beantwortet, wenn sich ein Token-Konto ändert:- Wer besitzt dieses Token-Konto?
- Wie viel USDC enthält es jetzt?
- Wo (welches spezifische Konto) hat sich geändert?
- Wann ist diese Änderung aufgetreten?
- Welche Transaktion hat die Änderung verursacht?
bs58.encode()-Funktion, um binäre Buffer-Objekte in lesbare Zeichenfolgen zu konvertieren.
Komplette Filterreferenz
Neben den Basisfilternowner, datasize und memcmp, die wir verwendet haben, unterstützen Kontoabonnements zusätzliche Filteroptionen, um Ihre Ergebnisse weiter zu verfeinern:
Spezifische Kontofilterung
Überwachen Sie genaue Konten anhand ihrer öffentlichen Schlüssel:Kombinierte Filterstrategien
Die Stärke kommt aus der Kombination mehrerer Filtertypen. Hier ist das Grundmodell:- Werfen Sie ein großes Netz mit
owner- “Gib mir alle von diesem Programm verwalteten Konten” - Filter nach Struktur mit
datasize- “Aber nur Konten dieses speziellen Typs” - Zielspezifische Daten mit
memcmp- “Und nur diejenigen mit diesen spezifischen Informationen” - Überwachen Sie bekannte Konten mit
account- “Oder überwachen Sie einfach diese genauen Konten, die mir wichtig sind”
Das größere Bild verstehen
Betrachten Sie Kontoabonnements als das Beobachten eines Live-Feeds von Datenbankänderungen. Der Zustand von Solana ist im Wesentlichen ein massiver Key-Value-Store, bei dem jedes Konto ein Eintrag ist. Wenn Programme ausgeführt werden, ändern sie diese Konten. Ihr Abonnement ermöglicht es Ihnen, spezifische Einträge in Echtzeit ändern zu sehen. Das Filtersystem funktioniert wie Datenbankindizes - Sie beobachten nicht nur “alle Änderungen”, sondern “Änderungen an Konten, die diesen Kriterien entsprechen.” Dies ermöglicht es, reaktionsschnelle Anwendungen zu erstellen, die sofort auf relevante On-Chain-Ereignisse reagieren, ohne Ihr System mit irrelevanten Daten zu überlasten.Anwendung dieses Musters auf andere Programme
Der Ansatz, den wir gelernt haben, funktioniert für jedes Solana-Programm. Hier ist das allgemeine Muster:- Erforschen der Kontostruktur - Überprüfen Sie den Quellcode oder die Dokumentation des Programms
- Beginnen Sie mit der Besitzerfilterung - Ziel ist das Programm, das die Konten verwaltet
- Anwenden von Strukturfiltern - Verwenden Sie Kontogröße, Datenmuster oder andere Merkmale, um auf spezifische Kontotypen einzugrenzen
- Hinzufügen gezielter Filter - Fokussieren Sie sich auf spezifische Konten, Zustände oder Datenwerte, die für Ihre Anwendung wichtig sind