Daten vom Netzwerk lesen
Lesen Sie Daten aus dem Solana-Netzwerk, indem Sie verschiedene Konten abrufen. Dieser Abschnitt hilft Ihnen, die Struktur von Solana Konten zu verstehen. Jedes Solana-Konto hat eine eindeutige Adresse, die verwendet wird, um die entsprechenden On-Chain-Daten zu lokalisieren. Konten enthalten entweder Zustandsdaten oder ein ausführbares Programm.
Ein Wallet-Konto abrufen
Ein Wallet ist ein Konto, das dem System Program gehört. Wallets werden hauptsächlich verwendet, um SOL zu halten und Transaktionen zu signieren. Wenn SOL zum ersten Mal an eine neue Adresse gesendet wird, wird automatisch ein System-Konto erstellt.
Das folgende Beispiel generiert ein neues keypair, fordert SOL an, um die neue öffentliche Schlüsseladresse zu finanzieren, und ruft die Kontodaten für das neu finanzierte Wallet ab.
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";const keypair = Keypair.generate();console.log(`Public Key: ${keypair.publicKey}`);const connection = new Connection("http://localhost:8899", "confirmed");// Funding an address with SOL automatically creates an accountconst signature = await connection.requestAirdrop(keypair.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");const accountInfo = await connection.getAccountInfo(keypair.publicKey);console.log(JSON.stringify(accountInfo, null, 2));
Wenn Sie ein Wallet-Konto abrufen, enthält die Antwort die Felder, die im Beispielausgabe auf der rechten Seite gezeigt werden.
Das data Feld enthält die als Bytes gespeicherten Daten des Kontos. Bei
Wallet- Konten ist dieses Feld leer (0 Bytes).
Das executable Feld gibt an, ob das data Feld des Kontos ausführbaren
Programmcode enthält. Bei Wallet-Konten ist dieses Feld false.
Das lamports Feld enthält das SOL-Guthaben des Kontos in
Lamports.
Das Feld owner zeigt das Programm an, dem das Konto gehört. Bei Wallets ist
der Eigentümer immer das System Program mit der Adresse
11111111111111111111111111111111.
Das Feld rentEpoch ist ein Legacy-Feld aus einem veralteten rent-Mechanismus.
(Dieses Feld ist aus Gründen der Abwärtskompatibilität enthalten.)
Das Feld space zeigt die Anzahl der Bytes an, die im Feld data enthalten
sind. Dies ist kein Feld im Account-Typ
selbst, sondern ist in der Antwort enthalten.
In diesem Beispiel ist das Feld space 0, weil das Feld data 0 Bytes an Daten
enthält.
Token Program abrufen
Das folgende Beispiel ruft das Token Program ab, um den Unterschied zwischen Wallet- und program account zu demonstrieren. Der program account speichert den kompilierten Bytecode für den Quellcode des Token Programs. Du kannst diesen program account im Solana Explorer ansehen.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");const accountInfo = await connection.getAccountInfo(address);
Das Token Program ist ein ausführbarer program account. Programme haben die gleichen zugrunde liegenden Felder wie alle Konten, aber mit wesentlichen Unterschieden.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Das Feld executable ist auf true gesetzt, was darauf hinweist, dass das
dataFeld des Kontos ausführbaren Code enthält.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Das Feld data speichert den ausführbaren Code des Programms.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Jedes program account gehört seinem
Loader-Programm. In diesem Beispiel ist
der owner das BPFLoader2-Programm.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Ein mint account abrufen
Ein mint account ist ein Konto, das dem Token Program gehört und globale Metadaten für einen bestimmten Token speichert. Dazu gehören die Gesamtversorgung, die Anzahl der Dezimalstellen und die Konten, die zum Prägen oder Einfrieren von Tokens berechtigt sind. Die Adresse des mint account identifiziert einen Token im Solana-Netzwerk eindeutig.
Das folgende Beispiel ruft das USD Coin Mint account ab, um zu zeigen, wie der Zustand eines Programms in einem separaten Konto gespeichert wird.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const accountInfo = await connection.getAccountInfo(address);
Mint accounts speichern Zustand, nicht ausführbaren Code. Sie gehören dem Token Program, das Anweisungen enthält, die definieren, wie mint accounts erstellt und aktualisiert werden.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Das data Feld des mint account speichert Zustand, nicht ausführbaren Code,
daher ist das executable Feld false.
Das Token Program definiert den Mint Datentyp, der im data Feld gespeichert
wird.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Das data Feld enthält den serialisierten Mint Kontenzustand, wie die mint
authority, die Gesamtversorgung und die Anzahl der Dezimalstellen.
Um aus einem Mint account zu lesen, müssen Sie das data Feld in den Mint
Datentyp deserialisieren, was im nächsten Beispiel
gezeigt wird.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Der mint account gehört dem
Token Program. Das bedeutet, dass
sein data Feld nur durch die Anweisungen des Token Programs geändert werden
kann.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Mint account deserialisieren
Bevor die Rohdaten im data Feld eines Kontos sinnvoll interpretiert werden
können, müssen sie deserialisiert werden. Der entsprechende Datentyp wird durch
das Programm definiert, dem das Konto gehört. Die meisten Solana-Programme
bieten Client-Bibliotheken mit Hilfsfunktionen, die den Deserialisierungsprozess
abstrahieren. Diese Funktionen konvertieren die rohen Kontenbytes in
strukturierte Datentypen und erleichtern so die Arbeit mit den Kontendaten.
Zum Beispiel enthält die @solana/spl-token Bibliothek die
getMint() Funktion, um das data Feld eines mint account
in den
Mint
Datentyp zu deserialisieren, der vom Token Program definiert wird.
import { PublicKey, Connection } from "@solana/web3.js";import { getMint } from "@solana/spl-token";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const mintData = await getMint(connection, address, "confirmed");
pub struct Mint {/// Optional authority used to mint new tokens. The mint authority may only/// be provided during mint creation. If no mint authority is present/// then the mint has a fixed supply and no further tokens may be/// minted.pub mint_authority: COption<Pubkey>,/// Total supply of tokens.pub supply: u64,/// Number of base 10 digits to the right of the decimal place.pub decimals: u8,/// Is `true` if this structure has been initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
Die Funktion getMint() deserialisiert das data Feld eines mint account
in den Mint-Kontentyp.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Sie können die vollständig deserialisierten mint account Daten im Solana Explorer ansehen.
Das Feld address enthält die Adresse des mint account.
Das Feld mintAuthority zeigt das einzige Konto an, das neue Einheiten des
Tokens erstellen kann.
Das Feld supply zeigt die Gesamtzahl der Tokens an, die geminted wurden.
Dieser Wert wird in der kleinsten Einheit des Tokens gemessen. Um die
Gesamtversorgung in Standardeinheiten zu erhalten, passen Sie den Wert des
Feldes supply anhand des Feldes decimals an.
Das Feld decimals zeigt die Anzahl der Dezimalstellen für den Token an.
Das Feld isInitialized gibt an, ob der mint account initialisiert wurde.
Dieses Feld ist eine Sicherheitsüberprüfung, die im Token Program verwendet
wird.
Das Feld freezeAuthority zeigt das Konto mit der Berechtigung zum Einfrieren
von token accounts. Ein eingefrorenes token account kann den enthaltenen Token
nicht übertragen oder verbrennen.
Das Feld tlvData enthält zusätzliche Daten für Token Extensions und erfordert
weitere Deserialisierung. Dieses Feld ist nur relevant für Konten, die vom
Token Extension Program (Token2022) erstellt wurden.
Is this page helpful?