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.
#[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:
- 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:
- 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.
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));
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
.
{"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.
{"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.
{"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.
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 auf Solana. Wie Wallet- Konten haben Programme die gleiche zugrundeliegende Account Datenstruktur, jedoch mit wesentlichen Unterschieden in ihren Feldern.
{"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.
{"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 data
Feld eines Kontos gespeichert.
{"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.
{"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.
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);
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.
{"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.
{"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.
{"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.
{"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.
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 getMint()
Funktion deserialisiert das data
Feld eines mint account
in den
Mint
Datentyp, der vom Token Program definiert wird.
{"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?