Запись в сеть
В предыдущем разделе вы узнали, как читать данные из сети 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 для обработки отправки транзакций и получения данных
аккаунта.
В этом примере мы подключаемся к локальному тестовому валидатору, который
работает на localhost:8899.
const connection = new Connection("http://localhost:8899", "confirmed");
Сгенерируйте новые ключевые пары, которые будут использоваться в качестве аккаунтов отправителя и получателя.
const sender = new Keypair();const receiver = new Keypair();
Добавьте SOL на аккаунт отправителя. В сетях, отличных от mainnet, вы можете
использовать метод 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);
Подпишите и отправьте транзакцию в сеть. Для авторизации перевода SOL с их аккаунта в массиве подписантов требуется ключевая пара отправителя.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
Подпись транзакции — это уникальный идентификатор, который можно использовать для поиска транзакции в Solana Explorer.
Создание токена
Пример ниже создаёт новый токен в Solana с использованием программы Token Extensions. Это требует выполнения двух инструкций:
- Вызовите 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 аккаунта. Публичный ключ будет использоваться как адрес mint аккаунта.
const mint = new Keypair();
Рассчитайте минимальное количество lamports, необходимое для mint аккаунта.
Функция getMinimumBalanceForRentExemptMint вычисляет, сколько lamports должно
быть выделено для данных на mint аккаунте.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Первая инструкция вызывает инструкцию createAccount из System Program для:
- Выделите количество байтов, необходимое для хранения данных mint.
- Переведите лампорты из кошелька для финансирования нового аккаунта.
- Назначьте владельца аккаунта программе Token Extensions.
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
аккаунта со следующими данными:
- 2 десятичных знака
- Кошелёк как mint authority и freeze 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?