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 account
pub 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 rent
pub rent_epoch: Epoch,
}

KontenKonten

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:

  • Zustand: Daten, die gelesen und gespeichert werden sollen. Zum Beispiel Informationen über Tokens, 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:

  1. Ein neues keypair (öffentliches/privates Schlüsselpaar) generiert.
  2. Einen Airdrop von SOL anfordert, um die neue Adresse zu finanzieren.
  3. 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 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.

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
}

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.

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.

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 program account haben auch ein Programm, das als owner des Kontos festgelegt ist.

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
}

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.

Das Feld executable ist auf true gesetzt, was darauf hinweist, dass das data Feld dieses Kontos ausführbaren Programmcode enthält.

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.

Ausführbare program account haben auch ein Programm, das als owner des Kontos festgelegt ist.

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
}

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.

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.

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.

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

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.

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