Lettura dalla rete

Leggi i dati dalla rete Solana recuperando diversi account. Questa sezione ti aiuterà a comprendere la struttura degli account di Solana. Ogni account Solana ha un indirizzo univoco che viene utilizzato per localizzare i suoi dati corrispondenti sulla blockchain. Gli account contengono dati di stato o un programma eseguibile.

Recuperare un account wallet

Un wallet è un account posseduto dal System Program. I wallet sono principalmente utilizzati per conservare SOL e firmare transazioni. Quando SOL viene inviato a un nuovo indirizzo per la prima volta, un account di sistema viene creato automaticamente.

L'esempio seguente genera un nuovo keypair, richiede SOL per finanziare il nuovo indirizzo della chiave pubblica e recupera i dati dell'account per il wallet appena finanziato.

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.

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

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

Il campo data contiene i dati dell'account memorizzati come byte. Per gli account wallet, questo campo è vuoto (0 byte).

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

Il campo executable indica se il campo data dell'account contiene codice di programma eseguibile. Per gli account wallet questo campo è false.

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

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

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

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 di rent obsoleto. (Questo campo è 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 contenuti 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
}

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

Il campo data contiene i dati dell'account memorizzati come byte. Per gli account wallet, questo campo è vuoto (0 byte).

Il campo executable indica se il campo data dell'account contiene codice di programma eseguibile. Per gli account wallet questo campo è false.

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

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 di rent obsoleto. (Questo campo è incluso per retrocompatibilità.)

Il campo space mostra il numero di byte contenuti 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
}

Recupera il Token Program

L'esempio seguente 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. I programmi hanno gli stessi campi sottostanti di tutti gli account, ma con differenze chiave.

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

Il campo executable è impostato su true, il che indica che il campo data dell'account contiene codice eseguibile.

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

Il campo data memorizza il codice eseguibile del programma.

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

Ogni program account è di proprietà del suo programma loader. In questo esempio, 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
}

Il Token Program è un program account eseguibile. I programmi hanno gli stessi campi sottostanti di tutti gli account, ma con differenze chiave.

Il campo executable è impostato su true, il che indica che il campo data dell'account contiene codice eseguibile.

Il campo data memorizza il codice eseguibile del programma.

Ogni program account è di proprietà del suo programma loader. In questo esempio, 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

Un mint account è un account di proprietà del Token Program che memorizza i metadati globali per un token specifico. Questi includono 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.

L'esempio seguente recupera il mint account di USD Coin per dimostrare come lo stato di un programma viene memorizzato in un account separato.

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.

I mint account memorizzano lo stato, non il codice eseguibile. 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 data del mint account memorizza lo stato, non codice eseguibile, quindi il campo executable è false.

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

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à di emissione, la fornitura totale, il numero di decimali.

Per leggere da un Mint account, devi deserializzare il campo data nel tipo di dati Mint, come mostrato nell'esempio successivo.

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

Il mint account è di proprietà del Token Program. Questo significa che il suo campo data può essere modificato solo dalle istruzioni del Token Program.

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

I mint account memorizzano lo stato, non il codice eseguibile. Sono di proprietà del Token Program, che include istruzioni che definiscono come creare e aggiornare i mint account.

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

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

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

Per leggere da un Mint account, devi deserializzare il campo data nel tipo di dati Mint, come mostrato nell'esempio successivo.

Il mint account è di proprietà del Token Program. Questo significa che il suo campo data può essere modificato solo dalle istruzioni del 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

Prima che i byte grezzi nel campo data di un account possano essere interpretati in modo significativo, devono essere deserializzati. Il tipo di dati appropriato è definito dal programma che possiede l'account. La maggior parte dei programmi Solana fornisce librerie client con funzioni di supporto 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.

Ad esempio, la libreria @solana/spl-token include la funzione getMint() per aiutare a deserializzare il campo data di un mint account nel tipo di dati Mint definito dal Token Program.

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

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.

Il campo mintAuthority mostra l'unico account che può creare nuove unità del token.

Il campo supply mostra il numero totale di token che sono stati coniati. Questo valore è misurato nell'unità più piccola del token. Per ottenere la fornitura totale in unità standard, regola 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'account con l'autorità di congelare i token account. Un token account congelato non può trasferire o bruciare il token che contiene.

Il campo tlvData contiene dati aggiuntivi per Token Extensions e richiede un'ulteriore deserializzazione. Questo campo è rilevante solo per gli account creati dal Token Extension Program (Token2022).

La funzione getMint() deserializza il campo data di un mint account nel tipo di account Mint.

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.

Il campo mintAuthority mostra l'unico account che può creare nuove unità del token.

Il campo supply mostra il numero totale di token che sono stati coniati. Questo valore è misurato nell'unità più piccola del token. Per ottenere la fornitura totale in unità standard, regola 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'account con l'autorità di congelare i token account. Un token account congelato non può trasferire o bruciare il token che contiene.

Il campo tlvData contiene dati aggiuntivi per Token Extensions e richiede un'ulteriore deserializzazione. Questo campo è rilevante solo per gli account creati dal 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?

Indice

Modifica Pagina

Gestito da

© 2025 Solana Foundation.
Tutti i diritti riservati.
Rimani Connesso