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

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

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

Цей розділ охоплює такі приклади:

  1. Переказ SOL між рахунками
  2. Створення нового токена

Ці приклади показують, як створювати та надсилати транзакції для виклику програм 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.

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

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

Keypair включає:

  • Публічний ключ, який служить адресою облікового запису
  • Приватний ключ, що використовується для підписання транзакцій
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Перш ніж ми зможемо переказати SOL, обліковий запис відправника повинен мати певний баланс 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 вимагає використання бібліотек @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. Виділення необхідних байтів для зберігання даних mint
  2. Переказу lamports з гаманця для фінансування нового акаунта
  3. Призначення власності акаунта програмі Token Extensions (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.

Створення токена на 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. Виділення необхідних байтів для зберігання даних mint
  2. Переказу lamports з гаманця для фінансування нового акаунта
  3. Призначення власності акаунта програмі Token Extensions (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?

Зміст

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