Запись в сеть

В предыдущем разделе вы узнали, как считывать данные из сети 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}`);
const senderBalance = await connection.getBalance(sender.publicKey);
const receiverBalance = await connection.getBalance(receiver.publicKey);
console.log("Sender Balance:", `${senderBalance}`);
console.log("Receiver Balance:", `${receiverBalance}`);
Console
Click to execute the code.

Создайте Connection для обработки отправки транзакций и получения данных аккаунта.

В этом примере мы подключаемся к локальному тестовому валидатору, который работает на localhost:8899.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Сгенерируйте новые keypair для использования в качестве аккаунтов отправителя и получателя.

Keypair включает:

  • Публичный ключ, который служит адресом аккаунта
  • Приватный ключ, используемый для подписания транзакций
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Прежде чем мы сможем перевести SOL, на аккаунте отправителя должен быть баланс SOL.

На сетях, отличных от mainnet, вы можете использовать метод requestAirdrop для получения SOL для тестирования.

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Метод SystemProgram.transfer() создаёт инструкцию, которая переводит SOL с аккаунта fromPubkey на аккаунт toPubkey на указанную сумму lamports.

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

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

В этом примере мы создаём транзакцию с одной инструкцией. Однако вы можете добавить несколько инструкций в одну транзакцию.

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

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

Для авторизации перевода SOL с аккаунта отправителя требуется ключевая пара отправителя в массиве подписантов.

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

Подпись транзакции — это уникальный идентификатор, который можно использовать для поиска транзакции в Solana Explorer.

Создайте Connection для обработки отправки транзакций и получения данных аккаунта.

В этом примере мы подключаемся к локальному тестовому валидатору, который работает на localhost:8899.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Сгенерируйте новые keypair для использования в качестве аккаунтов отправителя и получателя.

Keypair включает:

  • Публичный ключ, который служит адресом аккаунта
  • Приватный ключ, используемый для подписания транзакций
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Прежде чем мы сможем перевести SOL, на аккаунте отправителя должен быть баланс SOL.

На сетях, отличных от mainnet, вы можете использовать метод requestAirdrop для получения SOL для тестирования.

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Метод SystemProgram.transfer() создаёт инструкцию, которая переводит SOL с аккаунта fromPubkey на аккаунт toPubkey на указанную сумму lamports.

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

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

В этом примере мы создаём транзакцию с одной инструкцией. Однако вы можете добавить несколько инструкций в одну транзакцию.

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

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

Для авторизации перевода SOL с аккаунта отправителя требуется ключевая пара отправителя в массиве подписантов.

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

Подпись транзакции — это уникальный идентификатор, который можно использовать для поиска транзакции в Solana Explorer.

Transfer SOL
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
Connection
} from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");

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

В этом примере вы узнаете, как создать новый токен в 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,
getMint
} 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("Transaction Signature:", `${transactionSignature}`);
const mintData = await getMint(
connection,
mint.publicKey,
"confirmed",
TOKEN_2022_PROGRAM_ID
);
);
Console
Click to execute the code.

Создание токена в Solana требует использования библиотек @solana/web3.js и @solana/spl-token.

  • Создайте соединение
  • Создайте пару ключей для оплаты транзакции
  • Запросите airdrop для финансирования пары ключей
Connection & Wallet Setup
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");

Создайте пару ключей для mint аккаунта.

Публичный ключ этой пары ключей будет использоваться в качестве адреса для mint аккаунта.

Mint Keypair
const mint = new Keypair();

Рассчитайте минимальное количество lamports, необходимое для mint аккаунта.

Функция getMinimumBalanceForRentExemptMint точно рассчитывает, сколько SOL (в lamports) должно быть выделено для данных на mint аккаунте.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Первая инструкция вызывает инструкцию createAccount из System Program для выполнения следующих действий:

  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
});

Вторая инструкция вызывает инструкцию createInitializeMint2Instruction из Token Extensions Program для инициализации mint аккаунта с следующими данными:

  • 2 десятичных знака
  • Кошелек в качестве mint authority и freeze authority
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

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

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

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

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

Подпишите и отправьте транзакцию. Требуются две подписи:

  • Wallet подписывает как плательщик за транзакционные сборы и создание аккаунта
  • Mint подписывает для авторизации использования своего адреса для нового аккаунта
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

Возвращённая подпись транзакции может быть использована для проверки транзакции в Solana Explorer.

Создание токена в Solana требует использования библиотек @solana/web3.js и @solana/spl-token.

  • Создайте соединение
  • Создайте пару ключей для оплаты транзакции
  • Запросите airdrop для финансирования пары ключей
Connection & Wallet Setup
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");

Создайте пару ключей для mint аккаунта.

Публичный ключ этой пары ключей будет использоваться в качестве адреса для mint аккаунта.

Mint Keypair
const mint = new Keypair();

Рассчитайте минимальное количество lamports, необходимое для mint аккаунта.

Функция getMinimumBalanceForRentExemptMint точно рассчитывает, сколько SOL (в lamports) должно быть выделено для данных на mint аккаунте.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Первая инструкция вызывает инструкцию createAccount из System Program для выполнения следующих действий:

  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
});

Вторая инструкция вызывает инструкцию createInitializeMint2Instruction из Token Extensions Program для инициализации mint аккаунта с следующими данными:

  • 2 десятичных знака
  • Кошелек в качестве mint authority и freeze authority
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

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

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

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

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

Подпишите и отправьте транзакцию. Требуются две подписи:

  • Wallet подписывает как плательщик за транзакционные сборы и создание аккаунта
  • Mint подписывает для авторизации использования своего адреса для нового аккаунта
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

Возвращённая подпись транзакции может быть использована для проверки транзакции в Solana Explorer.

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,
getMint
} from "@solana/spl-token";
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");

Is this page helpful?

Содержание

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