Στην προηγούμενη ενότητα, μάθατε πώς να διαβάζετε δεδομένα από το δίκτυο Solana ανακτώντας λογαριασμούς. Η εγγραφή δεδομένων στο δίκτυο Solana απαιτεί μια συναλλαγή. Μια συναλλαγή περιέχει μία ή περισσότερες οδηγίες, και κάθε οδηγία καλεί ένα πρόγραμμα.
Τα προγράμματα ορίζουν την επιχειρηματική λογική για κάθε οδηγία. Όταν στέλνετε μια συναλλαγή, το περιβάλλον εκτέλεσης του Solana εκτελεί τις οδηγίες της συναλλαγής με τη σειρά. Οι συναλλαγές είναι ατομικές. Είτε κάθε οδηγία στη συναλλαγή ολοκληρώνεται επιτυχώς, είτε ολόκληρη η συναλλαγή αποτυγχάνει.
Τα παραδείγματα σε αυτή την ενότητα δείχνουν πώς να:
- Μεταφέρετε SOL μεταξύ λογαριασμών
- Δημιουργήσετε ένα νέο token mint
Μεταφορά SOL
Το παρακάτω παράδειγμα μεταφέρει SOL από έναν λογαριασμό σε έναν άλλο. Μόνο το πρόγραμμα που έχει οριστεί ως ιδιοκτήτης ενός λογαριασμού μπορεί να τροποποιήσει τα δεδομένα του λογαριασμού ή να αφαιρέσει lamports από το υπόλοιπό του. Οι λογαριασμοί πορτοφολιού ανήκουν στο System Program, οπότε η μεταφορά SOL μεταξύ λογαριασμών πορτοφολιού απαιτεί μια οδηγία που καλεί την οδηγία transfer του System Program. Ο λογαριασμός προέλευσης πρέπει επίσης να υπογράψει τη συναλλαγή.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";import { getTransferSolInstruction } from "@solana-program/system";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const receiver = await generateKeyPairSigner();const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();console.log("Sender Balance:", senderBalance);console.log("Receiver Balance:", receiverBalance);
Δημιουργήστε έναν πελάτη Kit για τον τοπικό δοκιμαστικό validator. Αυτό το απόσπασμα προσθέτει έναν υπογράφοντα πληρωτή, συνδέεται στο τοπικό τερματικό RPC, ενεργοποιεί τα airdrops και χρηματοδοτεί τον πληρωτή με δοκιμαστικά SOL για τη μεταφορά.
const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));
Δημιουργήστε έναν υπογράφοντα για τον παραλήπτη. Ο αποστολέας είναι
client.payer, ο οποίος δημιουργήθηκε από generatedPayer() και
χρηματοδοτήθηκε από airdropPayer().
const receiver = await generateKeyPairSigner();
Το βοηθητικό πρόγραμμα getTransferSolInstruction() δημιουργεί μια εντολή
System Program. Η εντολή μεταφέρει SOL από τον υπογράφοντα
source στη διεύθυνση destination
για το καθορισμένο amount lamports.
const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});
Καλέστε client.sendTransaction() με έναν πίνακα εντολών. Ο πελάτης Kit
μετατρέπει τις εντολές σε μία συναλλαγή, υπογράφει με τους υπογράφοντες που
είναι συνδεδεμένοι στις εντολές, αποστέλλει τη συναλλαγή και αναμένει
επιβεβαίωση.
const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);
Αφού επιβεβαιωθεί η συναλλαγή, ανακτήστε και τα δύο υπόλοιπα χρησιμοποιώντας
client.rpc.
const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();
Δημιουργία token
Το παρακάτω παράδειγμα δημιουργεί ένα νέο mint token χρησιμοποιώντας το Token Extensions Program. Ένα mint account είναι ο λογαριασμός που ορίζει τις γενικές ρυθμίσεις ενός token, όπως τα δεκαδικά ψηφία, την προσφορά, την αρχή έκδοσης και την αρχή παγώματος.
Η δημιουργία ενός mint account απαιτεί δύο εντολές:
- Κλήση του System Program για τη δημιουργία νέου λογαριασμού που ανήκει στο Token Extensions Program.
- Κλήση του Token Extensions Program για την αρχικοποίηση αυτού του λογαριασμού ως mint.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";import { getCreateAccountInstruction } from "@solana-program/system";import {fetchMint,getInitializeMintInstruction,getMintSize,TOKEN_2022_PROGRAM_ADDRESS} from "@solana-program/token-2022";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const mint = await generateKeyPairSigner();const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);console.log("Mint Address:", mint.address);console.log("Transaction Signature:", result.context.signature);const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
Δημιουργήστε και χρηματοδοτήστε ένα Kit client, στη συνέχεια δημιουργήστε έναν signer για χρήση ως διεύθυνση του νέου mint account. Ο πληρωτής του client χρηματοδοτεί τη δημιουργία λογαριασμού και πληρώνει την προμήθεια συναλλαγής.
const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const mint = await generateKeyPairSigner();
Υπολογίστε το μέγεθος του mint account σε bytes, στη συνέχεια κάντε ένα αίτημα RPC για να υπολογίσετε τα lamports που απαιτούνται για την αποθήκευση αυτών των δεδομένων στον λογαριασμό. Αυτό το απαιτούμενο υπόλοιπο αναφέρεται ως rent.
const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();
Η πρώτη εντολή καλεί το System Program. Η εντολή χρησιμοποιεί το
payer για να χρηματοδοτήσει έναν
newAccount, δεσμεύει τον space του
mint account, μεταφέρει τα lamports απαλλαγής rent, και
αναθέτει την κυριότητα στο programAddress.
const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});
Η δεύτερη εντολή καλεί το Token Extensions Program. Η εντολή αρχικοποιεί τη
διεύθυνση mint με μια τιμή
decimals, μια mintAuthority,
μια freezeAuthority, και καθορίζει το
tokenProgram που κατέχει το mint account.
const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});
Στείλτε και τις δύο εντολές σε μία συναλλαγή. Η εντολή δημιουργίας λογαριασμού πρέπει να έρθει πριν από την εντολή αρχικοποίησης mint, επειδή το mint account πρέπει να υπάρχει πριν το Token Extensions Program μπορέσει να γράψει δεδομένα mint στον λογαριασμό.
const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);
Αφού επιβεβαιωθεί η συναλλαγή, ανακτήστε το mint account.
const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
Is this page helpful?