Перейти к содержимому

Ваша Первая Транзакция

Транзакции - это основной способ изменения данных в блокчейне Aptos. Думайте о них как об отправке посылки: вам нужно указать что вы отправляете, кому, а затем отслеживать до подтверждения доставки. В терминах блокчейна транзакции позволяют переводить монеты, вызывать функции смарт-контрактов и обновлять состояние на блокчейне.

Этот учебник проведет вас через создание и отправку вашей первой транзакции в блокчейне Aptos. Вы узнаете как:

  1. Настроить среду разработки
  2. Создать тестовые аккаунты и профинансировать их
  3. Построить транзакцию для перевода монет
  4. Симулировать транзакцию для оценки затрат
  5. Подписать и отправить транзакцию
  6. Проверить успешное выполнение транзакции

Прежде чем мы сможем создавать транзакции, нам нужно настроить среду разработки с необходимыми инструментами и SDK.

  1. Установить TypeScript SDK

    Установите TypeScript SDK, используя ваш предпочитаемый менеджер пакетов:

    Окно терминала
    npm install @aptos-labs/ts-sdk
  2. Создать директорию проекта

    Создайте новую директорию для вашего проекта:

    Окно терминала
    mkdir my-first-transaction
    cd my-first-transaction
  3. Создать новый файл

    Создайте новый файл с именем transaction.ts:

    Окно терминала
    touch transaction.ts
  4. Добавить базовые импорты

    Откройте transaction.ts в вашем редакторе и добавьте базовые импорты:

    import {
    Account,
    Aptos,
    AptosConfig,
    Network,
    } from "@aptos-labs/ts-sdk";
    // Настройка для подключения к Aptos devnet
    const config = new AptosConfig({ network: Network.DEVNET });
    const aptos = new Aptos(config);
    console.log("Подключено к Aptos devnet");

Прежде чем отправлять транзакции, нам нужны аккаунты. В блокчейне Aptos каждый аккаунт имеет уникальный адрес и может хранить APT (нативная валюта) и другие активы.

async function main() {
console.log("=== Создание аккаунтов ===");
// Создать два новых аккаунта
const alice = Account.generate();
const bob = Account.generate();
console.log(`Адрес Alice: ${alice.accountAddress}`);
console.log(`Адрес Bob: ${bob.accountAddress}`);
// Финансировать аккаунты APT из faucet
console.log("\n=== Финансирование аккаунтов ===");
await aptos.fundAccount({
accountAddress: alice.accountAddress,
amount: 100_000_000, // 1 APT = 100,000,000 Octas
});
await aptos.fundAccount({
accountAddress: bob.accountAddress,
amount: 100_000_000,
});
console.log("Аккаунты успешно профинансированы!");
// Проверить начальные балансы
const aliceBalance = await aptos.getAccountAPTAmount({
accountAddress: alice.accountAddress,
});
const bobBalance = await aptos.getAccountAPTAmount({
accountAddress: bob.accountAddress,
});
console.log(`Баланс Alice: ${aliceBalance} octas`);
console.log(`Баланс Bob: ${bobBalance} octas`);
return { alice, bob };
}
// Запустить основную функцию
main().catch(console.error);

Теперь давайте создадим транзакцию для перевода APT от Alice к Bob. Мы переведем 1 APT (100,000,000 octas).

async function createTransaction(alice: Account, bob: Account) {
console.log("\n=== Создание транзакции ===");
const transferAmount = 100_000_000; // 1 APT в octas
// Построить транзакцию
const transaction = await aptos.transaction.build.simple({
sender: alice.accountAddress,
data: {
function: "0x1::aptos_account::transfer",
functionArguments: [bob.accountAddress, transferAmount],
},
});
console.log("Транзакция создана:");
console.log(` Отправитель: ${alice.accountAddress}`);
console.log(` Получатель: ${bob.accountAddress}`);
console.log(` Сумма: ${transferAmount} octas (1 APT)`);
return transaction;
}

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

