DEV Community

EgorMajj
EgorMajj

Posted on

Руководство для разработчиков APTOS | Ваш первый COIN | Typescript

В этом руководстве подробно описано, как развернуть и управлять новым Coin. Шаги следующие:

  1. Разверните модуль moon_coin. Назовем его moon_coin.
  2. Инициализируйте MoonCoin с помощью стандартного модуля фреймворка Coin.
  3. Зарегистрируйте аккаунт получателя для получения MoonCoin.
  4. Переведите MoonCoin получателю как владельцу MoonCoin.

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

В этом руководстве мы сосредоточимся на файле first_coin.ts и повторно используем библиотеку first_transaction.ts из предыдущего руководства.

Вы можете найти проект typescript здесь.

Шаг 1. Развертывание модуля moon_coin

Шаг 1.1 Загрузите Aptos-core

Для простоты этого упражнения в Aptos-core есть каталог move-examples, который позволяет легко собирать и тестировать модули Move без загрузки дополнительных ресурсов. Со временем мы расширим этот раздел, чтобы описать, как использовать инструменты Move для разработки.

Пока что загрузите и подготовьте Aptos-core:

git clone https://github.com/aptos-labs/aptos-core.git
cd aptos-core
./scripts/dev_setup.sh
source ~/.cargo/env
git checkout origin/devnet
Enter fullscreen mode Exit fullscreen mode

Установите утилиту командной строки Aptos. Узнайте больше об утилите командной строки Aptos.

cargo install --git https://github.com/aptos-labs/aptos-core.git aptos
Enter fullscreen mode Exit fullscreen mode

Шаг 1.2 Обзор модуля

В этом терминале измените содержимое каталога на aptos-move/move-examples/moon_coin. Сохраните это окно терминала до конца данного руководства - позже мы будем называть его "Окно Move". В этом разделе мы рассмотрим файл sources/MoonCoinType.move.

Этот модуль позволяет пользователям создать новый MoonCoinType::moon_coin::MoonCoin, который может быть использован для регистрации в модуле Coin фреймворка (0x1::coin) для создания стандарта Coin. Разработчики могут написать свои собственные функциональные возможности в модуле moon_coin, если они хотят сделать больше, чем предусмотрено стандартным модулем 0x1::coin или 0x1::managed_coin (добавляет функциональные возможности майнинга/жжения).

module MoonCoinType::moon_coin {
    struct MoonCoin {}
}
Enter fullscreen mode Exit fullscreen mode

Код очень прост, поскольку мы не добавляем в MoonCoin больше функций, чем стандартные, предоставляемые фреймворком Coin (перевод, депозит, вывод, майнинг, сжигание). Наиболее важной частью является struct MoonCoin, который определяет новый тип Coin, которые могут быть зарегистрированы в 0x1::coin.

Шаг 1.3 Развертывание модуля Move, содержащего тип MoonCoin

Для Typescript:

  • Скачайте пример проекта.
  • Откройте ваш любимый терминал и перейдите туда, где вы скачали вышеупомянутый пример проекта.
  • Установите необходимые библиотеки: yarn install
  • Выполните пример: yarn first_coin moon_coin.mv

Шаг 1.4 Проверка вывода

  • Через несколько минут появится сообщение: "Обновить модуль с адресом Alice, собрать, скопировать в указанный путь и нажать Enter."
  • В терминале "Окно Move" и для файла Move, который мы рассматривали ранее:

  • Скопируйте адрес Alice

  • Скомпилируйте модули с адресом Alice с помощью aptos move compile --package-dir . --named-addresses MoonCoinType=0x{аalice_address_here}. Здесь мы заменяем общий именованный адрес MoonCoinType='_' в файле moon_coin/move.toml на адрес Alice.

  • Скопируйте build/Examples/bytecode_modules/MoonCoin.mv в ту же папку, что и код данного руководства проекта

  • Вернитесь в другое окно терминала и нажмите "ввод" в подсказке, чтобы продолжить выполнение оставшейся части кода

Вывод должен выглядеть следующим образом:

=== Addresses ===
Alice: 11c32982d04fbcc79b694647edff88c5b5d5b1a99c9d2854039175facbeefb40
Bob: 7ec8f962139943bc41c17a72e782b7729b1625cf65ed7812152a5677364a4f88

Update the module with Alice's address, build, copy to the provided path, and press enter.
Enter fullscreen mode Exit fullscreen mode

Шаг 2. Инициализация MoonCoin

Модуль moon_coin уже развернут. Следующим шагом будет инициализация MoonCoin. В этом примере мы будем использовать 0x1::managed_coin::initialize, поскольку мы хотим иметь возможность майнить/сжигать наш новый MoonCoin. Это добавляет стандартные функции MoonCoin, такие как передача, майнинг, сжигание и стандартные события (регистрация, депозит, вывод).

