Lettura dalla rete

Questa sezione esplora come leggere i dati dalla rete Solana recuperando diversi account per comprendere la struttura di un account Solana.

Su Solana, tutti i dati esistono negli "account". Puoi pensare ai dati su Solana come a un database pubblico con una singola tabella "Account", dove ogni voce è un account con lo stesso tipo base di Account.

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

AccountAccount

Gli account su Solana possono memorizzare "stato" o programmi "eseguibili". Ogni account ha un "indirizzo" (chiave pubblica) che funge da ID univoco utilizzato per localizzare i dati corrispondenti sulla blockchain.

Gli account Solana contengono:

  • Stato: dati che devono essere letti e persistenti. Ad esempio, informazioni sui token, dati utente o altri dati definiti all'interno di un programma.
  • Programmi eseguibili: account contenenti il codice effettivo dei programmi Solana. Questi account memorizzano istruzioni che gli utenti possono invocare.

Questa separazione tra codice del programma e stato del programma è una caratteristica chiave del Modello di Account di Solana. Per maggiori dettagli, consulta la pagina Modello di Account Solana.

Recuperare un account wallet

Questo esempio dimostra come:

  1. Generare un nuovo keypair (coppia di chiavi pubblica/privata).
  2. Richiedere un airdrop di SOL per finanziare il nuovo indirizzo.
  3. Recuperare i dati dell'account per l'indirizzo finanziato.

Su Solana, finanziare un nuovo indirizzo con SOL crea automaticamente un account posseduto dal System Program. Tutti gli account "wallet" sono semplicemente account posseduti dal System Program che contengono SOL e possono firmare transazioni.

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.

Un "wallet" su Solana è un account posseduto dal System Program, che è uno dei programmi integrati di Solana. Gli account wallet sono utilizzati principalmente per conservare SOL (tracciati nel campo lamports) e per firmare transazioni.

Quando recuperi un account wallet, la risposta include i campi mostrati nell' esempio di output.

Il campo data contiene i dati dell'account memorizzati come byte.

Per gli account wallet, questo campo è vuoto (0 byte). Altri account utilizzano questo campo per memorizzare lo stato del programma o il codice eseguibile del programma.

Il campo executable indica se il campo data dell'account contiene codice di programma eseguibile.

Per i wallet e gli account che memorizzano lo stato del programma, questo campo è false.

Il campo lamports contiene il saldo SOL dell'account, denominato in lamport.

I lamport sono l'unità più piccola di SOL. 1 SOL = 1.000.000.000 lamport.

Il campo owner mostra il programma che possiede l'account.

Per i wallet, il proprietario è sempre il System Program, con l'indirizzo 11111111111111111111111111111111.

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

Il campo rentEpoch è un campo legacy di un meccanismo deprecato in cui agli account veniva addebitato il "rent" (in lamport) per mantenere i propri dati sulla rete.

Questo campo attualmente non è utilizzato, ma è incluso per retrocompatibilità.

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

Il campo space mostra il numero di byte nel campo data. Questo non è un campo nel tipo Account stesso, ma è incluso nella risposta.

In questo esempio, il campo space è 0 perché il campo data contiene 0 byte di dati.

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

Un "wallet" su Solana è un account posseduto dal System Program, che è uno dei programmi integrati di Solana. Gli account wallet sono utilizzati principalmente per conservare SOL (tracciati nel campo lamports) e per firmare transazioni.

Quando recuperi un account wallet, la risposta include i campi mostrati nell' esempio di output.

Il campo data contiene i dati dell'account memorizzati come byte.

Per gli account wallet, questo campo è vuoto (0 byte). Altri account utilizzano questo campo per memorizzare lo stato del programma o il codice eseguibile del programma.

Il campo executable indica se il campo data dell'account contiene codice di programma eseguibile.

Per i wallet e gli account che memorizzano lo stato del programma, questo campo è false.

Il campo lamports contiene il saldo SOL dell'account, denominato in lamport.

