Lezen van het netwerk
Lees gegevens van het Solana-netwerk door verschillende accounts op te halen. Dit gedeelte helpt je de structuur van Solana accounts te begrijpen. Elk Solana-account heeft een uniek adres dat wordt gebruikt om de bijbehorende on-chain gegevens te lokaliseren. Accounts bevatten ofwel statusgegevens of een uitvoerbaar programma.
Een wallet-account ophalen
Een wallet is een account dat eigendom is van het System Program. Wallets worden voornamelijk gebruikt om SOL te bewaren en transacties te ondertekenen. Wanneer SOL voor het eerst naar een nieuw adres wordt verzonden, wordt automatisch een systeemaccount aangemaakt.
Het onderstaande voorbeeld genereert een nieuw keypair, vraagt SOL aan om het nieuwe openbare sleuteladres te financieren, en haalt de accountgegevens op voor de nieuw gefinancierde wallet.
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));
Wanneer je een wallet-account ophaalt, bevat het antwoord de velden die in het voorbeeldresultaat aan de rechterkant worden getoond.
Het data veld bevat de gegevens van het account opgeslagen als bytes. Voor
wallet- accounts is dit veld leeg (0 bytes).
Het executable veld geeft aan of het data veld van het account uitvoerbare
programmacode bevat. Voor wallet-accounts is dit veld false.
Het lamports veld bevat het SOL-saldo van het account, in
lamports.
Het veld owner toont het programma dat eigenaar is van het account. Voor
wallets is de eigenaar altijd het System Program, met het adres
11111111111111111111111111111111.
Het veld rentEpoch is een verouderd veld van een afgeschaft rent-mechanisme.
(Dit veld is opgenomen voor achterwaartse compatibiliteit.)
Het veld space toont het aantal bytes in het veld data. Dit is geen veld in
het Account type zelf, maar is
opgenomen in de respons.
In dit voorbeeld is het veld space 0 omdat het veld data 0 bytes aan
gegevens bevat.
Het Token Program ophalen
Het onderstaande voorbeeld haalt het Token Program op om het verschil tussen wallet- en program accounts te demonstreren. Het program account slaat de gecompileerde bytecode op voor de broncode van het Token Program. Je kunt dit program account bekijken op de Solana Explorer.
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);
Het Token Program is een uitvoerbaar program account. Programma's hebben dezelfde onderliggende velden als alle accounts, maar met belangrijke verschillen.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Het executable veld is ingesteld op true, wat aangeeft dat het data veld
van het account uitvoerbare code bevat.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Het data veld bevat de uitvoerbare code van het programma.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Elk program account is eigendom van zijn
loader programma. In dit voorbeeld is de
owner het BPFLoader2 programma.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Een mint account ophalen
Een mint account is een account dat eigendom is van het Token Program en dat globale metadata opslaat voor een specifieke token. Dit omvat de totale voorraad, het aantal decimalen en de accounts die geautoriseerd zijn om tokens te minten of te bevriezen. Het adres van het mint account identificeert een token uniek op het Solana-netwerk.
Het onderstaande voorbeeld haalt het USD Coin Mint account op om te demonstreren hoe de status van een programma wordt opgeslagen in een apart 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);
Mint accounts slaan status op, geen uitvoerbare code. Ze zijn eigendom van het Token Program, dat instructies bevat die definiëren hoe mint accounts gemaakt en bijgewerkt kunnen worden.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Het data veld van het mint account slaat status op, geen uitvoerbare code, dus
het executable veld is false.
Het Token Program definieert het Mint datatype, dat wordt opgeslagen in het
data veld.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Het data veld bevat de geserialiseerde Mint accountstatus, zoals de mint
authority, totale voorraad, aantal decimalen.
Om uit een Mint account te lezen, moet je het data veld deserialiseren naar
het Mint datatype, wat wordt getoond in het
volgende voorbeeld.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Het mint account is eigendom van het
Token Program. Dit betekent dat
het data veld alleen kan worden gewijzigd door de instructies van het Token
Program.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Deserialiseer mint account
Voordat de ruwe bytes in het data veld van een account zinvol kunnen worden
geïnterpreteerd, moeten ze worden gedeserialiseerd. Het juiste datatype wordt
bepaald door het programma dat eigenaar is van het account. De meeste
Solana-programma's bieden clientbibliotheken met hulpfuncties die het
deserialisatieproces abstraheren. Deze functies zetten de ruwe accountbytes om
in gestructureerde datatypes, waardoor het makkelijker wordt om met de
accountgegevens te werken.
Bijvoorbeeld, de @solana/spl-token bibliotheek bevat de
getMint() functie om te helpen bij het deserialiseren van
het data veld van een mint account naar het
Mint
datatype dat door het Token Program is gedefinieerd.
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>,}
De functie getMint() deserialiseert het data veld van een mint account
naar het Mint account type.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Je kunt de volledig gedeserialiseerde mint account data bekijken in de Solana Explorer.
Het veld address bevat het adres van het mint account.
Het veld mintAuthority toont het enige account dat nieuwe eenheden van de
token kan aanmaken.
Het veld supply toont het totale aantal tokens dat is gemint. Deze waarde
wordt gemeten in de kleinste eenheid van de token. Om het totale aanbod in
standaard eenheden te krijgen, pas je de waarde van het veld supply aan met de
decimals.
Het veld decimals toont het aantal decimale plaatsen voor de token.
Het veld isInitialized geeft aan of het mint account is geïnitialiseerd. Dit
veld is een veiligheidscontrole die wordt gebruikt in het Token Program.
Het freezeAuthority veld toont de account met de bevoegdheid om token accounts
te bevriezen. Een bevroren token account kan de tokens die het bevat niet
overdragen of verbranden.
Het tlvData veld bevat extra gegevens voor Token Extensions en vereist verdere
deserialisatie. Dit veld is alleen relevant voor accounts die zijn aangemaakt
door het Token Extension Program (Token2022).
Is this page helpful?