Руководство для разработчиков APTOS | Ваш первый COIN | Typescript
Tags: blockchain, tutorial, aptos, developer
Published: 2022-08-23 14:19:55

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

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

Это руководство основывается на [вашей первой транзакции](https://dev.to/egormajj/rukovodstvo-dlia-razrabotchikov-aptos-vasha-piervaia-tranzaktsiia-8fk) в качестве библиотеки для данного примера. Следующее руководство содержит код примера, который можно скачать полностью ниже:

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

Вы можете найти проект typescript [здесь](https://github.com/aptos-labs/aptos-core/tree/main/developer-docs-site/static/examples/typescript).

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

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

Для простоты этого упражнения в Aptos-core есть каталог `move-examples`, который позволяет легко собирать и тестировать модули Move без загрузки дополнительных ресурсов. Со временем мы расширим этот раздел, чтобы описать, как использовать инструменты [Move](https://aptos.dev/tutorials/your-first-coin#:~:text=how%20to%20leverage-,Move,-tools%20for%20development) для разработки.

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

```javascript 
git clone https://github.com/aptos-labs/aptos-core.git
cd aptos-core
./scripts/dev_setup.sh
source ~/.cargo/env
git checkout origin/devnet
```
Установите утилиту командной строки Aptos. Узнайте больше об [утилите командной строки Aptos](https://aptos.dev/tutorials/your-first-coin#:~:text=more%20about%20the-,Aptos%20command%20line%20tool,-.).

```javascript
cargo install --git https://github.com/aptos-labs/aptos-core.git aptos
```
**Шаг 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` (добавляет функциональные возможности майнинга/жжения).

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

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

Для Typescript:

- Скачайте [пример проекта](https://aptos.dev/tutorials/your-first-coin#:~:text=Download%20the-,example%20project,-.).
- Откройте ваш любимый терминал и перейдите туда, где вы скачали вышеупомянутый пример проекта.
- Установите необходимые библиотеки: `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.
```

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

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

```javascript
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;
}
```

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

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

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

```javascript
/** 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;
}
```

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

```javascript
/** 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;
}
```
Шаг 5. Проверьте баланс MoonCoin у Boba

```javascript
/** 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;
  }
}
```
Данные можно проверить, посетив либо REST-интерфейс, либо Explorer:

- Учетная запись Alice через интерфейс [Aptos REST](https://aptos.dev/tutorials/your-first-coin#:~:text=account%20via%20the-,REST%20interface,-.).
- Учетная запись Bob через [Aptos Explorer](https://aptos.dev/tutorials/your-first-coin#:~:text=account%20on%20the-,explorer,-.).