Ανάγνωση από το Δίκτυο

Διαβάστε δεδομένα από το δίκτυο Solana ανακτώντας διαφορετικούς λογαριασμούς. Αυτή η ενότητα θα σας βοηθήσει να κατανοήσετε τη δομή των λογαριασμών της Solana. Κάθε λογαριασμός Solana έχει μια μοναδική διεύθυνση που χρησιμοποιείται για τον εντοπισμό των αντίστοιχων δεδομένων του στην αλυσίδα. Οι λογαριασμοί περιέχουν είτε δεδομένα κατάστασης είτε ένα εκτελέσιμο πρόγραμμα.

Ανάκτηση λογαριασμού πορτοφολιού

Ένα πορτοφόλι είναι ένας λογαριασμός που ανήκει στο System Program. Τα πορτοφόλια χρησιμοποιούνται κυρίως για την αποθήκευση SOL και την υπογραφή συναλλαγών. Όταν αποστέλλεται SOL σε μια νέα διεύθυνση για πρώτη φορά, δημιουργείται αυτόματα ένας λογαριασμός συστήματος.

Το παρακάτω παράδειγμα δημιουργεί ένα νέο keypair, ζητά SOL για τη χρηματοδότηση της νέας διεύθυνσης δημόσιου κλειδιού και ανακτά τα δεδομένα λογαριασμού για το νεοχρηματοδοτούμενο πορτοφόλι.

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.

Όταν ανακτάτε έναν λογαριασμό πορτοφολιού, η απάντηση περιλαμβάνει τα πεδία που φαίνονται στο παράδειγμα εξόδου στα δεξιά.

Το πεδίο data περιέχει τα δεδομένα του λογαριασμού αποθηκευμένα ως bytes. Για λογαριασμούς πορτοφολιού, αυτό το πεδίο είναι κενό (0 bytes).

Το πεδίο executable υποδεικνύει εάν το πεδίο data του λογαριασμού περιέχει εκτελέσιμο κώδικα προγράμματος. Για λογαριασμούς πορτοφολιού αυτό το πεδίο είναι false.

Το πεδίο lamports περιέχει το υπόλοιπο SOL του λογαριασμού, σε lamports.

Το πεδίο owner δείχνει το πρόγραμμα που κατέχει τον λογαριασμό. Για πορτοφόλια, ο ιδιοκτήτης είναι πάντα το System Program, με τη διεύθυνση 11111111111111111111111111111111.

Το πεδίο rentEpoch είναι ένα παλαιό πεδίο από έναν μηχανισμό rent που έχει καταργηθεί. (Αυτό το πεδίο συμπεριλαμβάνεται για λόγους συμβατότητας με προηγούμενες εκδόσεις.)

Το πεδίο space δείχνει τον αριθμό των bytes που περιέχονται στο πεδίο data. Αυτό δεν είναι ένα πεδίο στον ίδιο τον τύπο Account, αλλά συμπεριλαμβάνεται στην απάντηση.

Σε αυτό το παράδειγμα, το πεδίο space είναι 0 επειδή το πεδίο data περιέχει 0 bytes δεδομένων.

Όταν ανακτάτε έναν λογαριασμό πορτοφολιού, η απάντηση περιλαμβάνει τα πεδία που φαίνονται στο παράδειγμα εξόδου στα δεξιά.

Το πεδίο data περιέχει τα δεδομένα του λογαριασμού αποθηκευμένα ως bytes. Για λογαριασμούς πορτοφολιού, αυτό το πεδίο είναι κενό (0 bytes).

Το πεδίο executable υποδεικνύει εάν το πεδίο data του λογαριασμού περιέχει εκτελέσιμο κώδικα προγράμματος. Για λογαριασμούς πορτοφολιού αυτό το πεδίο είναι false.

Το πεδίο lamports περιέχει το υπόλοιπο SOL του λογαριασμού, σε lamports.

Το πεδίο owner δείχνει το πρόγραμμα που κατέχει τον λογαριασμό. Για πορτοφόλια, ο ιδιοκτήτης είναι πάντα το System Program, με τη διεύθυνση 11111111111111111111111111111111.

Το πεδίο rentEpoch είναι ένα παλαιό πεδίο από έναν μηχανισμό rent που έχει καταργηθεί. (Αυτό το πεδίο συμπεριλαμβάνεται για λόγους συμβατότητας με προηγούμενες εκδόσεις.)

Το πεδίο space δείχνει τον αριθμό των bytes που περιέχονται στο πεδίο data. Αυτό δεν είναι ένα πεδίο στον ίδιο τον τύπο Account, αλλά συμπεριλαμβάνεται στην απάντηση.

Σε αυτό το παράδειγμα, το πεδίο space είναι 0 επειδή το πεδίο data περιέχει 0 bytes δεδομένων.

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

Ανάκτηση του Token Program

