Ανάγνωση από το Δίκτυο
Αυτή η ενότητα εξερευνά πώς να διαβάζετε δεδομένα από το δίκτυο Solana ανακτώντας διαφορετικούς λογαριασμούς για να κατανοήσετε τη δομή ενός λογαριασμού Solana.
Στο Solana, όλα τα δεδομένα υπάρχουν σε "λογαριασμούς". Μπορείτε να σκεφτείτε τα δεδομένα στο Solana ως μια δημόσια βάση δεδομένων με έναν μοναδικό πίνακα "Λογαριασμοί", όπου κάθε καταχώρηση είναι ένας λογαριασμός με τον ίδιο βασικό τύπο Λογαριασμού.
#[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,}
Λογαριασμοί
Οι λογαριασμοί στο Solana μπορούν να αποθηκεύσουν "κατάσταση" ή "εκτελέσιμα" προγράμματα. Κάθε λογαριασμός έχει μια "διεύθυνση" (δημόσιο κλειδί) που χρησιμεύει ως το μοναδικό του αναγνωριστικό για τον εντοπισμό των αντίστοιχων δεδομένων του στην αλυσίδα.
Οι λογαριασμοί Solana περιέχουν είτε:
- Κατάσταση: Δεδομένα που προορίζονται για ανάγνωση και διατήρηση. Για παράδειγμα, πληροφορίες σχετικά με tokens, δεδομένα χρηστών ή άλλα δεδομένα που ορίζονται μέσα σε ένα πρόγραμμα.
- Εκτελέσιμα Προγράμματα: Λογαριασμοί που περιέχουν τον πραγματικό κώδικα των προγραμμάτων Solana. Αυτοί οι λογαριασμοί αποθηκεύουν οδηγίες που μπορούν να επικαλεστούν οι χρήστες.
Αυτός ο διαχωρισμός του κώδικα προγράμματος και της κατάστασης προγράμματος είναι ένα βασικό χαρακτηριστικό του Μοντέλου Λογαριασμών του Solana. Για περισσότερες λεπτομέρειες, ανατρέξτε στη σελίδα Μοντέλο Λογαριασμών Solana.
Ανάκτηση Λογαριασμού Πορτοφολιού
Αυτό το παράδειγμα δείχνει πώς να:
- Δημιουργήσετε ένα νέο keypair (ζεύγος δημόσιου/ιδιωτικού κλειδιού).
- Ζητήσετε ένα airdrop SOL για να χρηματοδοτήσετε τη νέα διεύθυνση.
- Ανακτήσετε τα δεδομένα λογαριασμού για τη χρηματοδοτημένη διεύθυνση.
Στο Solana, η χρηματοδότηση μιας νέας διεύθυνσης με SOL δημιουργεί αυτόματα έναν λογαριασμό που ανήκει στο System Program. Όλοι οι λογαριασμοί "πορτοφολιού" είναι απλώς λογαριασμοί που ανήκουν στο System Program που περιέχουν 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));
Ένα "πορτοφόλι" στο Solana είναι ένας λογαριασμός που ανήκει στο
System Program,
που είναι ένα από τα ενσωματωμένα προγράμματα του Solana. Οι λογαριασμοί
πορτοφολιού χρησιμοποιούνται κυρίως για να διατηρούν SOL (που παρακολουθείται
στο πεδίο lamports
) και για να υπογράφουν συναλλαγές.
Όταν ανακτάτε έναν λογαριασμό πορτοφολιού, η απάντηση περιλαμβάνει τα πεδία που φαίνονται στο παράδειγμα εξόδου.
Το πεδίο data
περιέχει τα δεδομένα του λογαριασμού αποθηκευμένα ως bytes.
Για λογαριασμούς πορτοφολιού, αυτό το πεδίο είναι κενό (0 bytes). Άλλοι λογαριασμοί χρησιμοποιούν αυτό το πεδίο για να αποθηκεύσουν είτε την κατάσταση του προγράμματος είτε εκτελέσιμο κώδικα προγράμματος.
Το πεδίο executable
υποδεικνύει αν το πεδίο data
του λογαριασμού περιέχει
εκτελέσιμο κώδικα προγράμματος.
Για πορτοφόλια και λογαριασμούς που αποθηκεύουν την κατάσταση του προγράμματος,
αυτό το πεδίο είναι false
.
Το πεδίο lamports
περιέχει το υπόλοιπο SOL του λογαριασμού, εκφρασμένο σε
lamport.
Τα lamport είναι η μικρότερη μονάδα του SOL. 1 SOL = 1.000.000.000 lamport.
Το πεδίο owner
δείχνει το πρόγραμμα που κατέχει τον λογαριασμό.
Για τα πορτοφόλια, ο ιδιοκτήτης είναι πάντα το System Program, με τη διεύθυνση
11111111111111111111111111111111
.
Το πεδίο rentEpoch
είναι ένα παλαιό πεδίο από έναν καταργημένο μηχανισμό όπου
οι λογαριασμοί χρεώνονταν "rent" (σε lamports) για να διατηρήσουν τα δεδομένα
τους στο δίκτυο.
Αυτό το πεδίο δεν χρησιμοποιείται πλέον, αλλά συμπεριλαμβάνεται για λόγους συμβατότητας με προηγούμενες εκδόσεις.
Το πεδίο 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 είναι ένας εκτελέσιμος λογαριασμός προγράμματος στο Solana. Όπως οι λογαριασμοί πορτοφολιού, τα προγράμματα έχουν την ίδια υποκείμενη δομή δεδομένων Account, αλλά με βασικές διαφορές στα πεδία τους.
Το πεδίο executable
έχει οριστεί ως true
, υποδεικνύοντας ότι το πεδίο data
αυτού του λογαριασμού περιέχει εκτελέσιμο κώδικα προγράμματος.
Για τους λογαριασμούς προγραμμάτων, το πεδίο data
αποθηκεύει τον εκτελέσιμο
κώδικα του προγράμματος. Σε αντίθεση, οι λογαριασμοί πορτοφολιού έχουν κενό
πεδίο δεδομένων.
Όταν αναπτύσσετε ένα πρόγραμμα Solana, ο εκτελέσιμος κώδικας του προγράμματος
αποθηκεύεται στο πεδίο data
ενός λογαριασμού.
Οι εκτελέσιμοι λογαριασμοί προγραμμάτων έχουν επίσης ένα πρόγραμμα που ορίζεται
ως ο owner
του λογαριασμού.
Όλοι οι λογαριασμοί προγραμμάτων ανήκουν σε ένα πρόγραμμα Loader, το οποίο είναι μια κατηγορία ενσωματωμένων προγραμμάτων που κατέχουν εκτελέσιμους λογαριασμούς προγραμμάτων στο Solana.
Για το Token Program, ο owner
είναι το πρόγραμμα BPFLoader2.
Ανάκτηση λογαριασμού mint
Αυτό το παράδειγμα ανακτά τον λογαριασμό mint του USD Coin (USDC) για να δείξει πώς τα προγράμματα στο Solana αποθηκεύουν την κατάσταση σε ξεχωριστούς λογαριασμούς.
Ένας λογαριασμός Mint είναι ένας λογαριασμός που ανήκει στο Token Program. Αποθηκεύει καθολικά μεταδεδομένα για ένα συγκεκριμένο token, συμπεριλαμβανομένης της συνολικής προσφοράς, του αριθμού των δεκαδικών ψηφίων και των λογαριασμών που είναι εξουσιοδοτημένοι να εκδίδουν ή να παγώνουν tokens. Η διεύθυνση του λογαριασμού mint προσδιορίζει μοναδικά ένα token στο δίκτυο 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);
Το βασικό σημείο που πρέπει να σημειωθεί σε αυτό το παράδειγμα είναι ότι ο λογαριασμός Mint αποθηκεύει κατάσταση, όχι εκτελέσιμο κώδικα.
Οι λογαριασμοί mint ανήκουν στο Token Program, το οποίο περιλαμβάνει οδηγίες που καθορίζουν πώς να δημιουργούνται και να ενημερώνονται οι λογαριασμοί mint.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Το πεδίο executable
είναι false
επειδή το πεδίο data
του λογαριασμού mint
αποθηκεύει κατάσταση, όχι εκτελέσιμο κώδικα.
Το Token Program ορίζει τον τύπο δεδομένων Mint
, ο οποίος αποθηκεύεται στο
πεδίο data
του λογαριασμού mint.
{"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}
Το Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
) κατέχει τον
λογαριασμό mint.
Αυτό σημαίνει ότι το πεδίο data
του λογαριασμού mint μπορεί να τροποποιηθεί
μόνο από τις οδηγίες που ορίζονται στο Token Program.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Αποσειριοποίηση λογαριασμού Mint
Το πεδίο data
ενός λογαριασμού Solana περιέχει ακατέργαστα bytes. Για να
ερμηνεύσετε αυτά τα δεδομένα με ουσιαστικό τρόπο, πρέπει να τα αποσειριοποιήσετε
στον κατάλληλο τύπο δεδομένων που ορίζεται από το πρόγραμμα που κατέχει τον
λογαριασμό.
Τα περισσότερα προγράμματα Solana παρέχουν βιβλιοθήκες πελάτη με βοηθητικές συναρτήσεις που αφαιρούν τη διαδικασία αποσειριοποίησης. Αυτές οι συναρτήσεις μετατρέπουν τα ακατέργαστα bytes του λογαριασμού σε δομημένους τύπους δεδομένων, διευκολύνοντας την εργασία με τα δεδομένα του λογαριασμού.
Για παράδειγμα, το @solana/spl-token
περιλαμβάνει τη συνάρτηση
getMint()
για να βοηθήσει στην αποσειριοποίηση του πεδίου
data
ενός λογαριασμού Mint στον τύπο δεδομένων
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>,}
Η συνάρτηση getMint()
αποσειριοποιεί το πεδίο data
ενός λογαριασμού mint
στον τύπο δεδομένων
Mint
που ορίζεται από το Token Program.
{"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.
Η διεύθυνση του λογαριασμού mint χρησιμοποιείται για την αναγνώριση του token στο δίκτυο Solana.
Το πεδίο mintAuthority
δείχνει την αρχή που επιτρέπεται να δημιουργεί νέα
tokens.
Αυτός είναι ο μοναδικός λογαριασμός που μπορεί να δημιουργήσει νέες μονάδες του 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?