Ваша первая монета

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

  1. Разверните модуль MoonCoin. Будем называть его MoonCoin.

  2. Инициализируйте MoonCoin через стандартный модуль фреймворка Coin.

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

  4. Создайте MoonCoin получателю как владелец MoonCoin.

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

В этом руководстве основное внимание будет уделено first_coin.py и повторному использованию библиотекиfirst_transaction.py из предыдущего руководства.

Вы найдете python project здесь

Шаг 1) Разверните модуль MoonCoin

Шаг 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

Установите Aptos Commandline tool. См. подробнее Aptos command line tool

cargo install --git https://github.com/aptos-labs/aptos-core.git aptos

Шаг 1.2) Просмотрите модуль

В этом терминале измените каталоги на aptos-move/move-examples/moon_coin. Сохраните это окно терминала до конца руководства - в дальнейшем мы будем называть его «Move Window». В оставшейся части этого раздела будет рассмотрен файл sources/MoonCoinType.move.

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

module MoonCoinType::MoonCoin {
    struct MoonCoin {}
}

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

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

Для Python3:

  • Загрузите example project

  • Откройте свой любимый терминал и перейдите туда, куда вы загрузили приведенный выше пример проекта.

  • Установите необходимые библиотеки: pip3 install -r requirements.txt.

  • Выполните пример: python3 first_coin.py MoonCoin.mv

Шаг 1.4) Проверка результата выполнения

  • Через несколько секунд вы увидите сообщение «Обновите модуль с адресом Алисы, создайте, скопируйте указанный путь и нажмите enter».

  • В терминале «Move Window» и для файла Move, который мы ранее рассматривали:

    • Скопируйте адрес Алисы

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

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

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

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

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

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

Шаг 2) Инициализируйте MoonCoin

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

    def initialize_coin(self, account_from: Account) -> Optional[str]:
        """ Initialize a new coin with the given coin type. """
        payload = {
            "type": "script_function_payload",
            "function": "0x1::ManagedCoin::initialize",
            "type_arguments": [f"0x{account_from.address()}::MoonCoin::MoonCoin"],
            "arguments": [
                "Moon Coin".encode("utf-8").hex(),
                "MOON".encode("utf-8").hex(),
                "6",
                False
            ]
        }
        res = self.execute_transaction_with_payload(account_from, payload)
        return str(res["hash"])

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

В других сетях, поскольку токены/монеты — это просто номера баланса в контракте, любой может «отправить» кому угодно случайную монету, даже если получатель этого не хочет. В Aptos пользователь должен зарегистрироваться для получения Coin<RandomCoin> , прежде чем ее можно будет ему отправить.

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

    def register_coin(self, account_receiver: Account, coin_type_address: str) -> str:
        """ Register the receiver account to receive transfers for the new coin. """

        payload = {
            "type": "script_function_payload",
            "function": "0x1::Coin::register",
            "type_arguments": [f"0x{coin_type_address}::MoonCoin::MoonCoin"],
            "arguments": []
        }
        res = self.execute_transaction_with_payload(account_receiver, payload)
        return str(res["hash"])

Шаг 4) Отправьте MoonCoin получателю как владельцу MoonCoin

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

    def mint_coin(
        self,
        account_coin_owner: Account,
        receiver_address: str,
        amount: int
    ) -> str:
        """ Register the receiver account to receive transfers for the new coin. """

        payload = {
            "type": "script_function_payload",
            "function": "0x1::ManagedCoin::mint",
            "type_arguments": [f"0x{account_coin_owner.address()}::MoonCoin::MoonCoin"],
            "arguments": [
                receiver_address,
                f"{amount}"
            ]
        }
        res = self.execute_transaction_with_payload(account_coin_owner, payload)
        return str(res["hash"])

Шаг 5) Проверьте баланс MoonCoin Боба

    def get_balance(
        self,
        account_address: str,
        coin_type_address: str,
    ) -> str:
        """ Returns the coin balance of the given account """

        return self.account_resource(account_address, f"0x1::Coin::CoinStore<0x{coin_type_address}::MoonCoin::MoonCoin>")

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

  • Учетная запись Алисы через REST interface

  • Учетная запись Боба через explorer

Last updated