Запись в сеть
В предыдущем разделе вы узнали, как считывать данные из сети 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
const mint = new Keypair();
Рассчитайте минимальное количество lamports для освобождения от аренды
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
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 и подпись транзакции
console.log("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
Объединяя обе инструкции в одну транзакцию, вы гарантируете, что создание и инициализация аккаунта происходят атомарно. Либо обе инструкции выполняются успешно, либо ни одна из них. Такой подход часто используется при создании более сложных транзакций в Solana, так как он гарантирует выполнение всех инструкций вместе.
Is this page helpful?