В этом руководстве подробно описано, как использовать и управлять новой монетой. Рассмотрим следующие шаги:
Разверните модуль MoonCoin. Будем называть его MoonCoin.
Инициализируйте MoonCoin через стандартный модуль фреймворка Coin.
Зарегистрируйте учетную запись получателя, чтобы получить MoonCoin.
Создайте MoonCoin получателю как владелец MoonCoin.
Это руководство основано на секции в качестве библиотеки для этого примера. Данное руководство содержит пример кода, который можно загрузить ниже:
В этом руководстве основное внимание будет уделено first_coin.py и повторному использованию библиотекиfirst_transaction.py из предыдущего руководства.
Вы найдете python project
В этом руководстве основное внимание будет уделено first_coin.rs и повторному использованию библиотеки first_transaction.rs из предыдущего руководства.
Вы найдете rust project
В этом руководстве основное внимание будет уделено first_coin.ts и повторному использованию библиотеки first_transaction.ts из предыдущего руководства.
Вы найдете typescript project
Шаг 1) Разверните модуль MoonCoin
Шаг 1.1) Загрузите Aptos-core
Для простоты выполнения этой задачи у Aptos-core имеется move-examples каталог, который позволяет легко создавать и тестировать модули Move без загрузки дополнительных ресурсов. Со временем мы расширим этот раздел и опишем, как использовать инструменты для разработки.
В этом терминале измените каталоги на aptos-move/move-examples/moon_coin. Сохраните это окно терминала до конца руководства - в дальнейшем мы будем называть его «Move Window». В оставшейся части этого раздела будет рассмотрен файл sources/MoonCoinType.move.
Этот модуль позволяет пользователям создать новый MoonCoinType::MoonCoin::MoonCoin, который можно использовать для регистрации в платформенном модуле Coin (0x1::Coin) для создания стандартной монеты Coin. Разработчики могут написать свои собственные функции в модуле MoonCoin, если они хотят сделать больше, чем то, что предоставляется в стандартном режиме 0x1::Coin или 0x1::ManagedCoin (добавляет функции создания/сжигания монет).
Код очень прост, так как мы не добавляем в MoonCoin больше функций, чем стандартные, предоставляемые фреймворком Coin (перевод, депозит, вывод, создание, сжигание). Наиболее важной частью является структура MoonCoin, определяющая новый тип монеты, которую можно зарегистрировать с помощью 0x1::Coin.
Шаг 1.3) Развертывание модуля Move, содержащего тип MoonCoin
Для Python3:
Откройте свой любимый терминал и перейдите туда, куда вы загрузили приведенный выше пример проекта.
Установите необходимые библиотеки: pip3 install -r requirements.txt.
Откройте свой любимый терминал и перейдите туда, куда вы загрузили приведенный выше пример проекта.
Выполните пример: cargo run --bin first_coin -- MoonCoin.mv
Для Typescript:
Откройте свой любимый терминал и перейдите туда, куда вы загрузили приведенный выше пример проекта.
Установите необходимые библиотеки: yarn install
Выполните пример: yarn first_coin 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"])
/// Receiver needs to register the coin before they can receive it.
pub fn register_coin(
&self,
account_receiver: &mut Account,
coin_type_address: &str,
) -> String {
let payload = serde_json::json!({
"type": "script_function_payload",
"function": "0x1::Coin::register",
"type_arguments": [format!("0x{}::MoonCoin::MoonCoin", coin_type_address)],
"arguments": []
});
self.rest_client.execution_transaction_with_payload(account_receiver, payload)
}
/** Receiver needs to register the coin before they can receive it */
async registerCoin(coinReceiver: Account, coinTypeAddress: string): Promise<string> {
let payload: { function: string; arguments: string[]; type: string; type_arguments: any[] };
payload = {
type: "script_function_payload",
function: `0x1::Coin::register`,
type_arguments: [`0x${coinTypeAddress}::MoonCoin::MoonCoin`],
arguments: [],
};
return await this.executeTransactionWithPayload(coinReceiver, payload);
}
Шаг 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"])
/// Receiver needs to register the coin before they can receive it.
pub fn mint_coin(
&self,
account_owner: &mut Account,
receiver_address: &str,
amount: u64,
) -> String {
let payload = serde_json::json!({
"type": "script_function_payload",
"function": "0x1::ManagedCoin::mint",
"type_arguments": [format!("0x{}::MoonCoin::MoonCoin", account_owner.address())],
"arguments": [
receiver_address,
amount.to_string(),
]
});
self.rest_client.execution_transaction_with_payload(account_owner, payload)
}