Το παρακάτω παράδειγμα ανακτά το Token Program για να δείξει τη διαφορά μεταξύ λογαριασμών πορτοφολιού και λογαριασμών προγράμματος. Ο λογαριασμός προγράμματος αποθηκεύει τον μεταγλωττισμένο δυαδικό κώδικα για τον πηγαίο κώδικα του Token Program. Μπορείτε να δείτε αυτόν τον λογαριασμό προγράμματος στον 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.

Το Token Program είναι ένας εκτελέσιμος λογαριασμός προγράμματος. Τα προγράμματα έχουν τα ίδια υποκείμενα πεδία όπως όλοι οι λογαριασμοί, αλλά με βασικές διαφορές.

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

Το πεδίο executable έχει οριστεί σε true, που υποδεικνύει ότι το πεδίο data του λογαριασμού περιέχει εκτελέσιμο κώδικα.

Το πεδίο data αποθηκεύει τον εκτελέσιμο κώδικα του προγράμματος.

Κάθε λογαριασμός προγράμματος ανήκει στο δικό του πρόγραμμα φόρτωσης. Σε αυτό το παράδειγμα, το owner είναι το πρόγραμμα BPFLoader2.

Το Token Program είναι ένας εκτελέσιμος λογαριασμός προγράμματος. Τα προγράμματα έχουν τα ίδια υποκείμενα πεδία όπως όλοι οι λογαριασμοί, αλλά με βασικές διαφορές.

Το πεδίο executable έχει οριστεί σε true, που υποδεικνύει ότι το πεδίο data του λογαριασμού περιέχει εκτελέσιμο κώδικα.

Το πεδίο data αποθηκεύει τον εκτελέσιμο κώδικα του προγράμματος.

Κάθε λογαριασμός προγράμματος ανήκει στο δικό του πρόγραμμα φόρτωσης. Σε αυτό το παράδειγμα, το owner είναι το πρόγραμμα BPFLoader2.

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

Ανάκτηση ενός λογαριασμού mint

Ένας λογαριασμός mint είναι ένας λογαριασμός που ανήκει στο Token Program και αποθηκεύει καθολικά μεταδεδομένα για ένα συγκεκριμένο token. Αυτό περιλαμβάνει τη συνολική προσφορά, τον αριθμό των δεκαδικών ψηφίων και τους λογαριασμούς που είναι εξουσιοδοτημένοι να δημιουργούν ή να παγώνουν tokens. Η διεύθυνση του λογαριασμού mint προσδιορίζει μοναδικά ένα token στο δίκτυο Solana.

Το παρακάτω παράδειγμα ανακτά τον λογαριασμό Mint του USD Coin για να δείξει πώς η κατάσταση ενός προγράμματος αποθηκεύεται σε ξεχωριστό λογαριασμό.

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.

Οι λογαριασμοί mint αποθηκεύουν κατάσταση, όχι εκτελέσιμο κώδικα. Ανήκουν στο Token Program, το οποίο περιλαμβάνει οδηγίες που καθορίζουν πώς να δημιουργούνται και να ενημερώνονται οι λογαριασμοί mint.

Το πεδίο data του λογαριασμού mint αποθηκεύει κατάσταση, όχι εκτελέσιμο κώδικα, οπότε το πεδίο executable είναι false.

Το Token Program ορίζει τον τύπο δεδομένων Mint, ο οποίος αποθηκεύεται στο πεδίο data.

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

Το πεδίο data περιέχει την σειριοποιημένη κατάσταση λογαριασμού Mint, όπως την αρχή έκδοσης (mint authority), τη συνολική προσφορά, τον αριθμό των δεκαδικών.

Για να διαβάσετε από έναν λογαριασμό Mint, πρέπει να αποσειριοποιήσετε το πεδίο data στον τύπο δεδομένων Mint, όπως φαίνεται στο επόμενο παράδειγμα.

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

Ο λογαριασμός mint ανήκει στο Token Program. Αυτό σημαίνει ότι το πεδίο data μπορεί να τροποποιηθεί μόνο από τις εντολές του Token Program.

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

Οι λογαριασμοί mint αποθηκεύουν κατάσταση, όχι εκτελέσιμο κώδικα. Ανήκουν στο Token Program, το οποίο περιλαμβάνει οδηγίες που καθορίζουν πώς να δημιουργούνται και να ενημερώνονται οι λογαριασμοί mint.

Το πεδίο data του λογαριασμού mint αποθηκεύει κατάσταση, όχι εκτελέσιμο κώδικα, οπότε το πεδίο executable είναι false.

Το Token Program ορίζει τον τύπο δεδομένων Mint, ο οποίος αποθηκεύεται στο πεδίο data.

Το πεδίο data περιέχει την σειριοποιημένη κατάσταση λογαριασμού Mint, όπως την αρχή έκδοσης (mint authority), τη συνολική προσφορά, τον αριθμό των δεκαδικών.

Για να διαβάσετε από έναν λογαριασμό Mint, πρέπει να αποσειριοποιήσετε το πεδίο data στον τύπο δεδομένων Mint, όπως φαίνεται στο επόμενο παράδειγμα.

