Ваш первый COIN

Это руководство рассказывает о том, как скомпилировать, развернуть и заминтить собственный coin, названный MoonCoin.

Шаг 1: Выберите SDK

Установите предпочтительный SDK из приведенного ниже списка:

Шаг 2: Установите CLI

Установите предварительно скомпилированный двоичный файл для Aptos CLI.

Шаг 3: Запустите пример

Клонируйте репозиторий aptos-core:

git clone https://github.com/aptos-labs/aptos-core.git

Перейдите в каталог Typescript SDK:

cd ~/aptos-core/ecosystem/typescript/sdk

Установите необходимые зависимости:

yarn

Запустите пример Typescript your_coin

yarn your_coin ~/aptos-core/aptos-move/move-examples/moon_coin

Шаг 3.1: Сборка пакета

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

=== Addresses ===
Alice: 0x5e603a89cf690d7134cf2f24fdb16ba90c4f5686333721c12e835fb6c76bc7ba
Bob: 0xc8421fa4a99153f955e50f1de2a6acff2f3fd0bb33aa17ba1f5b32b699f6c825

Update the package with Alice's address, compile, and press enter.

В этот момент откройте другой терминал и смените каталог на каталог пакета MoonCoin:

cd ~/aptos-core/aptos-move/move-examples/moon_coin

Затем соберите пакет с помощью CLI:

aptos move compile --named-addresses MoonCoin=0x5e603a89cf690d7134cf2f24fdb16ba90c4f5686333721c12e835fb6c76bc7ba --save-metadata

Параметр --named-addresses представляет собой список отображений адресов, которые должны быть переведены для того, чтобы скомпилированный пакет хранился на учетной записи Alice. Обратите внимание, что MoonCoin установлен на адрес Alice, указанный выше. Также --save-metadata требуется для публикации пакета.

Шаг 3.2: Завершение примера

Вернувшись к предыдущему окну, нажмите ENTER, так как пакет теперь готов к публикации.

Приложение будет завершено, выполняется:

Publishing MoonCoin package.

Bob registers the newly created coin so he can receive it from Alice.
Bob's initial MoonCoin balance: 0.
Alice mints Bob some of the new coin.
Bob's updated MoonCoin balance: 100.

Шаг 4: MoonCoin в деталях

Шаг 4.1: Создание и публикация пакета MoonCoin

Контракты Move фактически представляют собой набор модулей Move, известный как пакет. При развертывании или обновлении нового пакета компилятор должен быть вызван с параметром --save-metadata для публикации пакета. В случае с MoonCoin важны следующие файлы:

  • build/Examples/package-metadata.bcs: Содержит метаданные, связанные с пакетом.

  • build/Examples/bytecode_modules/moon_coin.mv: Содержит байткод для модуля moon_coin.move.

Они считываются примером и публикуются в блокчейне Aptos:

const modulePath = process.argv[2];
const packageMetadata = fs.readFileSync(path.join(modulePath, "build", "Examples", "package-metadata.bcs"));
const moduleData = fs.readFileSync(path.join(modulePath, "build", "Examples", "bytecode_modules", "moon_coin.mv"));

console.log("Publishing MoonCoin package.");
let txnHash = await client.publishPackage(alice, new HexString(packageMetadata.toString("hex")).toUint8Array(), [
  new TxnBuilderTypes.Module(new HexString(moduleData.toString("hex")).toUint8Array()),
]);
await client.waitForTransaction(txnHash, { checkSuccess: true }); 

Шаг 4.2: Понимание модуля MoonCoin

Модуль MoonCoin определяет структуру MoonCoin , или отдельный тип типа coin. Кроме того, он содержит функцию init_module. Функция init_module вызывается при публикации модуля. В этом случае MoonCoin инициализирует тип coin MoonCoin как ManagedCoin, который обслуживается владельцем учетной записи.

ФРЕЙМВОРК MANAGEDCOIN ManagedCoin - это простой фреймворк для управления coins, которыми управляют непосредственно пользователи. Он предоставляет удобные оболочки вокруг mint (минта) и burn (сжигания).

module MoonCoin::moon_coin {
    struct MoonCoin {}

    fun init_module(sender: &signer) {
        aptos_framework::managed_coin::initialize<MoonCoin>(
            sender,
            b"Moon Coin",
            b"MOON",
            6,
            false,
        );
    }
}

Шаг 4.3: Понятия coins

