В этом руководстве подробно описано, как развернуть и управлять новым Coin. Шаги следующие:
- Разверните модуль
moon_coin
. Назовем егоmoon_coin
. - Инициализируйте
MoonCoin
с помощью стандартного модуля фреймворкаCoin
. - Зарегистрируйте аккаунт получателя для получения
MoonCoin
. - Переведите
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
Установите утилиту командной строки Aptos. Узнайте больше об утилите командной строки Aptos.
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
(добавляет функциональные возможности майнинга/жжения).
module MoonCoinType::moon_coin {
struct MoonCoin {}
}
Код очень прост, поскольку мы не добавляем в 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.
Шаг 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;
}
Шаг 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;
}
Шаг 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;
}
Шаг 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;
}
}
Данные можно проверить, посетив либо REST-интерфейс, либо Explorer:
- Учетная запись Alice через интерфейс Aptos REST.
- Учетная запись Bob через Aptos Explorer.
Top comments (0)