Запис у мережу

У попередньому розділі ви дізналися, як читати дані з мережі Solana. Тепер ви дізнаєтеся, як записувати дані в неї. Запис у мережу Solana передбачає надсилання транзакцій, що містять одну або кілька інструкцій.

Програми визначають бізнес-логіку для того, що робить кожна інструкція. Коли ви надсилаєте транзакцію, середовище виконання Solana виконує кожну інструкцію послідовно та атомарно. Приклади в цьому розділі показують, як створювати та надсилати транзакції для виклику програм Solana, вони включають:

  1. Переказ SOL між обліковими записами
  2. Створення нового токена

Переказ SOL

Приклад нижче переказує SOL між двома обліковими записами. Кожен обліковий запис має власну програму, яка є єдиною програмою, що може зменшувати баланс SOL облікового запису.

Усі облікові записи гаманців належать 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");

Згенеруйте нові keypairs для використання як рахунки відправника та отримувача.

Generate keypairs
const sender = new Keypair();
const receiver = new Keypair();

Додайте SOL на рахунок відправника. У мережах, відмінних від основної, ви можете використовувати метод 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);

Підпишіть та надішліть транзакцію до мережі. Keypair відправника необхідний у масиві підписантів для авторизації переказу 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");

Згенеруйте нові keypairs для використання як рахунки відправника та отримувача.

Generate keypairs
const sender = new Keypair();
const receiver = new Keypair();

Додайте SOL на рахунок відправника. У мережах, відмінних від основної, ви можете використовувати метод 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);

Підпишіть та надішліть транзакцію до мережі. Keypair відправника необхідний у масиві підписантів для авторизації переказу 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");

Створення токена

Приклад нижче створює новий токен на 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.

Створення токена вимагає використання бібліотек @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. Публічний ключ буде використовуватися як адреса mint account.

Mint keypair
const mint = new Keypair();

Обчисліть мінімальну кількість lamports, необхідну для mint account. Функція getMinimumBalanceForRentExemptMint обчислює, скільки lamport потрібно виділити для даних на mint account.

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Перша інструкція викликає createAccount інструкцію System Program для:

  1. Виділіть кількість байтів, необхідних для зберігання даних mint-акаунта.
  2. Переведіть лампорти з гаманця для фінансування нового акаунта.
  3. Призначте власника акаунта як Token Extensions program.
Create account instruction
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});

Друга інструкція викликає Token Extensions Program з createInitializeMint2Instruction інструкцією для ініціалізації mint account з наступними даними:

  • 2 десяткових знаки
  • Гаманець як authority для карбування та заморожування
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.

Створення токена вимагає використання бібліотек @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. Публічний ключ буде використовуватися як адреса mint account.

Mint keypair
const mint = new Keypair();

Обчисліть мінімальну кількість lamports, необхідну для mint account. Функція getMinimumBalanceForRentExemptMint обчислює, скільки lamport потрібно виділити для даних на mint account.

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Перша інструкція викликає createAccount інструкцію System Program для:

  1. Виділіть кількість байтів, необхідних для зберігання даних mint-акаунта.
  2. Переведіть лампорти з гаманця для фінансування нового акаунта.
  3. Призначте власника акаунта як Token Extensions program.
Create account instruction
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});

Друга інструкція викликає Token Extensions Program з createInitializeMint2Instruction інструкцією для ініціалізації mint account з наступними даними:

  • 2 десяткових знаки
  • Гаманець як authority для карбування та заморожування
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?

Зміст

Редагувати сторінку

Керується

© 2025 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку