Lettura dalla rete

Leggi i dati dalla rete Solana recuperando diversi account. Questa guida spiega la struttura degli account di Solana. Ogni account Solana ha un indirizzo univoco utilizzato per localizzare i dati onchain dell'account. Gli account Solana contengono dati di stato o un programma eseguibile.

Recuperare un account wallet

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

L'esempio seguente crea un client Kit, genera un nuovo signer, richiede SOL per finanziare il nuovo indirizzo e recupera i dati dell'account dall'API RPC del client.

Fetch account
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";
import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop());
const signer = await generateKeyPairSigner();
console.log(`Address: ${signer.address}`);
// Funding an address with SOL automatically creates an account
await client.airdrop(signer.address, lamports(1_000_000_000n));
const accountInfo = await client.rpc.getAccountInfo(signer.address).send();
console.log(accountInfo);
Console
Click to execute the code.

Quando si recupera un wallet account con getAccountInfo(), Kit restituisce la risposta RPC mostrata nell'output di esempio a destra.

La risposta ha due campi di primo livello: context descrive il momento in cui è avvenuta la lettura, e value contiene i campi dell'account restituiti dal metodo RPC.

Il campo context mostra il slot utilizzato per leggere l'account e la versione dell'API RPC che ha servito la risposta. Una lettura successiva può restituire un slot o una versione API diversi.

Il campo value contiene lo stato dell'account restituito dal metodo RPC. I passaggi seguenti illustrano i campi all'interno di value nell'ordine in cui appaiono.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Il campo lamports contiene il saldo SOL dell'account, misurato in lamports, la più piccola unità di SOL.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Il campo data contiene i dati dell'account memorizzati come byte. L'RPC restituisce i dati dell'account come una tupla: la stringa di dati codificata, seguita dalla codifica. Per gli account wallet, la stringa di dati codificata è vuota perché l'account memorizza 0 byte di dati.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Il campo owner mostra il programma proprietario dell'account. Per i wallet, il proprietario è sempre il System Program, con l'indirizzo 11111111111111111111111111111111.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Il campo executable indica se l'indirizzo dell'account è richiamabile. true significa che l'indirizzo rappresenta un programma in grado di elaborare istruzioni. false significa che l'account memorizza uno stato, come il saldo di un wallet o i dati dell'account, e non viene richiamato come programma. Gli account wallet utilizzano false.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Il campo rentEpoch è un campo legacy proveniente da un meccanismo di rent deprecato. Il campo viene ancora restituito per compatibilità con le versioni precedenti.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Il campo space mostra il numero di byte contenuti nel campo data. Il campo space viene restituito con la risposta di recupero dell'account, ma non fa parte del tipo di dato dell'account.

Per l'esempio di account wallet, il campo space è 0 perché il campo data contiene 0 byte di dati.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Quando si recupera un wallet account con getAccountInfo(), Kit restituisce la risposta RPC mostrata nell'output di esempio a destra.

La risposta ha due campi di primo livello: context descrive il momento in cui è avvenuta la lettura, e value contiene i campi dell'account restituiti dal metodo RPC.

Il campo context mostra il slot utilizzato per leggere l'account e la versione dell'API RPC che ha servito la risposta. Una lettura successiva può restituire un slot o una versione API diversi.

Il campo value contiene lo stato dell'account restituito dal metodo RPC. I passaggi seguenti illustrano i campi all'interno di value nell'ordine in cui appaiono.

Il campo lamports contiene il saldo SOL dell'account, misurato in lamports, la più piccola unità di SOL.

Il campo data contiene i dati dell'account memorizzati come byte. L'RPC restituisce i dati dell'account come una tupla: la stringa di dati codificata, seguita dalla codifica. Per gli account wallet, la stringa di dati codificata è vuota perché l'account memorizza 0 byte di dati.

Il campo owner mostra il programma proprietario dell'account. Per i wallet, il proprietario è sempre il System Program, con l'indirizzo 11111111111111111111111111111111.

Il campo executable indica se l'indirizzo dell'account è richiamabile. true significa che l'indirizzo rappresenta un programma in grado di elaborare istruzioni. false significa che l'account memorizza uno stato, come il saldo di un wallet o i dati dell'account, e non viene richiamato come programma. Gli account wallet utilizzano false.