Ο λογαριασμός mint ανήκει στο Token Program. Αυτό σημαίνει ότι το πεδίο data μπορεί να τροποποιηθεί μόνο από τις εντολές του Token Program.

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

Αποσειριοποίηση λογαριασμού mint

Πριν τα ακατέργαστα bytes στο πεδίο data ενός λογαριασμού μπορέσουν να ερμηνευθούν ουσιαστικά, πρέπει να αποσειριοποιηθούν. Ο κατάλληλος τύπος δεδομένων ορίζεται από το πρόγραμμα που κατέχει τον λογαριασμό. Τα περισσότερα προγράμματα Solana παρέχουν βιβλιοθήκες πελάτη με βοηθητικές συναρτήσεις που αφαιρούν τη διαδικασία αποσειριοποίησης. Αυτές οι συναρτήσεις μετατρέπουν τα ακατέργαστα bytes του λογαριασμού σε δομημένους τύπους δεδομένων, διευκολύνοντας την εργασία με τα δεδομένα του λογαριασμού.

Για παράδειγμα, η βιβλιοθήκη @solana/spl-token περιλαμβάνει τη συνάρτηση getMint() για να βοηθήσει στην αποσειριοποίηση του πεδίου data ενός λογαριασμού mint στον τύπο δεδομένων Mint που ορίζεται από το 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>,
}

Η συνάρτηση getMint() αποσειριοποιεί το πεδίο data ενός λογαριασμού mint στον τύπο λογαριασμού Mint.

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

Μπορείτε να δείτε τα πλήρως αποσειριοποιημένα δεδομένα του λογαριασμού mint στον Solana Explorer.

Το πεδίο address περιέχει τη διεύθυνση του λογαριασμού mint.

Το πεδίο mintAuthority δείχνει τον μοναδικό λογαριασμό που μπορεί να δημιουργήσει νέες μονάδες του token.

Το πεδίο supply δείχνει τον συνολικό αριθμό των tokens που έχουν δημιουργηθεί. Αυτή η τιμή μετριέται στη μικρότερη μονάδα του token. Για να πάρετε τη συνολική προσφορά σε τυπικές μονάδες, προσαρμόστε την τιμή του πεδίου supply με βάση το decimals.

Το πεδίο decimals δείχνει τον αριθμό των δεκαδικών ψηφίων για το token.

Το πεδίο isInitialized υποδεικνύει εάν ο λογαριασμός mint έχει αρχικοποιηθεί. Αυτό το πεδίο είναι ένας έλεγχος ασφαλείας που χρησιμοποιείται στο Token Program.

Το πεδίο freezeAuthority δείχνει τον λογαριασμό με την εξουσιοδότηση να παγώνει token accounts. Ένα παγωμένο token account δεν μπορεί να μεταφέρει ή να κάψει το token που περιέχει.

Το πεδίο tlvData περιέχει επιπλέον δεδομένα για Token Extensions και απαιτεί περαιτέρω αποσειριοποίηση. Αυτό το πεδίο είναι σχετικό μόνο με λογαριασμούς που δημιουργήθηκαν από το Token Extension Program (Token2022).

Η συνάρτηση getMint() αποσειριοποιεί το πεδίο data ενός λογαριασμού mint στον τύπο λογαριασμού Mint.

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

Μπορείτε να δείτε τα πλήρως αποσειριοποιημένα δεδομένα του λογαριασμού mint στον Solana Explorer.

Το πεδίο address περιέχει τη διεύθυνση του λογαριασμού mint.

Το πεδίο mintAuthority δείχνει τον μοναδικό λογαριασμό που μπορεί να δημιουργήσει νέες μονάδες του token.

Το πεδίο supply δείχνει τον συνολικό αριθμό των tokens που έχουν δημιουργηθεί. Αυτή η τιμή μετριέται στη μικρότερη μονάδα του token. Για να πάρετε τη συνολική προσφορά σε τυπικές μονάδες, προσαρμόστε την τιμή του πεδίου supply με βάση το decimals.

Το πεδίο decimals δείχνει τον αριθμό των δεκαδικών ψηφίων για το token.

Το πεδίο isInitialized υποδεικνύει εάν ο λογαριασμός mint έχει αρχικοποιηθεί. Αυτό το πεδίο είναι ένας έλεγχος ασφαλείας που χρησιμοποιείται στο Token Program.

Το πεδίο freezeAuthority δείχνει τον λογαριασμό με την εξουσιοδότηση να παγώνει token accounts. Ένα παγωμένο token account δεν μπορεί να μεταφέρει ή να κάψει το token που περιέχει.

Το πεδίο tlvData περιέχει επιπλέον δεδομένα για Token Extensions και απαιτεί περαιτέρω αποσειριοποίηση. Αυτό το πεδίο είναι σχετικό μόνο με λογαριασμούς που δημιουργήθηκαν από το 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?

Πίνακας Περιεχομένων

Επεξεργασία Σελίδας

Διαχειρίζεται από

© 2025 Ίδρυμα Solana.
Με επιφύλαξη παντός δικαιώματος.