Запись в сеть

В предыдущем разделе вы узнали, как считывать данные из сети Solana. Теперь изучите, как записывать данные в неё. Запись в сеть Solana включает отправку транзакций, содержащих одну или несколько инструкций.

Программы (смарт-контракты) обрабатывают эти инструкции в соответствии с их бизнес-логикой для каждой конкретной инструкции. Когда вы отправляете транзакцию, среда выполнения Solana выполняет каждую инструкцию последовательно и атомарно (то есть либо все инструкции выполняются успешно, либо вся транзакция отклоняется).

В этом разделе вы увидите два базовых примера:

  1. Перевод SOL между аккаунтами
  2. Создание нового токена

Эти примеры показывают, как создавать и отправлять транзакции для вызова программ Solana. Для получения дополнительной информации обратитесь к страницам Транзакции и инструкции и Комиссии в Solana.

Перевод SOL

В этом примере вы узнаете, как перевести SOL между двумя аккаунтами.

В Solana у каждого аккаунта есть определённая программа, которая является его владельцем. Только программа-владелец может списывать баланс SOL (lamport) с аккаунта.

System Program является владельцем всех "кошельковых" аккаунтов. Чтобы перевести SOL, вы должны вызвать инструкцию transfer программы System Program.

Transfer SOL
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.

Создайте инструкцию, которую вы хотите вызвать.

Instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});

Добавьте инструкцию в транзакцию:

Transaction
const transaction = new Transaction().add(transferInstruction);

Подпишите и отправьте транзакцию:

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender] // signer keypair
);

Создание токена

В этом примере вы узнаете, как создать новый токен на Solana с использованием Token Extensions Program. Это требует двух инструкций:

  1. Вызовите System Program для создания нового аккаунта.
  2. Вызовите Token Extensions Program для инициализации этого аккаунта как Mint.
Create Mint Account
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 SOL
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
// Generate keypair to use as address of mint account
const mint = new Keypair();
// Calculate lamports required for rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);
// Instruction to create new account with space for new mint account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});
// Instruction to initialize mint account
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);
// Build transaction with instructions to create new account and initialize mint account
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet, // payer
mint // mint address keypair
]
);
console.log("Mint Account:", `${mint.publicKey}`);
console.log("Transaction Signature:", `${transactionSignature}`);

Вот пошаговый разбор того, что делает пример:

Создайте соединение и пополните кошелек

Connection and Wallet
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 Keypair
const mint = new Keypair();

Рассчитайте минимальное количество lamports для освобождения от аренды

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Создайте инструкцию для создания нового аккаунта

  1. Выделите необходимое пространство для хранения данных mint
  2. Переведите lamports с кошелька для финансирования нового аккаунта
  3. Назначьте владельца аккаунта программе Token Extensions (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});

Создайте инструкцию для инициализации аккаунта Mint

Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);

Добавьте обе инструкции в транзакцию

Build Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

Отправьте и подтвердите транзакцию с двумя необходимыми подписантами

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[wallet, mint]
);

Выведите аккаунт Mint и подпись транзакции

Output
console.log("Mint Account:", `${mint.publicKey}`);
console.log("Transaction Signature:", `${transactionSignature}`);

Объединяя обе инструкции в одну транзакцию, вы гарантируете, что создание и инициализация аккаунта происходят атомарно. Либо обе инструкции выполняются успешно, либо ни одна из них. Такой подход часто используется при создании более сложных транзакций в Solana, так как он гарантирует выполнение всех инструкций вместе.

Is this page helpful?

Содержание

Редактировать страницу