Запис у мережу
У попередньому розділі ви дізналися, як читати дані з мережі Solana. Тепер ви дізнаєтеся, як записувати дані в неї. Запис у мережу Solana передбачає надсилання транзакцій, що містять одну або кілька інструкцій.
Програми визначають бізнес-логіку для того, що робить кожна інструкція. Коли ви надсилаєте транзакцію, середовище виконання Solana виконує кожну інструкцію послідовно та атомарно. Приклади в цьому розділі показують, як створювати та надсилати транзакції для виклику програм Solana, вони включають:
- Переказ SOL між обліковими записами
- Створення нового токена
Переказ SOL
Приклад нижче переказує SOL між двома обліковими записами. Кожен обліковий запис має власну програму, яка є єдиною програмою, що може зменшувати баланс SOL облікового запису.
Усі облікові записи гаманців належать System Program. Щоб переказати SOL, ви повинні викликати інструкцію transfer System Program.
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}`);
Створіть Connection для обробки відправлення транзакцій та отримання даних
рахунку.
У цьому прикладі ми підключаємося до локального тестового validator, який працює
на localhost:8899.
const connection = new Connection("http://localhost:8899", "confirmed");
Згенеруйте нові keypairs для використання як рахунки відправника та отримувача.
const sender = new Keypair();const receiver = new Keypair();
Додайте SOL на рахунок відправника. У мережах, відмінних від основної, ви можете
використовувати метод requestAirdrop для отримання SOL для тестування.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
Метод SystemProgram.transfer() створює інструкцію, яка переказує SOL з рахунку
fromPubkey на рахунок toPubkey для вказаної
кількості lamports.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Створіть транзакцію та додайте інструкцію до транзакції. У цьому прикладі ми створюємо транзакцію з однією інструкцією. Однак ви можете додати кілька інструкцій до однієї транзакції.
const transaction = new Transaction().add(transferInstruction);
Підпишіть та надішліть транзакцію до мережі. Keypair відправника необхідний у масиві підписантів для авторизації переказу SOL з його облікового запису.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
Підпис транзакції є унікальним ідентифікатором, який можна використовувати для пошуку транзакції в Solana Explorer.
Створення токена
Приклад нижче створює новий токен на Solana за допомогою Token Extensions Program. Це вимагає двох інструкцій:
- Виклик System Program для створення нового облікового запису.
- Виклик Token Extensions Program для ініціалізації цього облікового запису як Mint.
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 SOLconst signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");// Generate keypair to use as address of mint accountconst mint = new Keypair();// Calculate lamports required for rent exemptionconst rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);// Instruction to create new account with space for new mint accountconst createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});// Instruction to initialize mint accountconst initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);// Build transaction with instructions to create new account and initialize mint accountconst transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, // payermint // mint address keypair]);console.log("Transaction Signature:", `${transactionSignature}`);const mintData = await getMint(connection,mint.publicKey,"confirmed",TOKEN_2022_PROGRAM_ID););
Створення токена вимагає використання бібліотек @solana/web3.js та
@solana/spl-token. Код у прикладі нижче:
- Створить підключення
- Згенерує keypair для оплати транзакції
- Запитає airdrop для фінансування keypair
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.
const mint = new Keypair();
Обчисліть мінімальну кількість lamports, необхідну для mint account. Функція
getMinimumBalanceForRentExemptMint обчислює, скільки lamport потрібно виділити
для даних на mint account.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Перша інструкція викликає createAccount інструкцію System Program для:
- Виділіть кількість байтів, необхідних для зберігання даних mint-акаунта.
- Переведіть лампорти з гаманця для фінансування нового акаунта.
- Призначте власника акаунта як Token Extensions program.
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 для карбування та заморожування
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Додайте обидві інструкції до однієї транзакції. Це забезпечує атомарність створення та ініціалізації акаунта. (Або обидві інструкції виконуються успішно, або жодна з них.)
Такий підхід є поширеним при створенні складних транзакцій Solana, оскільки він гарантує, що всі інструкції виконуються разом.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Підпишіть та надішліть транзакцію. Потрібні два підписи:
- Гаманець підписує як платник за комісії транзакції та створення акаунта
- Mint-акаунт підписує для авторизації використання своєї адреси для нового акаунта
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
Повернутий підпис транзакції можна використовувати для перегляду транзакції в Solana Explorer.
Is this page helpful?