async function simulateTransaction(alice: Account, transaction: any) {
console.log("\n=== Симуляция транзакции ===");
// Симулировать транзакцию
const simulation = await aptos.transaction.simulate.simple({
signerPublicKey: alice.publicKey,
transaction,
});
const simulationResult = simulation[0];
console.log("Результаты симуляции:");
console.log(` Использовано газа: ${simulationResult.gas_used} единиц`);
console.log(` Успех: ${simulationResult.success}`);
console.log(` VM статус: ${simulationResult.vm_status}`);
if (!simulationResult.success) {
throw new Error(`Симуляция не удалась: ${simulationResult.vm_status}`);
}
// Оценить стоимость газа
const gasUsed = parseInt(simulationResult.gas_used);
const gasPrice = 100; // цена за единицу газа
const estimatedCost = gasUsed * gasPrice;
console.log(` Оценочная стоимость: ${estimatedCost} octas`);
return simulationResult;
}

Теперь подпишем транзакцию и отправим её в блокчейн.

async function submitTransaction(alice: Account, transaction: any) {
console.log("\n=== Подписание и отправка транзакции ===");
// Подписать и отправить транзакцию
const committedTransaction = await aptos.signAndSubmitTransaction({
signer: alice,
transaction,
});
console.log(`Транзакция отправлена! Хеш: ${committedTransaction.hash}`);
// Дождаться подтверждения транзакции
console.log("Ожидание подтверждения...");
const executedTransaction = await aptos.waitForTransaction({
transactionHash: committedTransaction.hash,
});
console.log("Транзакция подтверждена!");
console.log(` Статус: ${executedTransaction.success ? 'Успех' : 'Неудача'}`);
console.log(` Использовано газа: ${executedTransaction.gas_used} единиц`);
console.log(` Версия: ${executedTransaction.version}`);
return executedTransaction;
}

Наконец, давайте проверим обновленные балансы для подтверждения успешного перевода.

async function checkBalances(alice: Account, bob: Account) {
console.log("\n=== Финальные балансы ===");
const aliceBalance = await aptos.getAccountAPTAmount({
accountAddress: alice.accountAddress,
});
const bobBalance = await aptos.getAccountAPTAmount({
accountAddress: bob.accountAddress,
});
console.log(`Баланс Alice: ${aliceBalance} octas`);
console.log(`Баланс Bob: ${bobBalance} octas`);
// Проверить, что перевод произошел
const expectedAliceBalance = 100_000_000 - 100_000_000; // Минус переведенная сумма и газ
const expectedBobBalance = 100_000_000 + 100_000_000; // Плюс полученная сумма
console.log("\n=== Проверка перевода ===");
console.log(`Bob получил 1 APT: ${bobBalance >= expectedBobBalance ? '' : ''}`);
console.log(`Alice отправила 1 APT (плюс газ): ${aliceBalance < 100_000_000 ? '' : ''}`);
}

Вот полный рабочий пример:

