Εγγραφή στο δίκτυο

Στην προηγούμενη ενότητα, μάθατε πώς να διαβάζετε δεδομένα από το δίκτυο Solana. Τώρα θα μάθετε πώς να γράφετε δεδομένα σε αυτό. Η εγγραφή στο δίκτυο Solana περιλαμβάνει την αποστολή συναλλαγών που περιέχουν μία ή περισσότερες οδηγίες.

Τα προγράμματα (έξυπνα συμβόλαια) καθορίζουν την επιχειρηματική λογική για το τι κάνει κάθε οδηγία. Όταν υποβάλλετε μια συναλλαγή, το περιβάλλον εκτέλεσης της Solana εκτελεί κάθε οδηγία σε ακολουθία και ατομικά (που σημαίνει ότι είτε όλες οι οδηγίες επιτυγχάνουν είτε ολόκληρη η συναλλαγή αποτυγχάνει).

Αυτή η ενότητα καλύπτει τα ακόλουθα παραδείγματα:

  1. Μεταφορά SOL μεταξύ λογαριασμών
  2. Δημιουργία νέου token

Αυτά τα παραδείγματα δείχνουν πώς να δημιουργείτε και να στέλνετε συναλλαγές για να καλέσετε προγράμματα της Solana. Για περισσότερες λεπτομέρειες, ανατρέξτε στις σελίδες Συναλλαγές και Οδηγίες και Χρεώσεις στη Solana.

Μεταφορά SOL

Σε αυτό το παράδειγμα, θα μάθετε πώς να μεταφέρετε SOL μεταξύ δύο λογαριασμών.

Στη Solana, κάθε λογαριασμός έχει ένα συγκεκριμένο πρόγραμμα ως ιδιοκτήτη του. Μόνο ο ιδιοκτήτης του προγράμματος μπορεί να αφαιρέσει το υπόλοιπο SOL (lamport) ενός λογαριασμού.

Το System Program είναι ο ιδιοκτήτης για όλους τους λογαριασμούς "πορτοφολιού". Για να μεταφέρετε SOL, πρέπει να καλέσετε την οδηγία transfer του System Program.