Il campo rentEpoch è un campo legacy proveniente da un meccanismo di rent deprecato. Il campo viene ancora restituito per compatibilità con le versioni precedenti.

Il campo space mostra il numero di byte contenuti nel campo data. Il campo space viene restituito con la risposta di recupero dell'account, ma non fa parte del tipo di dato dell'account.

Per l'esempio di account wallet, il campo space è 0 perché il campo data contiene 0 byte di dati.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Recupera il Token Program

L'esempio seguente recupera il Token Program per illustrare la differenza tra account wallet e account di programma. Il Token Program definisce le istruzioni per lavorare con i token, come la creazione e il trasferimento di token. I programmi vengono invocati per elaborare le istruzioni. Lo stato del programma, come i dati dei token e i saldi, viene memorizzato in account separati di proprietà del programma.

L'indirizzo del Token Program è il program account onchain. Per semplicità, puoi considerare l'indirizzo del programma come il programma stesso, poiché è l'indirizzo utilizzato per invocarlo. Per i programmi aggiornabili, il program account memorizza i metadati e punta a un programdata account separato che contiene il codice eseguibile distribuito. Puoi visualizzare il codice sorgente del Token Program qui e il program account su Solana Explorer.

Fetch program account
import { address, createClient, fetchJsonParsedAccount } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const tokenProgramAddress = address(
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
);
const accountInfo = await client.rpc
.getAccountInfo(tokenProgramAddress, {
encoding: "base64"
})
.send();
console.log(accountInfo);
const parsedAccount = await fetchJsonParsedAccount(
client.rpc,
tokenProgramAddress
);
console.log(parsedAccount);
Console
Click to execute the code.

Il Token Program è un program account eseguibile. I programmi condividono gli stessi campi di base di tutti gli account, ma presentano differenze fondamentali.

L'esempio del Token Program utilizza la codifica base64 per restituire i dati grezzi del program account.

I passaggi seguenti illustrano i campi presenti in value nell'ordine in cui compaiono.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Il campo data memorizza lo stato del program account del BPF Upgradeable Loader. Il primo elemento della tupla contiene i dati completi dell'account codificati in base64. Il secondo elemento della tupla identifica la codifica. In questo caso, i 36 byte includono i metadati e l'indirizzo del programdata account.

Per i programmi aggiornabili, lo stato del program account punta al programdata account separato che contiene il codice eseguibile del programma.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Il campo executable è impostato su true, il che indica che l'indirizzo dell'account può essere richiamato come programma.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Il campo lamports contiene il saldo in SOL detenuto dal program account. I program account necessitano di un numero sufficiente di lamport per rimanere esenti da rent.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Ogni program account è di proprietà di un programma loader. Per il Token Program account, owner è il BPF Upgradeable Loader.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Il campo rentEpoch è un campo legacy derivato da un meccanismo di rent deprecato. Il campo viene ancora restituito per compatibilità con le versioni precedenti.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Il campo space mostra la dimensione totale dei dati del program account in byte. Il valore di space è solo 36 byte perché il program account memorizza i metadati del loader e l'indirizzo del programdata account, non il programma compilato completo.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

La risposta precedente ha restituito il campo data del program account come una tupla base64. La risposta analizzata deserializza quei byte in campi nominati sull' oggetto data. Il campo programData contiene l'indirizzo del programdata account che memorizza il codice del programma eseguibile.

Parsed Token program account
{
executable: true,
lamports: 43712780n,
programAddress: "BPFLoaderUpgradeab1e11111111111111111111111",
space: 36n,
address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
data: {
programData: "3gvYRKWyXRR9xKWe1ZjPhLY5ZJRN7KDB4rFZFGoJfFk2",
parsedAccountMeta: { program: "bpf-upgradeable-loader", type: "program" }
},
exists: true
}

Il Token Program è un program account eseguibile. I programmi condividono gli stessi campi di base di tutti gli account, ma presentano differenze fondamentali.

L'esempio del Token Program utilizza la codifica base64 per restituire i dati grezzi del program account.

I passaggi seguenti illustrano i campi presenti in value nell'ordine in cui compaiono.

