Εγγραφή στο δίκτυο
Στην προηγούμενη ενότητα, μάθατε πώς να διαβάζετε δεδομένα από το δίκτυο Solana. Τώρα θα μάθετε πώς να γράφετε δεδομένα σε αυτό. Η εγγραφή στο δίκτυο Solana περιλαμβάνει την αποστολή συναλλαγών που περιέχουν μία ή περισσότερες οδηγίες.
Τα προγράμματα (έξυπνα συμβόλαια) καθορίζουν την επιχειρηματική λογική για το τι κάνει κάθε οδηγία. Όταν υποβάλλετε μια συναλλαγή, το περιβάλλον εκτέλεσης της Solana εκτελεί κάθε οδηγία σε ακολουθία και ατομικά (που σημαίνει ότι είτε όλες οι οδηγίες επιτυγχάνουν είτε ολόκληρη η συναλλαγή αποτυγχάνει).
Αυτή η ενότητα καλύπτει τα ακόλουθα παραδείγματα:
- Μεταφορά SOL μεταξύ λογαριασμών
- Δημιουργία νέου token
Αυτά τα παραδείγματα δείχνουν πώς να δημιουργείτε και να στέλνετε συναλλαγές για να καλέσετε προγράμματα της Solana. Για περισσότερες λεπτομέρειες, ανατρέξτε στις σελίδες Συναλλαγές και Οδηγίες και Χρεώσεις στη Solana.
Μεταφορά SOL
Σε αυτό το παράδειγμα, θα μάθετε πώς να μεταφέρετε SOL μεταξύ δύο λογαριασμών.
Στη Solana, κάθε λογαριασμός έχει ένα συγκεκριμένο πρόγραμμα ως ιδιοκτήτη του. Μόνο ο ιδιοκτήτης του προγράμματος μπορεί να αφαιρέσει το υπόλοιπο SOL (lamport) ενός λογαριασμού.
Το System Program είναι ο ιδιοκτήτης για όλους τους λογαριασμούς "πορτοφολιού". Για να μεταφέρετε SOL, πρέπει να καλέσετε την οδηγία transfer του System Program.
import {LAMPORTS_PER_SOL,SystemProgram,Transaction,sendAndConfirmTransaction,Keypair,Connection} from "@solana/web3.js";const connection = new Connection("http://localhost:8899", "confirmed");const sender = new Keypair();const receiver = new Keypair();const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});const transaction = new Transaction().add(transferInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);console.log("Transaction Signature:", `${transactionSignature}`);const senderBalance = await connection.getBalance(sender.publicKey);const receiverBalance = await connection.getBalance(receiver.publicKey);console.log("Sender Balance:", `${senderBalance}`);console.log("Receiver Balance:", `${receiverBalance}`);
Δημιουργήστε ένα Connection
για να διαχειριστείτε την αποστολή συναλλαγών και
την ανάκτηση δεδομένων λογαριασμού.
Σε αυτό το παράδειγμα, συνδεόμαστε στον τοπικό validator δοκιμών που εκτελείται
στο localhost:8899
.
const connection = new Connection("http://localhost:8899", "confirmed");
Δημιουργήστε νέα keypair για χρήση ως λογαριασμοί αποστολέα και παραλήπτη.
Ένα Keypair
περιλαμβάνει:
- Ένα δημόσιο κλειδί που λειτουργεί ως διεύθυνση λογαριασμού
- Ένα ιδιωτικό κλειδί που χρησιμοποιείται για την υπογραφή συναλλαγών
const sender = new Keypair();const receiver = new Keypair();
Πριν μπορέσουμε να μεταφέρουμε SOL, ο λογαριασμός αποστολέα πρέπει να έχει κάποιο υπόλοιπο SOL.
Σε δίκτυα εκτός του mainnet, μπορείτε να χρησιμοποιήσετε τη μέθοδο
requestAirdrop
για να λάβετε SOL για δοκιμές.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
Η μέθοδος SystemProgram.transfer()
δημιουργεί μια εντολή που μεταφέρει SOL από
τον λογαριασμό fromPubkey
στον λογαριασμό
toPubkey
για το καθορισμένο ποσό lamports
.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Δημιουργήστε μια συναλλαγή και προσθέστε την εντολή στη συναλλαγή.
Σε αυτό το παράδειγμα, δημιουργούμε μια συναλλαγή με μία μόνο εντολή. Ωστόσο, μπορείτε να προσθέσετε πολλαπλές εντολές σε μια συναλλαγή.
const transaction = new Transaction().add(transferInstruction);
Υπογράψτε και στείλτε τη συναλλαγή στο δίκτυο.
Το ζεύγος κλειδιών του αποστολέα απαιτείται στον πίνακα υπογραφόντων για την εξουσιοδότηση της μεταφοράς SOL από τον λογαριασμό του.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
Η υπογραφή της συναλλαγής είναι ένα μοναδικό αναγνωριστικό που μπορεί να χρησιμοποιηθεί για την αναζήτηση της συναλλαγής στον Solana Explorer.
Δημιουργία ενός Token
Σε αυτό το παράδειγμα, θα μάθετε πώς να δημιουργήσετε ένα νέο token στο Solana χρησιμοποιώντας το Token Extensions Program. Αυτό απαιτεί δύο εντολές:
- Επίκληση του System Program για τη δημιουργία ενός νέου λογαριασμού.
- Επίκληση του Token Extensions Program για την αρχικοποίηση αυτού του λογαριασμού ως Mint.
import {Connection,Keypair,SystemProgram,Transaction,sendAndConfirmTransaction,LAMPORTS_PER_SOL} from "@solana/web3.js";import {MINT_SIZE,TOKEN_2022_PROGRAM_ID,createInitializeMint2Instruction,getMinimumBalanceForRentExemptMint,getMint} from "@solana/spl-token";const connection = new Connection("http://localhost:8899", "confirmed");const wallet = new Keypair();// Fund the wallet with SOLconst signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");// Generate keypair to use as address of mint accountconst mint = new Keypair();// Calculate lamports required for rent exemptionconst rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);// Instruction to create new account with space for new mint accountconst createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});// Instruction to initialize mint accountconst initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);// Build transaction with instructions to create new account and initialize mint accountconst transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, // payermint // mint address keypair]);console.log("Transaction Signature:", `${transactionSignature}`);const mintData = await getMint(connection,mint.publicKey,"confirmed",TOKEN_2022_PROGRAM_ID););
Η δημιουργία ενός token στο Solana απαιτεί τη χρήση των βιβλιοθηκών
@solana/web3.js
και @solana/spl-token
.
- Δημιουργία σύνδεσης
- Δημιουργία keypair για την πληρωμή της συναλλαγής
- Αίτηση airdrop για τη χρηματοδότηση του keypair
const connection = new Connection("http://localhost:8899", "confirmed");const wallet = new Keypair();const signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
Δημιουργήστε ένα keypair για το mint account.
Το δημόσιο κλειδί αυτού του keypair θα χρησιμοποιηθεί ως διεύθυνση για το mint account.
const mint = new Keypair();
Υπολογίστε τα ελάχιστα lamports που απαιτούνται για ένα mint account.
Η συνάρτηση getMinimumBalanceForRentExemptMint
υπολογίζει ακριβώς πόσο SOL (σε
lamports) πρέπει να διατεθεί για τα δεδομένα σε ένα mint account.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Η πρώτη εντολή καλεί την εντολή createAccount
του System Program για να:
- Διαθέσει τα απαιτούμενα bytes για την αποθήκευση δεδομένων του mint
- Μεταφέρει lamports από το πορτοφόλι για τη χρηματοδότηση του νέου λογαριασμού
- Αναθέσει την κυριότητα του λογαριασμού στο Token
Extensions program (
TOKEN_2022_PROGRAM_ID
)
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
Η δεύτερη εντολή καλεί την εντολή createInitializeMint2Instruction
του
Token Extensions Program για να αρχικοποιήσει το mint
account με τα ακόλουθα δεδομένα:
- 2 δεκαδικά ψηφία
- Το πορτοφόλι ως αρχή έκδοσης και αρχή παγώματος
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Προσθέστε και τις δύο εντολές σε μία συναλλαγή.
Συνδυάζοντας και τις δύο εντολές σε μία συναλλαγή, διασφαλίζετε ότι η δημιουργία και η αρχικοποίηση του λογαριασμού συμβαίνουν ατομικά. Είτε επιτυγχάνουν και οι δύο εντολές, είτε καμία.
Αυτή η προσέγγιση είναι συνηθισμένη κατά τη δημιουργία πιο σύνθετων συναλλαγών Solana, καθώς εγγυάται ότι όλες οι εντολές εκτελούνται μαζί.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Υπογράψτε και στείλτε τη συναλλαγή. Απαιτούνται δύο υπογραφές:
- Το Πορτοφόλι υπογράφει ως πληρωτής για τα τέλη συναλλαγής και τη δημιουργία λογαριασμού
- Το Mint υπογράφει για να εξουσιοδοτήσει τη χρήση της διεύθυνσής του για το νέο λογαριασμό
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
Η υπογραφή συναλλαγής που επιστρέφεται μπορεί να χρησιμοποιηθεί για την επιθεώρηση της συναλλαγής στον Solana Explorer.
Is this page helpful?