Создание рынка NFT на Aptos
В этом руководстве мы расскажем вам о создании модуля перемещения на рынке NFT (модуль перемещения - это эквивалент смарт-контракта на языке блокчейн). Мы также будем использовать недавно запущенный aptos CLI для компиляции и развертывания модуля в Aptos Devnet.
Martian создает различные продукты для экосистемы Aptos, включая Martian Wallet, который будет доступен в качестве расширения Chrome в течение недели. Мы также создаем NFT Marketplace под названием Curiosity, который будет использовать модуль Move, описанный здесь, и будет полностью совместим с нашим кошельком в виде расширения для браузера. Пожалуйста, присоединяйтесь к нашему Discord здесь, чтобы быть в курсе событий: https://discord.gg/GaB7BpgX7h.
Смотрите на нашем сайте последние выпуски кошелька Martian Aptos Wallet: https://martianwallet.xyz/.
Этот модуль NFT Marketplace Move поддерживает следующие функции высокого уровня:
- Это позволит продавцу выставить свой NFT на продажу по фиксированной цене (выраженной в Aptos TestCoin).
- Затем покупатель может отправить продавцу Aptos TestCoin по цене NFT через функции модуля NFT Marketplace Move, и NFT продавца будут переведены на счет покупателя.
Код и стартовый пакет доступны на нашем github здесь. Однако, пожалуйста, помните, что код ядра Aptos меняется каждую неделю, и этот код может стать несовместимым из-за этих изменений. Информирование нас в Discord здесь может быть лучшим способом решения таких вопросов.
Остальная часть статьи состоит из следующих разделов:
- Настройка ядра Aptos и создание локальной среды сборки
- Написание модуля NFT Marketplace Move (суть этой статьи)
- Тестирование модуля Move
- Использование aptos CLI для компиляции и развертывания модуля Move на devnet
Настройка локальной среды сборки
Перейдите в выбранный вами каталог и выполните следующее:
git clone https://github.com/aptos-labs/aptos-core.git
Это клонирует репо ядра Aptos локально в вашей системе. Это важно сделать, так как многие зависимости модулей Move, например aptos-vm, должны быть установлены локально (на данный момент).
Далее, клонируйте стартовый пакет с нашего официального Github.
git clone https://github.com/martian-dao/aptos-nft-marketplace.git cd aptos-nft-marketplace
Теперь вам нужно внести несколько изменений в файлы Cargo.toml и Move.toml. Добавьте локальный путь к aptos-vm и aptos-workspace-hack в Cargo.toml. Оба эти репозитория находятся внутри каталога aptos-core, который мы клонировали в первом шаге. Аналогично, добавьте путь к aptos-framework в Move.toml.
Общий код модуля можно найти здесь. Мы объясним некоторые части кода в приведенных ниже фрагментах. Для более глубокого понимания Move обратитесь к серии блогов Magnum здесь.
Мы использовали Table, Token и TestCoin из AptosFramework для создания нашей торговой площадки.
Основная идея продажи NFT: Токен изымается у продавца, когда он выставляет его на продажу. Этот изъятый токен добавляется в таблицу всех токенов, выставленных на продажу. После того как покупатель успешно заплатит продавцу (цену NFT) и владельцу рынка (listing_fee), токен зачисляется на счет покупателя, закрывая строку всех транзакций.
Структуры данных, используемые на рынке:
- MarketItem: Содержит адрес продавца, объект NFT для продажи (токен) и цену, установленную продавцом.
struct MarketItem has key, store {
seller: address,
token: Token,
price: u64
}- Рынок: Содержит таблицу всех продаваемых MarketItems и листинг_fee, взимаемый рынком с каждой продажи.
struct Market has key {
market_items: Table<ID, MarketItem>,
listing_fee: u64,
}public(script) fun init_market_script(market_owner: &signer, listing_fee: u64)
{let market_items = Table::new<ID, MarketItem>();
move_to<Market>(market_owner, Market {market_items, listing_fee})
}public(script) fun list_token_for_sale_script(
seller: &signer,
creator: address,
token_creation_num: u64,
price: u64,
market_owner_addr: address,
) acquires Market {
let token_id = GUID::create_id(creator, token_creation_num);
list_token_for_sale(seller, &token_id, price, market_owner_addr);
}
public(script) fun list_token_for_sale(
seller: &signer,
token_id: &ID,
price: u64,
market_owner_addr: address,
) acquires Market {
let seller_addr = Signer::address_of(seller);
let token = Token::withdraw_token(seller, token_id, 1);
let token_id = *Token::token_id(&token);
let market_items = &mut borrow_global_mut<Market>(market_owner_addr).market_items;
Table::add(market_items, &token_id, MarketItem {seller: seller_addr, token: token, price: price})
}public(script) fun buy_token_script(
buyer: &signer,
seller: address,
creator: address,
token_creation_num: u64,
market_owner_addr: address,
) acquires Market {
let token_id = GUID::create_id(creator, token_creation_num);
buy_token(buyer, seller, &token_id, market_owner_addr);
}
public(script) fun buy_token(
buyer: &signer,
seller: address,
token_id: &ID,
market_owner_addr: address,
) acquires Market {
let listing_fee = borrow_global<Market>(market_owner_addr).listing_fee;
let buyer_addr = Signer::address_of(buyer);
assert!(buyer_addr != seller, ERROR_INVALID_BUYER);
let market_items = &mut borrow_global_mut<Market>(market_owner_addr).market_items;
let market_item = Table::borrow(market_items, token_id);
let price = market_item.price;
TestCoin::transfer(buyer, seller, price);
TestCoin::transfer(buyer, market_owner_addr, listing_fee);
let market_item = Table::remove(market_items, token_id);
let MarketItem{ seller: _, token: token, price: _,} = market_item;
Token::deposit_token(buyer, token)
}- Продавец: счет, который пытается продать свой NFT
- Покупатель: аккаунт, который пытается купить NFT
- MarketOwner: аккаунт, который хранит все данные, связанные с рынком NFT, и взимает плату за листинг со всех продаваемых NFT.
Тестирование модуля перемещения
Мы тестируем наш модуль на изменение права собственности на токен после размещения его на бирже и после того, как покупатель заплатит нужное количество TestCoins. Команда test для запуска тестов упоминается в следующем разделе.
#[test(market_owner = @0x1, seller = @0x2, buyer = @CoreResources)]
public(script) fun list_buy_test(market_owner: signer, seller: signer, buyer: signer) acquires Market {
let market_owner_addr = Signer::address_of(&market_owner);
let seller_addr = Signer::address_of(&seller);
let buyer_addr = Signer::address_of(&buyer);
init_market_script(&market_owner, 1);
let token_id = create_token(&seller, 1);
TestCoin::initialize(&buyer, 1000000);
TestCoin::register(&market_owner);
TestCoin::register(&seller);
let amount = 1000;
TestCoin::mint_internal(&buyer, buyer_addr, amount);
list_token_for_sale(&seller, &token_id, 10, market_owner_addr);
buy_token(&buyer, seller_addr, &token_id, market_owner_addr);
}Компиляция и развертывание модуля перемещения
Для этого шага мы будем использовать aptos CLI. Aptos CLI - удобный инструмент, напоминающий hardhat на ethereum, но более удобный в использовании!
cargo install --git https://github.com/aptos-labs/aptos-core.git aptos
Инициализируйте учетную запись для компиляции и развертывания.
aptos init
aptos move compile --package-dir aptos-nft-marketplace
aptos move test --package-dir aptos-nft-marketplace
aptos move publish --package-dir apos-nft-marketplace --named-addresses NFTMarketplace=default
Откройте проводник Aptos Devnet, чтобы проверить, был ли опубликован ваш модуль перемещения. Он должен выглядеть примерно так.
В качестве следующих шагов мы добавим в этот базовый модуль аукционные механизмы для продажи НМТ. Следите за расширением нашего кошелька и приложением Curiosity (NFT Marketplace), которое будет запущено в ближайшее время на следующей неделе.
Понравилась статья? Пошлите нам немного любви, следуя за нами в Twitter здесь и присоединившись к нашему Discord здесь.