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.

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,
}

AccountsAccounts

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:

  1. Een nieuw keypair (publieke/private sleutelpaar) genereert.
  2. Een airdrop van SOL aanvraagt om het nieuwe adres te financieren.
  3. 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.

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.

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.

Example Output
{
"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.

Example Output
{
"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.

Example Output
{
"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.

Example Output
{
"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.

Example Output
{
"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.

Example Output
{
"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.

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

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.

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.

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.

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.

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.

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.

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.

Example Output
{
"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.

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.

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.

Token Program Account
{
"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.

Token Program Account
{
"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.

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

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

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.

Het veld executable is ingesteld op true, wat aangeeft dat het veld data van dit account uitvoerbare programmacode bevat.

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.

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.

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

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.

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.

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

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.

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

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

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.

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.

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.

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.

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

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>,
}

De getMint() functie deserialiseert het data veld van een mint account naar het Mint datatype gedefinieerd door het Token Program.

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

De getMint() functie deserialiseert het data veld van een mint account naar het Mint datatype gedefinieerd door het Token Program.

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

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

Is this page helpful?

Inhoudsopgave

Pagina Bewerken