Transfer SOL
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}`);
Console
Click to execute the code.

Δημιουργήστε ένα Connection για να διαχειριστείτε την αποστολή συναλλαγών και την ανάκτηση δεδομένων λογαριασμού.

Σε αυτό το παράδειγμα, συνδεόμαστε στον τοπικό validator δοκιμών που εκτελείται στο localhost:8899.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Δημιουργήστε νέα keypair για χρήση ως λογαριασμοί αποστολέα και παραλήπτη.

Ένα Keypair περιλαμβάνει:

  • Ένα δημόσιο κλειδί που λειτουργεί ως διεύθυνση λογαριασμού
  • Ένα ιδιωτικό κλειδί που χρησιμοποιείται για την υπογραφή συναλλαγών
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Πριν μπορέσουμε να μεταφέρουμε SOL, ο λογαριασμός αποστολέα πρέπει να έχει κάποιο υπόλοιπο SOL.

Σε δίκτυα εκτός του mainnet, μπορείτε να χρησιμοποιήσετε τη μέθοδο requestAirdrop για να λάβετε SOL για δοκιμές.

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Η μέθοδος SystemProgram.transfer() δημιουργεί μια εντολή που μεταφέρει SOL από τον λογαριασμό fromPubkey στον λογαριασμό toPubkey για το καθορισμένο ποσό lamports.

Transfer Instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});

Δημιουργήστε μια συναλλαγή και προσθέστε την εντολή στη συναλλαγή.

Σε αυτό το παράδειγμα, δημιουργούμε μια συναλλαγή με μία μόνο εντολή. Ωστόσο, μπορείτε να προσθέσετε πολλαπλές εντολές σε μια συναλλαγή.

Transaction
const transaction = new Transaction().add(transferInstruction);

Υπογράψτε και στείλτε τη συναλλαγή στο δίκτυο.

Το ζεύγος κλειδιών του αποστολέα απαιτείται στον πίνακα υπογραφόντων για την εξουσιοδότηση της μεταφοράς SOL από τον λογαριασμό του.

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

Η υπογραφή της συναλλαγής είναι ένα μοναδικό αναγνωριστικό που μπορεί να χρησιμοποιηθεί για την αναζήτηση της συναλλαγής στον Solana Explorer.

Δημιουργήστε ένα Connection για να διαχειριστείτε την αποστολή συναλλαγών και την ανάκτηση δεδομένων λογαριασμού.

Σε αυτό το παράδειγμα, συνδεόμαστε στον τοπικό validator δοκιμών που εκτελείται στο localhost:8899.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Δημιουργήστε νέα keypair για χρήση ως λογαριασμοί αποστολέα και παραλήπτη.

Ένα Keypair περιλαμβάνει:

  • Ένα δημόσιο κλειδί που λειτουργεί ως διεύθυνση λογαριασμού
  • Ένα ιδιωτικό κλειδί που χρησιμοποιείται για την υπογραφή συναλλαγών
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Πριν μπορέσουμε να μεταφέρουμε SOL, ο λογαριασμός αποστολέα πρέπει να έχει κάποιο υπόλοιπο SOL.

Σε δίκτυα εκτός του mainnet, μπορείτε να χρησιμοποιήσετε τη μέθοδο requestAirdrop για να λάβετε SOL για δοκιμές.

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Η μέθοδος SystemProgram.transfer() δημιουργεί μια εντολή που μεταφέρει SOL από τον λογαριασμό fromPubkey στον λογαριασμό toPubkey για το καθορισμένο ποσό lamports.

Transfer Instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});

Δημιουργήστε μια συναλλαγή και προσθέστε την εντολή στη συναλλαγή.

Σε αυτό το παράδειγμα, δημιουργούμε μια συναλλαγή με μία μόνο εντολή. Ωστόσο, μπορείτε να προσθέσετε πολλαπλές εντολές σε μια συναλλαγή.

Transaction
const transaction = new Transaction().add(transferInstruction);

Υπογράψτε και στείλτε τη συναλλαγή στο δίκτυο.

Το ζεύγος κλειδιών του αποστολέα απαιτείται στον πίνακα υπογραφόντων για την εξουσιοδότηση της μεταφοράς SOL από τον λογαριασμό του.

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

Η υπογραφή της συναλλαγής είναι ένα μοναδικό αναγνωριστικό που μπορεί να χρησιμοποιηθεί για την αναζήτηση της συναλλαγής στον Solana Explorer.

Transfer SOL
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
Connection
} from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");

Δημιουργία ενός Token

Σε αυτό το παράδειγμα, θα μάθετε πώς να δημιουργήσετε ένα νέο token στο Solana χρησιμοποιώντας το Token Extensions Program. Αυτό απαιτεί δύο εντολές:

  1. Επίκληση του System Program για τη δημιουργία ενός νέου λογαριασμού.
  2. Επίκληση του Token Extensions Program για την αρχικοποίηση αυτού του λογαριασμού ως Mint.
Create Mint Account
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 SOL
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
// Generate keypair to use as address of mint account
const mint = new Keypair();
// Calculate lamports required for rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);
// Instruction to create new account with space for new mint account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});
// Instruction to initialize mint account
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);
// Build transaction with instructions to create new account and initialize mint account
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet, // payer
mint // mint address keypair
]
);
console.log("Transaction Signature:", `${transactionSignature}`);
const mintData = await getMint(
connection,
mint.publicKey,
"confirmed",
TOKEN_2022_PROGRAM_ID
);
);
Console
Click to execute the code.

Η δημιουργία ενός token στο Solana απαιτεί τη χρήση των βιβλιοθηκών @solana/web3.js και @solana/spl-token.

  • Δημιουργία σύνδεσης
  • Δημιουργία keypair για την πληρωμή της συναλλαγής
  • Αίτηση airdrop για τη χρηματοδότηση του keypair
Connection & Wallet Setup
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.

Mint Keypair
const mint = new Keypair();

Υπολογίστε τα ελάχιστα lamports που απαιτούνται για ένα mint account.

Η συνάρτηση getMinimumBalanceForRentExemptMint υπολογίζει ακριβώς πόσο SOL (σε lamports) πρέπει να διατεθεί για τα δεδομένα σε ένα mint account.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Η πρώτη εντολή καλεί την εντολή createAccount του System Program για να:

  1. Διαθέσει τα απαιτούμενα bytes για την αποθήκευση δεδομένων του mint
  2. Μεταφέρει lamports από το πορτοφόλι για τη χρηματοδότηση του νέου λογαριασμού
  3. Αναθέσει την κυριότητα του λογαριασμού στο Token Extensions program (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
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 δεκαδικά ψηφία
  • Το πορτοφόλι ως αρχή έκδοσης και αρχή παγώματος
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Προσθέστε και τις δύο εντολές σε μία συναλλαγή.

Συνδυάζοντας και τις δύο εντολές σε μία συναλλαγή, διασφαλίζετε ότι η δημιουργία και η αρχικοποίηση του λογαριασμού συμβαίνουν ατομικά. Είτε επιτυγχάνουν και οι δύο εντολές, είτε καμία.

Αυτή η προσέγγιση είναι συνηθισμένη κατά τη δημιουργία πιο σύνθετων συναλλαγών Solana, καθώς εγγυάται ότι όλες οι εντολές εκτελούνται μαζί.

Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

Υπογράψτε και στείλτε τη συναλλαγή. Απαιτούνται δύο υπογραφές:

  • Το Πορτοφόλι υπογράφει ως πληρωτής για τα τέλη συναλλαγής και τη δημιουργία λογαριασμού
  • Το Mint υπογράφει για να εξουσιοδοτήσει τη χρήση της διεύθυνσής του για το νέο λογαριασμό
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

Η υπογραφή συναλλαγής που επιστρέφεται μπορεί να χρησιμοποιηθεί για την επιθεώρηση της συναλλαγής στον Solana Explorer.

Η δημιουργία ενός token στο Solana απαιτεί τη χρήση των βιβλιοθηκών @solana/web3.js και @solana/spl-token.

  • Δημιουργία σύνδεσης
  • Δημιουργία keypair για την πληρωμή της συναλλαγής
  • Αίτηση airdrop για τη χρηματοδότηση του keypair
Connection & Wallet Setup
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.

Mint Keypair
const mint = new Keypair();

Υπολογίστε τα ελάχιστα lamports που απαιτούνται για ένα mint account.

Η συνάρτηση getMinimumBalanceForRentExemptMint υπολογίζει ακριβώς πόσο SOL (σε lamports) πρέπει να διατεθεί για τα δεδομένα σε ένα mint account.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Η πρώτη εντολή καλεί την εντολή createAccount του System Program για να:

  1. Διαθέσει τα απαιτούμενα bytes για την αποθήκευση δεδομένων του mint
  2. Μεταφέρει lamports από το πορτοφόλι για τη χρηματοδότηση του νέου λογαριασμού
  3. Αναθέσει την κυριότητα του λογαριασμού στο Token Extensions program (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
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 δεκαδικά ψηφία
  • Το πορτοφόλι ως αρχή έκδοσης και αρχή παγώματος
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Προσθέστε και τις δύο εντολές σε μία συναλλαγή.

Συνδυάζοντας και τις δύο εντολές σε μία συναλλαγή, διασφαλίζετε ότι η δημιουργία και η αρχικοποίηση του λογαριασμού συμβαίνουν ατομικά. Είτε επιτυγχάνουν και οι δύο εντολές, είτε καμία.

Αυτή η προσέγγιση είναι συνηθισμένη κατά τη δημιουργία πιο σύνθετων συναλλαγών Solana, καθώς εγγυάται ότι όλες οι εντολές εκτελούνται μαζί.

Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

Υπογράψτε και στείλτε τη συναλλαγή. Απαιτούνται δύο υπογραφές:

  • Το Πορτοφόλι υπογράφει ως πληρωτής για τα τέλη συναλλαγής και τη δημιουργία λογαριασμού
  • Το Mint υπογράφει για να εξουσιοδοτήσει τη χρήση της διεύθυνσής του για το νέο λογαριασμό
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

Η υπογραφή συναλλαγής που επιστρέφεται μπορεί να χρησιμοποιηθεί για την επιθεώρηση της συναλλαγής στον Solana Explorer.

Create Mint Account
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();
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Is this page helpful?

Πίνακας Περιεχομένων

Επεξεργασία Σελίδας