Coins имеют несколько примитивов:

  • Минт: Создание новых coins.

  • Сжигание: Удаление coins.

  • Замораживание: Запрет на хранение coins в CoinStore.

  • Регистрация: Создание ресурса CoinStore на учетной записи для хранения coins.

  • Передача: Вывод и ввод coins в CoinStore.

ПОДСКАЗКА Организация, создающая новую coin, получает возможности для минта, сжигания и замораживания.

Для того чтобы переводить, выводить или вносить coins, необходимо иметь CoinStore, зарегистрированный для конкретного coin. В данном руководстве это CoinStore<MoonCoin>.

Шаг 4.3.1: Инициализация coin

После публикации типа coin в блокчейне Aptos организация, опубликовавшая этот тип coin, может инициализировать ее:

public fun initialize<CoinType>(
    account: &signer,
    name: string::String,
    symbol: string::String,
    decimals: u8,
    monitor_supply: bool,
): (BurnCapability<CoinType>, FreezeCapability<CoinType>, MintCapability<CoinType>) {
    let account_addr = signer::address_of(account);

    assert!(
        coin_address<CoinType>() == account_addr,
        error::invalid_argument(ECOIN_INFO_ADDRESS_MISMATCH),
    );

    assert!(
        !exists<CoinInfo<CoinType>>(account_addr),
        error::already_exists(ECOIN_INFO_ALREADY_PUBLISHED),
    );

    let coin_info = CoinInfo<CoinType> {
        name,
        symbol,
        decimals,
        supply: if (monitor_supply) { option::some(optional_aggregator::new(MAX_U128, false)) } else { option::none() },
    };
    move_to(account, coin_info);

    (BurnCapability<CoinType>{ }, FreezeCapability<CoinType>{ }, MintCapability<CoinType>{ })
}

Это гарантирует, что данный тип coin никогда не был инициализирован ранее. Обратите внимание на проверку в строках 10 и 15, чтобы убедиться, что вызывающий initialize является тем же самым пользователем, который фактически опубликовал этот модуль, и что на его учетной записи не хранится CoinInfo. Если оба эти условия выполняются, то CoinInfo сохраняется, и вызывающая сторона получает возможности для сжигания, замораживания и минта.

ПОДСКАЗКА MoonCoin вызывает эту функцию инициализации автоматически при публикации пакета.

Шаг 4.3.2: Регистрация coin

Чтобы использовать coin, организация должна зарегистрировать для нее CoinStore на своей учетной записи:

public fun register(account: &signer) { let account_addr = signer::address_of(account); assert!( !is_account_registered(account_addr), error::already_exists(ECOIN_STORE_ALREADY_PUBLISHED), );
account::register_coin<CoinType>(account_addr);let coin_store = CoinStore<CoinType> {    coin: Coin { value: 0 },    frozen: false,    deposit_events: account::new_event_handle<DepositEvent>(account),    withdraw_events: account::new_event_handle<WithdrawEvent>(account),};move_to(account, coin_store);
}

Поскольку это public fun, а не public entry fun, coins должны будут предоставить свои собственные средства для регистрации или пользователи могут создать scripts Move для вызова функции.

MoonCoin использует ManagedCoin, который предоставляет оболочку функции входа: managed_coin::register.

Шаг 4.3.3: Минт coin

Для минта coins требуется возможность минта, которая была создана во время инициализации. Функция mint (см. ниже) принимает эту возможность и сумму и возвращает структуру Coin<T>, содержащую это количество coins. Если coins отслеживает предложение, она будет обновлена.

public fun mint( amount: u64, _cap: &MintCapability, ): Coin acquires CoinInfo { if (amount == 0) { return zero() };
let maybe_supply = &mut borrow_global_mut<CoinInfo<CoinType>>(coin_address<CoinType>()).supply;if (option::is_some(maybe_supply)) {    let supply = option::borrow_mut(maybe_supply);    optional_aggregator::add(supply, (amount as u128));};Coin<CoinType> { value: amount }
}

ManagedCoin облегчает эту задачу, предоставляя функцию входа managed_coin::mint.

Шаг 4.3.4: Передача coin

Aptos предоставляет несколько структурных блоков для поддержки переводов coin:

  • coin::deposit:<CoinType> Позволяет любому субъекту внести coin на учетную запись, которая уже вызвала coin::register<CoinType>.

  • coin::withdraw<CoinType>: Позволяет любому пользователю снять сумму coin со своей учетной записи.

  • coin::transfer<CoinType>: Использует функции withdraw и deposit для выполнения передачи из конца в конец.

ВАЖНО Aptos не эмитирует события перевода, вместо этого он использует события вывода и ввода средств.

Last updated