Запись в сеть
В предыдущем разделе вы узнали, как читать данные из сети 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();
Рассчитайте минимальное количество lamport для освобождения от rent
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Создайте инструкцию для создания нового аккаунта
- Выделите необходимое пространство для хранения данных минта
- Переведите 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?