Daten vom Netzwerk lesen
Dieser Abschnitt erklärt, wie man Daten aus dem Solana-Netzwerk liest, indem man verschiedene Konten abruft, um die Struktur eines Solana-Kontos zu verstehen.
Auf Solana existieren alle Daten in "Konten". Sie können sich die Daten auf Solana als eine öffentliche Datenbank mit einer einzigen "Konten"-Tabelle vorstellen, wobei jeder Eintrag ein Konto mit dem gleichen Basis- Kontotyp ist.
Base Account Type
#[derive(PartialEq, Eq, Clone, Default)]pub struct Account {/// lamports in the accountpub lamports: u64,/// data held in this account#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]pub data: Vec<u8>,/// the program that owns this account. If executable, the program that loads this account.pub owner: Pubkey,/// this account's data contains a loaded program (and is now read-only)pub executable: bool,/// the epoch at which this account will next owe rentpub rent_epoch: Epoch,}
Konten
Konten auf Solana können "Zustand" oder "ausführbare" Programme speichern. Jedes Konto hat eine "Adresse" (öffentlicher Schlüssel), die als eindeutige ID dient und verwendet wird, um die entsprechenden On-Chain-Daten zu lokalisieren.
Solana-Konten enthalten entweder:
- State: Daten, die gelesen und gespeichert werden sollen. Zum Beispiel Informationen über Token, Benutzerdaten oder andere Daten, die innerhalb eines Programms definiert sind.
- Ausführbare Programme: Konten, die den tatsächlichen Code von Solana Programmen enthalten. Diese Konten speichern Anweisungen, die Benutzer aufrufen können.
Diese Trennung von Programmcode und Programmzustand ist ein Schlüsselmerkmal von Solanas Kontenmodell. Weitere Details finden Sie auf der Seite Solana-Kontenmodell.
Wallet-Konto abrufen
Dieses Beispiel zeigt, wie man:
- Ein neues keypair (öffentliches/privates Schlüsselpaar) generiert.
- Einen Airdrop von SOL anfordert, um die neue Adresse zu finanzieren.
- Die Kontodaten für die finanzierte Adresse abruft.
Auf Solana erstellt die Finanzierung einer neuen Adresse mit SOL automatisch ein Konto, das dem System Program gehört. Alle "Wallet"-Konten sind einfach System Program-eigene Konten, die SOL halten und Transaktionen signieren können.
Fetch Account
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));
Console
Click to execute the code.
Eine "Wallet" auf Solana ist ein Konto, das dem
System Program
gehört, einem der integrierten Programme von Solana. Wallet-Konten werden
hauptsächlich verwendet, um SOL zu halten (im lamports Feld erfasst) und um
Transaktionen zu signieren.
Wenn Sie ein Wallet-Konto abrufen, enthält die Antwort die im Beispiel gezeigten Felder.
Das data Feld enthält die als Bytes gespeicherten Daten des Kontos.
Bei Wallet-Konten ist dieses Feld leer (0 Bytes). Andere Konten verwenden dieses Feld, um entweder Programmzustände oder ausführbaren Programmcode zu speichern.
Das executable Feld gibt an, ob das data Feld des Kontos ausführbaren
Programmcode enthält.
Für Wallets und Konten, die Programmzustände speichern, ist dieses Feld false.
Das lamports Feld enthält das SOL-Guthaben des Kontos, angegeben in lamports.
Lamports sind die kleinste Einheit von SOL. 1 SOL = 1.000.000.000 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.
Example Output
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Das Feld rentEpoch ist ein veraltetes Feld aus einem nicht mehr verwendeten
Mechanismus, bei dem Konten "rent" (in lamports) berechnet wurde, um ihre Daten
im Netzwerk zu speichern.
Dieses Feld wird derzeit nicht verwendet, ist aber aus Gründen der Abwärtskompatibilität enthalten.
Example Output
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Das Feld space zeigt die Anzahl der Bytes im Feld data an. Dies ist kein
Feld im Typ Account selbst, sondern in der Antwort enthalten.
In diesem Beispiel ist das Feld space 0, weil das Feld data 0 Bytes an Daten
enthält.
Example Output
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Token Program abrufen
Dieses 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.
Fetch Program Account
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);
Console
Click to execute the code.
Das Token Program ist ein ausführbarer program account auf Solana. Wie Wallet- Konten haben Programme die gleiche zugrundeliegende Account Datenstruktur, jedoch mit wesentlichen Unterschieden in ihren Feldern.
Token Program Account
{"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
data Feld dieses Kontos ausführbaren Programmcode enthält.
Token Program Account
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Bei program account speichert das Feld data den ausführbaren Code des
Programms. Im Gegensatz dazu haben Wallet-Konten ein leeres Datenfeld.
Wenn du ein Solana-Programm bereitstellst, wird der ausführbare Code des
Programms im dataFeld eines Kontos gespeichert.
Token Program Account
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Ausführbare Programmkonten haben auch ein Programm, das als owner des Kontos
bezeichnet wird.
Alle program account werden von einem Loader-Programm verwaltet, einer Kategorie von integrierten Programmen, die ausführbare program account auf Solana besitzen.
Für das Token Program ist der owner das BPFLoader2-Programm.
Token Program Account
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Mint Account abrufen
Dieses Beispiel ruft das USD Coin (USDC) mint account ab, um zu zeigen, wie Programme auf Solana den Status in separaten Konten speichern.
Ein Mint account ist ein Konto, das dem Token Program gehört. Es speichert globale Metadaten für einen bestimmten Token, einschließlich der Gesamtversorgung, der Anzahl der Dezimalstellen und der Konten, die zum Prägen oder Einfrieren von Tokens berechtigt sind. Die Adresse des mint account identifiziert einen Token im Solana-Netzwerk eindeutig.
Fetch Program Account
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);
Console
Click to execute the code.
Der wichtigste Punkt in diesem Beispiel ist, dass das Mint Konten Zustand speichert, nicht ausführbaren Code.
Mint Konten gehören dem Token Program, das Anweisungen enthält, die definieren, wie Mint Konten erstellt und aktualisiert werden.
Mint Account
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Das executable Feld ist false, weil das data Feld des mint account Zustand
speichert, nicht ausführbaren Code.
Das Token Program definiert den Mint Datentyp, der im data Feld des mint
account gespeichert wird.
Mint Account
{"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 Konten zu lesen, müssen Sie das data Feld in den Mint
Datentyp deserialisieren. Dies wird im nächsten Schritt behandelt.
Mint Account
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Das Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) besitzt das
mint Konten.
Das bedeutet, dass das data Feld des mint account nur durch die Anweisungen
modifiziert werden kann, die im Token Program definiert sind.
Mint Account
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Deserialisieren des Mint Account
Das data Feld eines Solana-Kontos enthält rohe Bytes. Um diese Daten sinnvoll
zu interpretieren, müssen Sie sie in den entsprechenden Datentyp
deserialisieren, der von dem Programm definiert wird, dem das Konto gehört.
Die meisten Solana-Programme bieten Client-Bibliotheken mit Hilfsfunktionen, die den Deserialisierungsprozess abstrahieren. Diese Funktionen konvertieren die rohen Konto-Bytes in strukturierte Datentypen und erleichtern so die Arbeit mit den Kontodaten.
Zum Beispiel enthält @solana/spl-token die
getMint() Funktion, um das data Feld eines mint account
in den
Mint
Datentyp zu deserialisieren.
Deserialize Mint Account Data
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");
Console
Click to execute the code.
Mint Account Type
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 account
in den
Mint
Datentyp, der vom Token Program definiert wird.
Mint Account
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Die vollständig deserialisierten Mint Account Daten können im Solana Explorer eingesehen werden.
Das address Feld enthält die Adresse des mint account.
Die Adresse des mint account wird verwendet, um den Token im Solana-Netzwerk zu identifizieren.
Das mintAuthority Feld zeigt die Autorität, die neue Token prägen darf.
Dies ist das einzige Konto, das neue Einheiten des Tokens erstellen kann.
Das supply Feld zeigt die Gesamtzahl der Token, die geprägt wurden.
Dieser Wert ist in der kleinsten Einheit des Tokens angegeben. Um die
Gesamtmenge in Standardeinheiten zu erhalten, muss der Wert des supply Feldes
durch den decimals angepasst werden.
Das Feld decimals zeigt die Anzahl der Dezimalstellen für den Token.
Das Feld isInitialized gibt an, ob das Mint account initialisiert wurde.
Dieses Feld ist eine Sicherheitsüberprüfung, die im Token Program verwendet
wird.
Das Feld freezeAuthority zeigt die Autorität, die token accounts einfrieren
darf.
Ein token account, das eingefroren ist, kann den Token im Konto nicht übertragen oder verbrennen.
Das Feld tlvData enthält zusätzliche Daten für Token Extensions (erfordert
weitere Deserialisierung).
Dieses Feld ist nur relevant für Konten, die vom Token Extensions Program (Token2022) erstellt wurden.
Is this page helpful?