I lamport sono l'unità più piccola di SOL. 1 SOL = 1.000.000.000 lamport.

Il campo owner mostra il programma che possiede l'account.

Per i wallet, il proprietario è sempre il System Program, con l'indirizzo 11111111111111111111111111111111.

Il campo rentEpoch è un campo legacy di un meccanismo deprecato in cui agli account veniva addebitato il "rent" (in lamport) per mantenere i propri dati sulla rete.

Questo campo attualmente non è utilizzato, ma è incluso per retrocompatibilità.

Il campo space mostra il numero di byte nel campo data. Questo non è un campo nel tipo Account stesso, ma è incluso nella risposta.

In questo esempio, il campo space è 0 perché il campo data contiene 0 byte di dati.

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

Recuperare il Token Program

Questo esempio recupera il Token Program per dimostrare la differenza tra account wallet e program account.

Il program account memorizza il bytecode compilato per il codice sorgente del Token Program. Puoi visualizzare questo program account su 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.

Il Token Program è un program account eseguibile su Solana. Come gli account wallet, i programmi hanno la stessa struttura dati sottostante Account, ma con differenze chiave nei suoi campi.

Il campo executable è impostato su true, indicando che il campo data di questo account contiene codice di programma eseguibile.

Per gli account di programma, il campo data memorizza il codice eseguibile del programma. Al contrario, gli account wallet hanno un campo dati vuoto.

Quando si distribuisce un programma Solana, il codice eseguibile del programma viene memorizzato nel campo data di un account.

Gli account di programma eseguibili hanno anche un programma designato come owner dell'account.

Tutti gli account di programma sono di proprietà di un programma Loader, che è una categoria di programmi integrati che possiedono account di programma eseguibili su Solana.

Per il Token Program, il owner è il programma BPFLoader2.

Il Token Program è un program account eseguibile su Solana. Come gli account wallet, i programmi hanno la stessa struttura dati sottostante Account, ma con differenze chiave nei suoi campi.

Il campo executable è impostato su true, indicando che il campo data di questo account contiene codice di programma eseguibile.

Per gli account di programma, il campo data memorizza il codice eseguibile del programma. Al contrario, gli account wallet hanno un campo dati vuoto.

Quando si distribuisce un programma Solana, il codice eseguibile del programma viene memorizzato nel campo data di un account.

Gli account di programma eseguibili hanno anche un programma designato come owner dell'account.

Tutti gli account di programma sono di proprietà di un programma Loader, che è una categoria di programmi integrati che possiedono account di programma eseguibili su Solana.

Per il Token Program, il owner è il programma BPFLoader2.

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

Recuperare un mint account

Questo esempio recupera il mint account di USD Coin (USDC) per mostrare come i programmi su Solana memorizzano lo stato in account separati.

Un Mint account è un account di proprietà del Token Program. Memorizza i metadati globali per un token specifico, inclusi la fornitura totale, il numero di decimali e gli account autorizzati a coniare o congelare token. L'indirizzo del mint account identifica in modo univoco un token sulla rete Solana.

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.

Il punto chiave da notare in questo esempio è che il Mint account memorizza lo stato, non codice eseguibile.

I Mint account sono di proprietà del Token Program, che include istruzioni che definiscono come creare e aggiornare i Mint account.

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

Il campo executable è false perché il campo data del mint account memorizza lo stato, non codice eseguibile.

Il Token Program definisce il tipo di dati Mint, che viene memorizzato nel campo data del mint account.

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

Il campo data contiene lo stato serializzato dell'account Mint, come l'autorità del mint, la fornitura totale, il numero di decimali.

Per leggere da un Mint account, devi deserializzare il campo data nel tipo di dati Mint. Questo verrà trattato nel prossimo passaggio.

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

Il Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) possiede il mint account.

Questo significa che il campo data del mint account può essere modificato solo dalle istruzioni definite nel Token Program.

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

