Запись в сеть

В предыдущем разделе вы узнали, как читать данные из сети 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}`);
Click to execute the code.

Это шаги для создания транзакций для взаимодействия с любой программой в 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}`);
Click to execute the code.

Вот пошаговое объяснение того, что делает пример:

Создать подключение и пополнить кошелек

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 account

Mint Keypair
const mint = new Keypair();

Рассчитайте минимальное количество lamport для освобождения от rent

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

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

  1. Выделите необходимое пространство для хранения данных минта
  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 account

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 account и подпись транзакции

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

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

Is this page helpful?

Содержание

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