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 Feld data enthält die Daten des Kontos, gespeichert als Bytes. Bei
Wallet-Konten ist dieses Feld leer (0 Bytes).
Das Feld executable gibt an, ob das Feld data des Kontos ausführbaren
Programmcode enthält. Bei Wallet-Konten ist dieses Feld false.
Das Feld lamports enthält das SOL-Guthaben des Kontos in
Lamports.
Das Feld owner zeigt das Programm an, das das Konto besitzt. Bei Wallets ist
der Besitzer immer das System Program mit der Adresse
11111111111111111111111111111111.
Das Feld rentEpoch ist ein veraltetes Feld aus einem nicht mehr verwendeten
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 wird in der Antwort enthalten.
In diesem Beispiel ist das Feld space 0, da 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.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 anzeigt, dass das Feld data
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 Programmkonto gehört seinem
Loader-Programm. In diesem Beispiel ist
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.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-Kontos speichert Zustandsdaten, keinen ausführbaren
Code, daher ist das executable-Feld false.
Das Token-Programm 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 z. B. die
Mint-Berechtigung, Gesamtmenge und Anzahl der Dezimalstellen.
Um aus einem Mint-Konto zu lesen, müssen Sie das data-Feld in den
Mint-Datentyp deserialisieren, wie im
nächsten Beispiel gezeigt.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Das Mint-Konto gehört dem
Token-Programm. Das bedeutet, dass
sein data-Feld nur durch die Anweisungen des Token-Programms 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 vom
Programm definiert, das das Konto besitzt. Die meisten Solana-Programme bieten
Client-Bibliotheken mit Hilfsfunktionen an, die den Deserialisierungsprozess
abstrahieren. Diese Funktionen konvertieren die Rohdaten des Kontos in
strukturierte Datentypen und erleichtern so die Arbeit mit den Kontodaten.
Zum Beispiel enthält die @solana/spl-token Bibliothek die
getMint()-Funktion, um das data-Feld eines Mint-Kontos in
den
Mint-Datentyp
zu deserialisieren, der vom Token-Programm definiert wird.
import { PublicKey, Connection } from "@solana/web3.js";import { getMint } from "@solana/spl-token";const connection = new Connection("https://api.mainnet.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 getMint()-Funktion deserialisiert das data-Feld eines Mint-Kontos in
den Mint-Kontotyp.
{"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-Konten.
Das Feld mintAuthority zeigt das einzige Konto, das neue Einheiten des Tokens
erstellen kann.
Das Feld supply zeigt die Gesamtzahl der Token, die geminted wurden. Dieser
Wert wird in der kleinsten Einheit des Tokens gemessen. Um das Gesamtangebot in
Standardeinheiten zu erhalten, passen Sie den Wert des Feldes supply durch die
decimals an.
Das Feld decimals zeigt die Anzahl der Dezimalstellen für den Token.
Das Feld isInitialized gibt an, ob das Mint-Konto initialisiert wurde. Dieses
Feld ist eine Sicherheitsprüfung, die im Token Program verwendet wird.
Das Feld freezeAuthority zeigt das Konto mit der Berechtigung, Token-Konten
einzufrieren. Ein eingefrorenes Token-Konto kann den darin enthaltenen Token
weder übertragen noch verbrennen.
Das Feld tlvData enthält zusätzliche Daten für Token Extensions und erfordert
eine weitere Deserialisierung. Dieses Feld ist nur für Konten relevant, die vom
Token Extension Program (Token2022) erstellt wurden.
Is this page helpful?