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.

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 account
const 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.

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.

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.

Example output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

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.

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. Programme haben die gleichen zugrunde liegenden Felder wie alle Konten, aber mit wesentlichen Unterschieden.

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 dataFeld des Kontos ausführbaren Code 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
}

Das Feld data speichert den ausführbaren Code des Programms.

Token program account
{
"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.

Token program account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

Das Token Program ist ein ausführbarer program account. Programme haben die gleichen zugrunde liegenden Felder wie alle Konten, aber mit wesentlichen Unterschieden.

Das Feld executable ist auf true gesetzt, was darauf hinweist, dass das dataFeld des Kontos ausführbaren Code enthält.

Das Feld data speichert den ausführbaren Code des Programms.

Jedes program account gehört seinem Loader-Programm. In diesem Beispiel 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
}

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.

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.

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.

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 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.

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 account zu lesen, müssen Sie das data Feld in den Mint Datentyp deserialisieren, was im nächsten Beispiel gezeigt wird.

Mint account
{
"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.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

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.

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.

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.

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.

Mint account
{
"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.

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 initialized
pub 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.

Mint account
{
"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.

Die Funktion getMint() deserialisiert das data Feld eines mint account in den Mint-Kontentyp.

Mint account
{
"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.

Deserialized mint data
{
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"supply": "8985397351591790",
"decimals": 6,
"isInitialized": true,
"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
"tlvData": {
"type": "Buffer",
"data": []
}
}

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten

Verwaltet von

© 2025 Solana Foundation.
Alle Rechte vorbehalten.
Verbinden Sie sich