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.
#[derive(PartialEq, Eq, Clone, Default)]pub struct Account {/// lamports in the accountpub 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 rentpub rent_epoch: Epoch,}
Account
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:
- Generare un nuovo keypair (coppia di chiavi pubblica/privata).
- Richiedere un airdrop di SOL per finanziare il nuovo indirizzo.
- 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.
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));
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
.
{"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à.
{"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.
{"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.
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 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.
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.
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);
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.
{"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.
{"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.
{"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.
{"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.
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 dati
Mint
definito dal Token Program.
{"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).
Is this page helpful?