Il punto chiave da notare in questo esempio è che il Mint account memorizza lo stato, non codice eseguibile.

I Mint account sono di proprietà del Token Program, che include istruzioni che definiscono come creare e aggiornare i Mint account.

Il campo executable è false perché il campo data del mint account memorizza lo stato, non codice eseguibile.

Il Token Program definisce il tipo di dati Mint, che viene memorizzato nel campo data del mint account.

Il campo data contiene lo stato serializzato dell'account Mint, come l'autorità del mint, la fornitura totale, il numero di decimali.

Per leggere da un Mint account, devi deserializzare il campo data nel tipo di dati Mint. Questo verrà trattato nel prossimo passaggio.

Il Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) possiede il mint account.

Questo significa che il campo data del mint account può essere modificato solo dalle istruzioni definite nel Token Program.

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

Deserializzare il Mint Account

Il campo data di un account Solana contiene byte grezzi. Per interpretare questi dati in modo significativo, devi deserializzarli nel tipo di dati appropriato definito dal programma che possiede l'account.

La maggior parte dei programmi Solana fornisce librerie client con funzioni helper che astraggono il processo di deserializzazione. Queste funzioni convertono i byte grezzi dell'account in tipi di dati strutturati, rendendo più facile lavorare con i dati dell'account.

Per esempio, @solana/spl-token include la funzione getMint() per aiutare a deserializzare il campo data di un Mint account nel tipo di dati Mint.

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

La funzione getMint() deserializza il campo data di un mint account nel tipo di dati Mint definito dal Token Program.

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

Puoi visualizzare i dati completamente deserializzati del Mint Account su Solana Explorer.

Il campo address contiene l'indirizzo del Mint account.

L'indirizzo del mint account viene utilizzato per identificare il token sulla rete Solana.

Il campo mintAuthority mostra l'autorità che può creare nuovi token.

Questo è l'unico account che può creare nuove unità del token.

Il campo supply mostra il numero totale di token che sono stati creati.

Questo valore è espresso nell'unità più piccola del token. Per ottenere la fornitura totale in unità standard, adatta il valore del campo supply in base al decimals.

Il campo decimals mostra il numero di posizioni decimali per il token.

Il campo isInitialized indica se il mint account è stato inizializzato. Questo campo è un controllo di sicurezza utilizzato nel Token Program.

Il campo freezeAuthority mostra l'autorità che può congelare i token account.

Un token account che è congelato non può trasferire o bruciare il token nell'account.

Il campo tlvData contiene dati aggiuntivi per Token Extensions (richiede ulteriore deserializzazione).

Questo campo è rilevante solo per gli account creati dal Token Extensions Program (Token2022).

La funzione getMint() deserializza il campo data di un mint account nel tipo di dati Mint definito dal Token Program.

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

Puoi visualizzare i dati completamente deserializzati del Mint Account su Solana Explorer.

Il campo address contiene l'indirizzo del Mint account.

L'indirizzo del mint account viene utilizzato per identificare il token sulla rete Solana.

Il campo mintAuthority mostra l'autorità che può creare nuovi token.

Questo è l'unico account che può creare nuove unità del token.

Il campo supply mostra il numero totale di token che sono stati creati.

Questo valore è espresso nell'unità più piccola del token. Per ottenere la fornitura totale in unità standard, adatta il valore del campo supply in base al decimals.

Il campo decimals mostra il numero di posizioni decimali per il token.

Il campo isInitialized indica se il mint account è stato inizializzato. Questo campo è un controllo di sicurezza utilizzato nel Token Program.

Il campo freezeAuthority mostra l'autorità che può congelare i token account.

Un token account che è congelato non può trasferire o bruciare il token nell'account.

Il campo tlvData contiene dati aggiuntivi per Token Extensions (richiede ulteriore deserializzazione).

Questo campo è rilevante solo per gli account creati dal Token Extensions 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?

Indice

Modifica Pagina