Запись в сеть

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

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

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

Перевод SOL

Пример ниже показывает перевод SOL между двумя аккаунтами. Каждый аккаунт имеет программу-владельца, которая является единственной программой, способной списать баланс SOL с аккаунта.

Все кошельковые аккаунты принадлежат 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");

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

Generate keypairs
const sender = new Keypair();
const receiver = new Keypair();

Добавьте 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");

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

Generate keypairs
const sender = new Keypair();
const receiver = new Keypair();

Добавьте 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. Это требует выполнения двух инструкций:

  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/web3.js и @solana/spl-token. Код в примере ниже выполнит следующие действия:

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

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

Mint keypair
const mint = new Keypair();

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

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

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

  1. Выделите количество байтов, необходимое для хранения данных mint.
  2. Переведите лампорты из кошелька для финансирования нового аккаунта.
  3. Назначьте владельца аккаунта программе Token Extensions.
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
);

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

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

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

Создание токена требует использования библиотек @solana/web3.js и @solana/spl-token. Код в примере ниже выполнит следующие действия:

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

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

Mint keypair
const mint = new Keypair();

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

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

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

  1. Выделите количество байтов, необходимое для хранения данных mint.
  2. Переведите лампорты из кошелька для финансирования нового аккаунта.
  3. Назначьте владельца аккаунта программе Token Extensions.
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
);

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

  • Кошелёк подписывает как плательщик за комиссии за транзакцию и создание аккаунта
  • 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?

Содержание

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