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

У попередньому розділі ви дізналися, як читати дані з мережі 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}`);
Console
Click to execute the code.

Це кроки для створення транзакцій для взаємодії з будь-якою програмою на Solana.

Створіть інструкцію, яку ви хочете викликати.

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

Додайте інструкцію до транзакції:

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

Підпишіть та надішліть транзакцію:

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

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

У цьому прикладі ви дізнаєтеся, як створити новий токен на 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
} 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("Mint Account:", `${mint.publicKey}`);
console.log("Transaction Signature:", `${transactionSignature}`);
Console
Click to execute the code.

Ось покроковий розбір того, що робить приклад:

Створіть підключення та поповніть гаманець

Connection and Wallet
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 Keypair
const mint = new Keypair();

Розрахуйте мінімальну кількість lamports для звільнення від rent

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Створіть інструкцію для створення нового облікового запису

  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
});

Створіть інструкцію для ініціалізації Mint account

Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);

Додайте обидві інструкції до транзакції

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

Надішліть та підтвердіть транзакцію з обома необхідними підписантами

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

Виведіть Mint account та підпис транзакції

Output
console.log("Mint Account:", `${mint.publicKey}`);
console.log("Transaction Signature:", `${transactionSignature}`);

Об'єднуючи обидві інструкції в одну транзакцію, ви забезпечуєте атомарність створення облікового запису та його ініціалізації. Або обидві інструкції виконуються успішно, або жодна з них. Цей підхід є поширеним при побудові більш складних транзакцій Solana, оскільки він гарантує, що всі інструкції виконуються разом.

Is this page helpful?

Зміст

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