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.

Top comments (0)