Lezen van het netwerk
Dit gedeelte verkent hoe je gegevens kunt lezen van het Solana-netwerk door verschillende accounts op te halen om de structuur van een Solana-account te begrijpen.
Op Solana bestaan alle gegevens in "accounts". Je kunt gegevens op Solana zien als een openbare database met een enkele "Accounts"-tabel, waarbij elke invoer een account is met hetzelfde basis 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,}
Accounts
Accounts op Solana kunnen "state" of "uitvoerbare" programma's opslaan. Elk account heeft een "adres" (publieke sleutel) dat dient als unieke ID om de bijbehorende on-chain gegevens te lokaliseren.
Solana-accounts bevatten ofwel:
- State: Gegevens die bedoeld zijn om uit te lezen en te bewaren. Bijvoorbeeld, informatie over tokens, gebruikersgegevens of andere gegevens die binnen een programma zijn gedefinieerd.
- Uitvoerbare programma's: Accounts die de daadwerkelijke code van Solana- programma's bevatten. Deze accounts slaan instructies op die gebruikers kunnen aanroepen.
Deze scheiding tussen programmacode en programmastatus is een belangrijk kenmerk van Solana's Account Model. Voor meer details, raadpleeg de Solana Account Model pagina.
Wallet-account ophalen
Dit voorbeeld laat zien hoe je:
- Een nieuw keypair (publieke/private sleutelpaar) genereert.
- Een airdrop van SOL aanvraagt om het nieuwe adres te financieren.
- De accountgegevens voor het gefinancierde adres ophaalt.
Op Solana wordt bij het financieren van een nieuw adres met SOL automatisch een account aangemaakt dat eigendom is van het System Program. Alle "wallet"-accounts zijn simpelweg accounts in eigendom van het System Program die SOL bevatten en transacties kunnen ondertekenen.
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));
Een "wallet" op Solana is een account dat eigendom is van het
System Program,
een van Solana's ingebouwde programma's. Wallet accounts worden voornamelijk
gebruikt om SOL te bewaren (bijgehouden in het lamports
veld) en om
transacties te ondertekenen.
Wanneer je een wallet account opvraagt, bevat het antwoord de velden die in het voorbeeldresultaat worden getoond.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Het data
veld bevat de gegevens van het account opgeslagen als bytes.
Voor wallet accounts is dit veld leeg (0 bytes). Andere accounts gebruiken dit veld om programma-status of uitvoerbare programmacode op te slaan.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Het executable
veld geeft aan of het data
veld van het account uitvoerbare
programmacode bevat.
Voor wallets en accounts die programma-status opslaan, is dit veld false
.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Het lamports
veld bevat het SOL-saldo van het account, uitgedrukt in lamports.
Lamports zijn de kleinste eenheid van SOL. 1 SOL = 1.000.000.000 lamports.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Het owner
veld toont het programma dat eigenaar is van het account.
Voor wallets is de eigenaar altijd het System Program, met het adres
11111111111111111111111111111111
.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Het rentEpoch
veld is een verouderd veld van een afgeschaft mechanisme waarbij
accounts "rent" (in lamports) moesten betalen om hun gegevens op het netwerk te
behouden.
Dit veld wordt momenteel niet gebruikt, maar is opgenomen voor achterwaartse compatibiliteit.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Het space
veld toont het aantal bytes in het data
veld. Dit is geen veld in
het Account
type zelf, maar is opgenomen in de respons.
In dit voorbeeld is het space
veld 0 omdat het data
veld 0 bytes aan
gegevens bevat.
{"data": {"type": "Buffer","data": []},"executable": false,"lamports": 1000000000,"owner": "11111111111111111111111111111111","rentEpoch": 0,"space": 0}
Token Program ophalen
Dit 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 Token Program's broncode. 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 op Solana. Net als wallet accounts hebben programma's dezelfde onderliggende Account gegevensstructuur, maar met belangrijke verschillen in de velden.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Het veld executable
is ingesteld op true
, wat aangeeft dat het veld data
van dit account uitvoerbare programmacode bevat.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Voor program accounts slaat het veld data
de uitvoerbare code van het
programma op. Wallet accounts daarentegen hebben een leeg dataveld.
Wanneer je een Solana-programma implementeert, wordt de uitvoerbare code van het
programma opgeslagen in het veld data
van een account.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
Uitvoerbare program accounts hebben ook een programma dat is aangewezen als de
owner
van het account.
Alle program accounts zijn eigendom van een Loader-programma, wat een categorie ingebouwde programma's is die eigenaar zijn van uitvoerbare program accounts op Solana.
Voor het Token Program 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}
Mint account ophalen
Dit voorbeeld haalt het USD Coin (USDC) mint account op om te laten zien hoe programma's op Solana de status in afzonderlijke accounts opslaan.
Een Mint account is een account dat eigendom is van het Token Program. Het slaat globale metadata op voor een specifieke token, inclusief 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.
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);
Het belangrijkste punt in dit voorbeeld is dat het Mint account gegevens opslaat, geen uitvoerbare code.
Mint accounts 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 executable
veld is false
omdat het data
veld van het mint account
gegevens opslaat, geen uitvoerbare code.
Het Token Program definieert het Mint
datatype, dat wordt opgeslagen in het
data
veld van het mint account.
{"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 en het aantal decimalen.
Om uit een Mint account te lezen, moet je het data
veld deserialiseren naar
het Mint
datatype. Dit wordt behandeld in de volgende stap.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Het Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
) is eigenaar
van het mint account.
Dit betekent dat het data
veld van het mint account alleen kan worden
gewijzigd door de instructies die in het Token Program zijn gedefinieerd.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Deserialiseren van Mint Account
Het data
veld van een Solana account bevat ruwe bytes. Om deze gegevens
betekenisvol te interpreteren, moet je ze deserialiseren naar het juiste
datatype dat is gedefinieerd 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 gemakkelijker wordt om met de accountgegevens te werken.
Bijvoorbeeld, @solana/spl-token
bevat de getMint()
functie om het data
veld van een Mint account te deserialiseren naar het
Mint
datatype.
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 getMint()
functie deserialiseert het data
veld van een mint account
naar het
Mint
datatype gedefinieerd door het Token Program.
{"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 address
veld bevat het adres van het Mint account.
Het adres van het mint account wordt gebruikt om de token op het Solana-netwerk te identificeren.
Het mintAuthority
veld toont de autoriteit die nieuwe tokens mag aanmaken.
Dit is het enige account dat nieuwe eenheden van de token kan creëren.
Het supply
veld toont het totale aantal tokens dat is aangemaakt.
Deze waarde is in de kleinste eenheid van de token. Om de totale voorraad in
standaardeenheden te krijgen, pas je de waarde van het supply
veld aan met de
decimals
.
Het veld decimals
toont het aantal decimalen 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 veld freezeAuthority
toont de autoriteit die token accounts mag bevriezen.
Een token account dat bevroren is, kan de token in het account niet overdragen of verbranden.
Het veld tlvData
bevat extra gegevens voor Token Extensions (vereist verdere
deserialisatie).
Dit veld is alleen relevant voor accounts die zijn gemaakt door het Token Extension Program (Token2022).
Is this page helpful?