Запис у мережу
У попередньому розділі ви дізналися, як читати дані з мережі 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}`);
Це кроки для створення транзакцій для взаємодії з будь-якою програмою на Solana.
Створіть інструкцію, яку ви хочете викликати.
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] // signer keypair);
Створення токена
У цьому прикладі ви дізнаєтеся, як створити новий токен на 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} 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("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
Ось покроковий розбір того, що робить приклад:
Створіть підключення та поповніть гаманець
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
const mint = new Keypair();
Розрахуйте мінімальну кількість lamports для звільнення від rent
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Створіть інструкцію для створення нового облікового запису
- Виділіть необхідний простір для зберігання даних 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});
Створіть інструкцію для ініціалізації Mint account
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);
Додайте обидві інструкції до транзакції
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Надішліть та підтвердіть транзакцію з обома необхідними підписантами
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, mint]);
Виведіть Mint account та підпис транзакції
console.log("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
Об'єднуючи обидві інструкції в одну транзакцію, ви забезпечуєте атомарність створення облікового запису та його ініціалізації. Або обидві інструкції виконуються успішно, або жодна з них. Цей підхід є поширеним при побудові більш складних транзакцій Solana, оскільки він гарантує, що всі інструкції виконуються разом.
Is this page helpful?