Ανάγνωση από το Δίκτυο
Διαβάστε δεδομένα από το δίκτυο Solana ανακτώντας διαφορετικούς λογαριασμούς. Αυτή η ενότητα θα σας βοηθήσει να κατανοήσετε τη δομή των λογαριασμών της Solana. Κάθε λογαριασμός Solana έχει μια μοναδική διεύθυνση που χρησιμοποιείται για τον εντοπισμό των αντίστοιχων δεδομένων του στην αλυσίδα. Οι λογαριασμοί περιέχουν είτε δεδομένα κατάστασης είτε ένα εκτελέσιμο πρόγραμμα.
Ανάκτηση λογαριασμού πορτοφολιού
Ένα πορτοφόλι είναι ένας λογαριασμός που ανήκει στο System Program. Τα πορτοφόλια χρησιμοποιούνται κυρίως για την αποθήκευση SOL και την υπογραφή συναλλαγών. Όταν αποστέλλεται SOL σε μια νέα διεύθυνση για πρώτη φορά, δημιουργείται αυτόματα ένας λογαριασμός συστήματος.
Το παρακάτω παράδειγμα δημιουργεί ένα νέο keypair, ζητά SOL για τη χρηματοδότηση της νέας διεύθυνσης δημόσιου κλειδιού και ανακτά τα δεδομένα λογαριασμού για το νεοχρηματοδοτούμενο πορτοφόλι.
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));
Όταν ανακτάτε έναν λογαριασμό πορτοφολιού, η απάντηση περιλαμβάνει τα πεδία που φαίνονται στο παράδειγμα εξόδου στα δεξιά.
Το πεδίο 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 δεδομένων.
Ανάκτηση του Token Program
Το παρακάτω παράδειγμα ανακτά το Token Program για να δείξει τη διαφορά μεταξύ λογαριασμών πορτοφολιού και λογαριασμών προγράμματος. Ο λογαριασμός προγράμματος αποθηκεύει τον μεταγλωττισμένο δυαδικό κώδικα για τον πηγαίο κώδικα του Token Program. Μπορείτε να δείτε αυτόν τον λογαριασμό προγράμματος στον 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);
Το Token Program είναι ένας εκτελέσιμος λογαριασμός προγράμματος. Τα προγράμματα έχουν τα ίδια υποκείμενα πεδία όπως όλοι οι λογαριασμοί, αλλά με βασικές διαφορές.
{"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.
Ανάκτηση ενός λογαριασμού mint
Ένας λογαριασμός mint είναι ένας λογαριασμός που ανήκει στο Token Program και αποθηκεύει καθολικά μεταδεδομένα για ένα συγκεκριμένο token. Αυτό περιλαμβάνει τη συνολική προσφορά, τον αριθμό των δεκαδικών ψηφίων και τους λογαριασμούς που είναι εξουσιοδοτημένοι να δημιουργούν ή να παγώνουν tokens. Η διεύθυνση του λογαριασμού mint προσδιορίζει μοναδικά ένα token στο δίκτυο Solana.
Το παρακάτω παράδειγμα ανακτά τον λογαριασμό Mint του USD Coin για να δείξει πώς η κατάσταση ενός προγράμματος αποθηκεύεται σε ξεχωριστό λογαριασμό.
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);
Οι λογαριασμοί mint αποθηκεύουν κατάσταση, όχι εκτελέσιμο κώδικα. Ανήκουν στο Token Program, το οποίο περιλαμβάνει οδηγίες που καθορίζουν πώς να δημιουργούνται και να ενημερώνονται οι λογαριασμοί mint.
Το πεδίο data του λογαριασμού mint αποθηκεύει κατάσταση, όχι εκτελέσιμο
κώδικα, οπότε το πεδίο executable είναι false.
Το Token Program ορίζει τον τύπο δεδομένων Mint, ο οποίος αποθηκεύεται στο
πεδίο data.
{"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, όπως φαίνεται στο
επόμενο παράδειγμα.
{"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.
{"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.
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>,}
Η συνάρτηση getMint() αποσειριοποιεί το πεδίο data ενός λογαριασμού mint
στον τύπο λογαριασμού Mint.
{"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).
Is this page helpful?