const client = new AptosClient(NODE_URL);
/** Initializes the new coin */
async function initializeCoin(accountFrom: AptosAccount, coinTypeAddress: HexString): Promise<string> {
  const token = new TxnBuilderTypes.TypeTagStruct(
    TxnBuilderTypes.StructTag.fromString(`${coinTypeAddress.hex()}::moon_coin::MoonCoin`),
  );

  const serializer = new BCS.Serializer();
  serializer.serializeBool(false);

  const entryFunctionPayload = new TxnBuilderTypes.TransactionPayloadEntryFunction(
    TxnBuilderTypes.EntryFunction.natural(
      "0x1::managed_coin",
      "initialize",
      [token],
      [BCS.bcsSerializeStr("Moon Coin"), BCS.bcsSerializeStr("MOON"), BCS.bcsSerializeUint64(6), serializer.getBytes()],
    ),
  );

  const [{ sequence_number: sequenceNumber }, chainId] = await Promise.all([
    client.getAccount(accountFrom.address()),
    client.getChainId(),
  ]);

  const rawTxn = new TxnBuilderTypes.RawTransaction(
    TxnBuilderTypes.AccountAddress.fromHex(accountFrom.address()),
    BigInt(sequenceNumber),
    entryFunctionPayload,
    1000n,
    1n,
    BigInt(Math.floor(Date.now() / 1000) + 10),
    new TxnBuilderTypes.ChainId(chainId),
  );

  const bcsTxn = AptosClient.generateBCSTransaction(accountFrom, rawTxn);
  const pendingTxn = await client.submitSignedBCSTransaction(bcsTxn);

  return pendingTxn.hash;
}
Enter fullscreen mode Exit fullscreen mode

Шаг 3. Зарегистрируйте учетную запись получателя для получения MoonCoin

В других сетях, поскольку tokens/coins - это просто цифры баланса в контракте, любой может " отправить" любому другому случайный coin, даже если получатель не хочет ее получить. В Aptos пользователь должен явно зарегистрироваться для получения Coin<RandomCoin>, прежде чем она будет ему отправлена.

Чтобы зарегистрироваться, получателю достаточно вызвать 0x1::coins::register<CoinType>:

/** Receiver needs to register the coin before they can receive it */
async function registerCoin(coinReceiver: AptosAccount, coinTypeAddress: HexString): Promise<string> {
  const token = new TxnBuilderTypes.TypeTagStruct(
    TxnBuilderTypes.StructTag.fromString(`${coinTypeAddress.hex()}::moon_coin::MoonCoin`),
  );

  const entryFunctionPayload = new TxnBuilderTypes.TransactionPayloadEntryFunction(
    TxnBuilderTypes.EntryFunction.natural("0x1::coins", "register", [token], []),
  );

  const [{ sequence_number: sequenceNumber }, chainId] = await Promise.all([
    client.getAccount(coinReceiver.address()),
    client.getChainId(),
  ]);

  const rawTxn = new TxnBuilderTypes.RawTransaction(
    TxnBuilderTypes.AccountAddress.fromHex(coinReceiver.address()),
    BigInt(sequenceNumber),
    entryFunctionPayload,
    1000n,
    1n,
    BigInt(Math.floor(Date.now() / 1000) + 10),
    new TxnBuilderTypes.ChainId(chainId),
  );

  const bcsTxn = AptosClient.generateBCSTransaction(coinReceiver, rawTxn);
  const pendingTxn = await client.submitSignedBCSTransaction(bcsTxn);

  return pendingTxn.hash;
}
Enter fullscreen mode Exit fullscreen mode

Шаг 4. Перевести MoonCoin получателю как владельцу MoonCoin

При инициализации нового Coin (шаг 2), учетная запись-владелец получает возможности для майнинга/сожжения нового Coin. Учетная запись владельца может майнить MoonCoin, вызывая 0x1::managed_coin::mint.

/** Mints the newly created coin to a specified receiver address */
async function mintCoin(
  coinOwner: AptosAccount,
  coinTypeAddress: HexString,
  receiverAddress: HexString,
  amount: number,
): Promise<string> {
  const token = new TxnBuilderTypes.TypeTagStruct(
    TxnBuilderTypes.StructTag.fromString(`${coinTypeAddress.hex()}::moon_coin::MoonCoin`),
  );

  const entryFunctionPayload = new TxnBuilderTypes.TransactionPayloadEntryFunction(
    TxnBuilderTypes.EntryFunction.natural(
      "0x1::managed_coin",
      "mint",
      [token],
      [BCS.bcsToBytes(TxnBuilderTypes.AccountAddress.fromHex(receiverAddress.hex())), BCS.bcsSerializeUint64(amount)],
    ),
  );

  const [{ sequence_number: sequenceNumber }, chainId] = await Promise.all([
    client.getAccount(coinOwner.address()),
    client.getChainId(),
  ]);

  const rawTxn = new TxnBuilderTypes.RawTransaction(
    TxnBuilderTypes.AccountAddress.fromHex(coinOwner.address()),
    BigInt(sequenceNumber),
    entryFunctionPayload,
    1000n,
    1n,
    BigInt(Math.floor(Date.now() / 1000) + 10),
    new TxnBuilderTypes.ChainId(chainId),
  );

  const bcsTxn = AptosClient.generateBCSTransaction(coinOwner, rawTxn);
  const pendingTxn = await client.submitSignedBCSTransaction(bcsTxn);
  return pendingTxn.hash;
}
Enter fullscreen mode Exit fullscreen mode

Шаг 5. Проверьте баланс MoonCoin у Boba

/** Return the balance of the newly created coin */
async function getBalance(accountAddress: MaybeHexString, coinTypeAddress: HexString): Promise<string | number> {
  try {
    const resource = await client.getAccountResource(
      accountAddress,
      `0x1::coin::CoinStore<${coinTypeAddress.hex()}::moon_coin::MoonCoin>`,
    );

    return parseInt((resource.data as any)["coin"]["value"]);
  } catch (_) {
    return 0;
  }
}
Enter fullscreen mode Exit fullscreen mode

Данные можно проверить, посетив либо REST-интерфейс, либо Explorer:

  • Учетная запись Alice через интерфейс Aptos REST.
  • Учетная запись Bob через Aptos Explorer.

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay