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.
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));
Quando recuperi un account wallet, la risposta include i campi mostrati nell'esempio di output sulla destra.
{"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).
{"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.
{"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.
{"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.
{"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à.)
{"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.
{"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.
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);
Il Token Program è un program account eseguibile. I programmi hanno gli stessi campi sottostanti di tutti gli account, ma con differenze chiave.
{"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.
{"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.
{"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.
{"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.
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);
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.
{"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.
{"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.
{"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.
{"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.
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>,}
La funzione getMint() deserializza il campo data di un mint account nel
tipo di account Mint.
{"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).
Is this page helpful?