Il campo data memorizza lo stato del program account del BPF Upgradeable Loader. Il primo elemento della tupla contiene i dati completi dell'account codificati in base64. Il secondo elemento della tupla identifica la codifica. In questo caso, i 36 byte includono i metadati e l'indirizzo del programdata account.

Per i programmi aggiornabili, lo stato del program account punta al programdata account separato che contiene il codice eseguibile del programma.

Il campo executable è impostato su true, il che indica che l'indirizzo dell'account può essere richiamato come programma.

Il campo lamports contiene il saldo in SOL detenuto dal program account. I program account necessitano di un numero sufficiente di lamport per rimanere esenti da rent.

Ogni program account è di proprietà di un programma loader. Per il Token Program account, owner è il BPF Upgradeable Loader.

Il campo rentEpoch è un campo legacy derivato da un meccanismo di rent deprecato. Il campo viene ancora restituito per compatibilità con le versioni precedenti.

Il campo space mostra la dimensione totale dei dati del program account in byte. Il valore di space è solo 36 byte perché il program account memorizza i metadati del loader e l'indirizzo del programdata account, non il programma compilato completo.

La risposta precedente ha restituito il campo data del program account come una tupla base64. La risposta analizzata deserializza quei byte in campi nominati sull' oggetto data. Il campo programData contiene l'indirizzo del programdata account che memorizza il codice del programma eseguibile.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Recupera un mint account

Un mint account è un account di proprietà del Token Program che memorizza i metadati globali per un token specifico. Il mint account contiene la fornitura totale del token, il numero di decimali, l'autorità di coniazione e l'autorità di blocco. L'indirizzo del mint account identifica univocamente 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. I saldi esatti e i valori di fornitura possono variare a seconda dello slot da cui legge il tuo nodo RPC.

Fetch mint account
import { address, createClient } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await client.rpc
.getAccountInfo(mintAddress, {
encoding: "base64"
})
.send();
console.log(accountInfo);
Console
Click to execute the code.

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

I passaggi seguenti illustrano i campi all'interno di value nell'ordine in cui i campi compaiono.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Il campo data contiene lo stato serializzato dell'account Mint. Il primo elemento della tupla contiene i dati completi dell'account di 82 byte codificati in base64. Il secondo elemento della tupla identifica la codifica.

Per leggere da un mint account, devi deserializzare il campo data nel tipo di dato Mint, come mostrato nel prossimo esempio.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Il campo executable indica se l'account può essere invocato come programma. I mint account memorizzano lo stato, quindi il campo executable è false.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Il campo lamports contiene il saldo in SOL detenuto dal mint account. Il valore in lamport è il saldo esente da affitto del mint account, non la fornitura di token.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

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

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Il campo rentEpoch è un campo legacy di un meccanismo rent deprecato. Il campo viene ancora restituito per compatibilità con le versioni precedenti.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Il campo space indica che il mint account contiene 82 byte di dati.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

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

I passaggi seguenti illustrano i campi all'interno di value nell'ordine in cui i campi compaiono.

Il campo data contiene lo stato serializzato dell'account Mint. Il primo elemento della tupla contiene i dati completi dell'account di 82 byte codificati in base64. Il secondo elemento della tupla identifica la codifica.

Per leggere da un mint account, devi deserializzare il campo data nel tipo di dato Mint, come mostrato nel prossimo esempio.

Il campo executable indica se l'account può essere invocato come programma. I mint account memorizzano lo stato, quindi il campo executable è false.

Il campo lamports contiene il saldo in SOL detenuto dal mint account. Il valore in lamport è il saldo esente da affitto del mint account, non la fornitura di token.

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

Il campo rentEpoch è un campo legacy di un meccanismo rent deprecato. Il campo viene ancora restituito per compatibilità con le versioni precedenti.

Il campo space indica che il mint account contiene 82 byte di dati.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Deserializzare il mint account

I dati dell'account sono memorizzati nel campo data in formato serializzato. Per leggere quei dati come campi quali supply o decimals, è necessario deserializzare il campo data nel tipo di account definito dal programma proprietario. La maggior parte dei programmi Solana fornisce librerie client con funzioni helper per questo passaggio. Questi helper restituiscono dati dell'account strutturati, rendendo il risultato più semplice da gestire.