import {
Account,
Aptos,
AptosConfig,
Network,
} from "@aptos-labs/ts-sdk";
// Настройка для подключения к Aptos devnet
const config = new AptosConfig({ network: Network.DEVNET });
const aptos = new Aptos(config);
async function main() {
try {
console.log("🚀 Начинаем ваш первый урок по транзакциям Aptos!");
// 1. Создать и профинансировать аккаунты
console.log("\n=== Шаг 1: Создание аккаунтов ===");
const alice = Account.generate();
const bob = Account.generate();
console.log(`Адрес Alice: ${alice.accountAddress}`);
console.log(`Адрес Bob: ${bob.accountAddress}`);
console.log("\n=== Финансирование аккаунтов ===");
await aptos.fundAccount({
accountAddress: alice.accountAddress,
amount: 100_000_000,
});
await aptos.fundAccount({
accountAddress: bob.accountAddress,
amount: 100_000_000,
});
console.log("✅ Аккаунты профинансированы!");
// 2. Проверить начальные балансы
console.log("\n=== Шаг 2: Начальные балансы ===");
const aliceInitialBalance = await aptos.getAccountAPTAmount({
accountAddress: alice.accountAddress,
});
const bobInitialBalance = await aptos.getAccountAPTAmount({
accountAddress: bob.accountAddress,
});
console.log(`Alice: ${aliceInitialBalance} octas`);
console.log(`Bob: ${bobInitialBalance} octas`);
// 3. Создать транзакцию
console.log("\n=== Шаг 3: Создание транзакции ===");
const transferAmount = 100_000_000; // 1 APT
const transaction = await aptos.transaction.build.simple({
sender: alice.accountAddress,
data: {
function: "0x1::aptos_account::transfer",
functionArguments: [bob.accountAddress, transferAmount],
},
});
console.log(`✅ Транзакция создана для перевода ${transferAmount} octas`);
// 4. Симулировать транзакцию
console.log("\n=== Шаг 4: Симуляция транзакции ===");
const simulation = await aptos.transaction.simulate.simple({
signerPublicKey: alice.publicKey,
transaction,
});
console.log(`Оценка газа: ${simulation[0].gas_used} единиц`);
console.log(`Успех симуляции: ${simulation[0].success}`);
// 5. Подписать и отправить
console.log("\n=== Шаг 5: Отправка транзакции ===");
const committedTransaction = await aptos.signAndSubmitTransaction({
signer: alice,
transaction,
});
console.log(`✅ Транзакция отправлена: ${committedTransaction.hash}`);
// 6. Дождаться подтверждения
console.log("\n=== Шаг 6: Ожидание подтверждения ===");
const executedTransaction = await aptos.waitForTransaction({
transactionHash: committedTransaction.hash,
});
console.log(`✅ Транзакция подтверждена! Газ: ${executedTransaction.gas_used}`);
// 7. Проверить финальные балансы
console.log("\n=== Шаг 7: Финальные балансы ===");
const aliceFinalBalance = await aptos.getAccountAPTAmount({
accountAddress: alice.accountAddress,
});
const bobFinalBalance = await aptos.getAccountAPTAmount({
accountAddress: bob.accountAddress,
});
console.log(`Alice: ${aliceFinalBalance} octas`);
console.log(`Bob: ${bobFinalBalance} octas`);
console.log("\n🎉 Поздравляем! Вы успешно создали и отправили свою первую транзакцию Aptos!");
console.log(`📊 Сводка: Alice отправила ${transferAmount} octas Bob'у`);
console.log(`💰 Изменение баланса Alice: ${aliceFinalBalance - aliceInitialBalance} octas`);
console.log(`💰 Изменение баланса Bob: ${bobFinalBalance - bobInitialBalance} octas`);
} catch (error) {
console.error("❌ Ошибка:", error);
}
}
// Запустить пример
main();
Окно терминала
# Установить зависимости
npm install @aptos-labs/ts-sdk typescript ts-node
# Запустить пример
npx ts-node transaction.ts

Вы должны увидеть вывод, похожий на:

🚀 Начинаем ваш первый урок по транзакциям Aptos!
=== Шаг 1: Создание аккаунтов ===
Адрес Alice: 0x123...
Адрес Bob: 0x456...
✅ Аккаунты профинансированы!
=== Шаг 2: Начальные балансы ===
Alice: 100000000 octas
Bob: 100000000 octas
=== Шаг 3: Создание транзакции ===
✅ Транзакция создана для перевода 100000000 octas
=== Шаг 4: Симуляция транзакции ===
Оценка газа: 1372 единиц
Успех симуляции: true
=== Шаг 5: Отправка транзакции ===
✅ Транзакция отправлена: 0xabc...
=== Шаг 6: Ожидание подтверждения ===
✅ Транзакция подтверждена! Газ: 1372
=== Шаг 7: Финальные балансы ===
Alice: 99861200 octas
Bob: 200000000 octas
🎉 Поздравляем! Вы успешно создали и отправили свою первую транзакцию Aptos!

Поздравляем! Вы успешно создали и отправили свою первую транзакцию в блокчейне Aptos. Вот некоторые темы для дальнейшего изучения:

  1. Создание смарт-контрактов - Научитесь писать и разворачивать контракты Move
  2. Создание dApps - Создайте полноценное децентрализованное приложение
  3. Работа с токенами - Изучите создание и управление пользовательскими токенами
  4. NFT разработка - Создавайте и торгуйте цифровыми активами

Ошибка финансирования аккаунта

Error: Failed to fund account
  • Убедитесь, что вы подключены к правильной сети (devnet)
  • Попробуйте еще раз через несколько секунд
  • Проверьте подключение к интернету

Недостаточный баланс для газа

Error: INSUFFICIENT_BALANCE_FOR_TRANSACTION_FEE
  • Убедитесь, что у аккаунта достаточно APT для оплаты газа
  • Профинансируйте аккаунт больше APT из faucet

Неверная последовательность транзакции

Error: SEQUENCE_NUMBER_TOO_OLD
  • Убедитесь, что используете текущий номер последовательности аккаунта
  • Попробуйте создать транзакцию заново

Если у вас возникли проблемы:

  1. Проверьте документацию по API
  2. Присоединитесь к сообществу Discord
  3. Изучите примеры в GitHub

Удачного создания на Aptos! 🚀