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

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

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

Τα παραδείγματα σε αυτή την ενότητα δείχνουν πώς να:

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

Μεταφορά SOL

Το παρακάτω παράδειγμα μεταφέρει SOL από έναν λογαριασμό σε έναν άλλο. Μόνο το πρόγραμμα που έχει οριστεί ως ιδιοκτήτης ενός λογαριασμού μπορεί να τροποποιήσει τα δεδομένα του λογαριασμού ή να αφαιρέσει lamports από το υπόλοιπό του. Οι λογαριασμοί πορτοφολιού ανήκουν στο System Program, οπότε η μεταφορά SOL μεταξύ λογαριασμών πορτοφολιού απαιτεί μια οδηγία που καλεί την οδηγία transfer του System Program. Ο λογαριασμός προέλευσης πρέπει επίσης να υπογράψει τη συναλλαγή.

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

Δημιουργήστε έναν πελάτη Kit για τον τοπικό δοκιμαστικό validator. Αυτό το απόσπασμα προσθέτει έναν υπογράφοντα πληρωτή, συνδέεται στο τοπικό τερματικό RPC, ενεργοποιεί τα airdrops και χρηματοδοτεί τον πληρωτή με δοκιμαστικά SOL για τη μεταφορά.

Client setup
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().

Receiver signer
const receiver = await generateKeyPairSigner();

Το βοηθητικό πρόγραμμα getTransferSolInstruction() δημιουργεί μια εντολή System Program. Η εντολή μεταφέρει SOL από τον υπογράφοντα source στη διεύθυνση destination για το καθορισμένο amount lamports.

Transfer instruction
const transferInstruction = getTransferSolInstruction({
source: client.payer,
destination: receiver.address,
amount: lamports(10_000_000n)
});

Καλέστε client.sendTransaction() με έναν πίνακα εντολών. Ο πελάτης Kit μετατρέπει τις εντολές σε μία συναλλαγή, υπογράφει με τους υπογράφοντες που είναι συνδεδεμένοι στις εντολές, αποστέλλει τη συναλλαγή και αναμένει επιβεβαίωση.

Send transaction
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);

Αφού επιβεβαιωθεί η συναλλαγή, ανακτήστε και τα δύο υπόλοιπα χρησιμοποιώντας client.rpc.

Fetch balances
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();

Δημιουργήστε έναν πελάτη Kit για τον τοπικό δοκιμαστικό validator. Αυτό το απόσπασμα προσθέτει έναν υπογράφοντα πληρωτή, συνδέεται στο τοπικό τερματικό RPC, ενεργοποιεί τα airdrops και χρηματοδοτεί τον πληρωτή με δοκιμαστικά SOL για τη μεταφορά.

Client setup
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().

Receiver signer
const receiver = await generateKeyPairSigner();

Το βοηθητικό πρόγραμμα getTransferSolInstruction() δημιουργεί μια εντολή System Program. Η εντολή μεταφέρει SOL από τον υπογράφοντα source στη διεύθυνση destination για το καθορισμένο amount lamports.

Transfer instruction
const transferInstruction = getTransferSolInstruction({
source: client.payer,
destination: receiver.address,
amount: lamports(10_000_000n)
});

Καλέστε client.sendTransaction() με έναν πίνακα εντολών. Ο πελάτης Kit μετατρέπει τις εντολές σε μία συναλλαγή, υπογράφει με τους υπογράφοντες που είναι συνδεδεμένοι στις εντολές, αποστέλλει τη συναλλαγή και αναμένει επιβεβαίωση.

Send transaction
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);

Αφού επιβεβαιωθεί η συναλλαγή, ανακτήστε και τα δύο υπόλοιπα χρησιμοποιώντας client.rpc.

Fetch balances
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();
Transfer SOL
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)));

Δημιουργία token

Το παρακάτω παράδειγμα δημιουργεί ένα νέο mint token χρησιμοποιώντας το Token Extensions Program. Ένα mint account είναι ο λογαριασμός που ορίζει τις γενικές ρυθμίσεις ενός token, όπως τα δεκαδικά ψηφία, την προσφορά, την αρχή έκδοσης και την αρχή παγώματος.

Η δημιουργία ενός mint account απαιτεί δύο εντολές:

  1. Κλήση του System Program για τη δημιουργία νέου λογαριασμού που ανήκει στο Token Extensions Program.
  2. Κλήση του Token Extensions Program για την αρχικοποίηση αυτού του λογαριασμού ως mint.
Create mint account
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);
Console
Click to execute the code.

Δημιουργήστε και χρηματοδοτήστε ένα Kit client, στη συνέχεια δημιουργήστε έναν signer για χρήση ως διεύθυνση του νέου mint account. Ο πληρωτής του client χρηματοδοτεί τη δημιουργία λογαριασμού και πληρώνει την προμήθεια συναλλαγής.

Client and mint setup
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.

Mint account size and rent
const space = BigInt(getMintSize());
const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();

Η πρώτη εντολή καλεί το System Program. Η εντολή χρησιμοποιεί το payer για να χρηματοδοτήσει έναν newAccount, δεσμεύει τον space του mint account, μεταφέρει τα lamports απαλλαγής rent, και αναθέτει την κυριότητα στο programAddress.

Create account instruction
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.

Initialize mint instruction
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 στον λογαριασμό.

Send transaction
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);

Αφού επιβεβαιωθεί η συναλλαγή, ανακτήστε το mint account.

Fetch mint account
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log("Mint Account:", mintAccount);

Δημιουργήστε και χρηματοδοτήστε ένα Kit client, στη συνέχεια δημιουργήστε έναν signer για χρήση ως διεύθυνση του νέου mint account. Ο πληρωτής του client χρηματοδοτεί τη δημιουργία λογαριασμού και πληρώνει την προμήθεια συναλλαγής.

Client and mint setup
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.

Mint account size and rent
const space = BigInt(getMintSize());
const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();

Η πρώτη εντολή καλεί το System Program. Η εντολή χρησιμοποιεί το payer για να χρηματοδοτήσει έναν newAccount, δεσμεύει τον space του mint account, μεταφέρει τα lamports απαλλαγής rent, και αναθέτει την κυριότητα στο programAddress.

Create account instruction
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.

Initialize mint instruction
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 στον λογαριασμό.

Send transaction
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);

Αφού επιβεβαιωθεί η συναλλαγή, ανακτήστε το mint account.

Fetch mint account
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log("Mint Account:", mintAccount);
Create mint account
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();

Is this page helpful?

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

Επεξεργασία Σελίδας
© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.