Ad esempio, la libreria @solana-program/token include la funzione fetchMint() per recuperare un mint account e deserializzare il campo data del mint account nel tipo di dati Mint definito dal Token Program.

Deserialize mint account data
import { address, createClient } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
import { fetchMint } from "@solana-program/token";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mint = await fetchMint(client.rpc, mintAddress);
console.log(mint);
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 fetchMint() recupera un mint account e deserializza il campo data del mint account nel tipo di account Mint.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Puoi visualizzare i dati completamente deserializzati del mint account sull'Explorer di Solana.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Il campo address contiene l'indirizzo del mint account.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Il campo data contiene lo stato deserializzato dell'account Mint. I campi annidati in data provengono dal tipo di account Mint del Token Program.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Il campo data.mintAuthority mostra l'unico account autorizzato a creare nuove unità del token.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Il campo supply mostra il numero totale di token che sono stati coniati. Il valore della supply è espresso nella più piccola unità del token. Per ottenere la supply totale in unità standard, adatta il valore del campo supply in base al decimals.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Il campo decimals indica il numero di decimali del token.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

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

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Il campo data.freezeAuthority mostra l'account con l'autorità di congelare i token account. Un token account è un account separato che memorizza unità di un token per un proprietario. Quando congelato, un token account non può trasferire né bruciare il proprio saldo di token.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Il campo executable è false. Il mint account USDC memorizza lo stato del token, quindi il mint account USDC non può essere invocato come programma.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Il campo lamports contiene il saldo in SOL detenuto dal mint account. Il valore in lamport è il saldo rent-exempt del mint account, non la supply del token.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Il campo programAddress mostra il programma che possiede il mint account. Per USDC, il programma proprietario è il Token Program. Solo il programma che possiede un account può modificare il suo campo data tramite le istruzioni distribuite del programma.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Il campo space mostra la dimensione in byte dei dati originali del mint account. Il tipo base Mint del Token Program è di 82 byte.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

La funzione fetchMint() recupera un mint account e deserializza il campo data del mint account nel tipo di account Mint.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Puoi visualizzare i dati completamente deserializzati del mint account sull'Explorer di Solana.

Il campo address contiene l'indirizzo del mint account.

Il campo data contiene lo stato deserializzato dell'account Mint. I campi annidati in data provengono dal tipo di account Mint del Token Program.

Il campo data.mintAuthority mostra l'unico account autorizzato a creare nuove unità del token.

Il campo supply mostra il numero totale di token che sono stati coniati. Il valore della supply è espresso nella più piccola unità del token. Per ottenere la supply totale in unità standard, adatta il valore del campo supply in base al decimals.

Il campo decimals indica il numero di decimali del token.

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

Il campo data.freezeAuthority mostra l'account con l'autorità di congelare i token account. Un token account è un account separato che memorizza unità di un token per un proprietario. Quando congelato, un token account non può trasferire né bruciare il proprio saldo di token.

Il campo executable è false. Il mint account USDC memorizza lo stato del token, quindi il mint account USDC non può essere invocato come programma.

Il campo lamports contiene il saldo in SOL detenuto dal mint account. Il valore in lamport è il saldo rent-exempt del mint account, non la supply del token.

Il campo programAddress mostra il programma che possiede il mint account. Per USDC, il programma proprietario è il Token Program. Solo il programma che possiede un account può modificare il suo campo data tramite le istruzioni distribuite del programma.

Il campo space mostra la dimensione in byte dei dati originali del mint account. Il tipo base Mint del Token Program è di 82 byte.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Output serializzato vs deserializzato

Entrambi gli esempi leggono lo stesso mint account USDC. La prima risposta lascia il campo data serializzato. Per leggere il contenuto del mint account, decodifica quei dati come il tipo di account definito dal programma proprietario. Per un mint account, il Token Program definisce il tipo Mint mostrato a destra.

Prima della decodifica, il campo data contiene i dati dell'account serializzati.

Serialized mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Dopo aver decodificato i dati come Mint, il campo data contiene i campi denominati dell'account.

Deserialized mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Is this page helpful?

Indice dei contenuti

Modifica pagina
© 2026 Solana Foundation. Tutti i diritti riservati.