Запис у мережу
У попередньому розділі ви дізналися, як читати дані з мережі Solana. Тепер ви дізнаєтеся, як записувати дані в неї. Запис у мережу Solana передбачає надсилання транзакцій, які містять одну або кілька інструкцій.
Програми (смарт-контракти) визначають бізнес-логіку для кожної інструкції. Коли ви надсилаєте транзакцію, середовище виконання Solana виконує кожну інструкцію послідовно та атомарно (тобто або всі інструкції успішно виконуються, або вся транзакція не виконується).
Цей розділ охоплює такі приклади:
- Переказ SOL між рахунками
- Створення нового токена
Ці приклади показують, як створювати та надсилати транзакції для виклику програм Solana. Для отримання додаткової інформації зверніться до сторінок Транзакції та інструкції та Комісії в Solana.
Переказ SOL
У цьому прикладі ви дізнаєтеся, як переказувати SOL між двома рахунками.
У Solana кожен рахунок має конкретну програму як свого власника. Тільки програма-власник може зменшувати баланс SOL (lamport) рахунку.
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");
Згенеруйте нові keypair для використання як облікові записи відправника та отримувача.
Keypair
включає:
- Публічний ключ, який служить адресою облікового запису
- Приватний ключ, що використовується для підписання транзакцій
const sender = new Keypair();const receiver = new Keypair();
Перш ніж ми зможемо переказати SOL, обліковий запис відправника повинен мати певний баланс 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 вимагає використання бібліотек @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.
Публічний ключ цього keypair буде використовуватися як адреса для mint account.
const mint = new Keypair();
Обчисліть мінімальну кількість lamports, необхідну для mint account.
Функція getMinimumBalanceForRentExemptMint
обчислює точну кількість SOL (у
lamports), яку потрібно виділити для даних на mint account.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Перша інструкція викликає інструкцію createAccount
System Program для:
- Виділення необхідних байтів для зберігання даних mint
- Переказу lamports з гаманця для фінансування нового акаунта
- Призначення власності акаунта програмі Token Extensions
(
TOKEN_2022_PROGRAM_ID
)
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 десяткових знаки
- Гаманець як орган емісії та орган заморожування
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?