Διαβάστε δεδομένα από το δίκτυο 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.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 αποθηκεύει τον εκτελέσιμο κώδικα του προγράμματος.
Κάθε program account ανήκει στο
loader program του. Σε αυτό το
παράδειγμα, το 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.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, η συνολική προσφορά, ο αριθμός των δεκαδικών ψηφίων.
Για να διαβάσετε από έναν λογαριασμό 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 παρέχουν βιβλιοθήκες client με βοηθητικές συναρτήσεις που αφαιρούν τη
διαδικασία αποσειριοποίησης. Αυτές οι συναρτήσεις μετατρέπουν τα ακατέργαστα
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.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?