В предыдущих статьях мы научились генерировать 10 000 изображений для нашей коллекции NFT с помощью Golang и загрузили все сгенерированные изображения в децентрализованное хранилище IPFS.
В этой статье я хотел бы поделиться своими знаниями и опытом, а также подводными камнями, с которыми мне пришлось столкнуться при разработке смарт-контрактов для коллекций NFT на блокчейне Ethereum.
Мы создадим смарт-контракт для нашей коллекции NFT, протестируем и загрузим созданный смарт-контракт в тестовую сеть Ethereum. Но прежде чем мы приступим к кодированию, я хотел бы остановиться на стандарте ERC-721, потому что этот стандарт описывает спецификацию токенов NFT.
Давайте подробнее рассмотрим, какие методы должен иметь наш смарт-контракт:
Полную спецификацию стандарта ERC-721 можно найти здесь.
Нам не обязательно реализовывать весь стандарт самостоятельно, более оптимальный подход — повторное использование готовых библиотек: OpenZeppelin — это библиотека для разработки защищенных смарт-контрактов, с ней мы и будем работать.
Преимущества такого решения очевидны:
- Код для смарт-контракта из коробки
- Аудит нашего смарт-контракта займет гораздо меньше денег и времени
Создание смарт-контракта
Давайте создадим общий смарт-контракт для нашей коллекции NFT, назовем его MonkeyNFT. Наш смарт-контракт наследует стандартные библиотеки OpenZeppelin:
- ERC721 и ERC721Enumerable — контрактные модули, обеспечивающие базовую функциональность для нашего токена NFT.
- Ownable — это контрактный модуль, предоставляющий базовый механизм контроля доступа.
Для разработки смарт-контракта мы будем использовать такой инструмент, как каска, очень крутой инструмент для разработки, тестирования и развертывания, особенно для тех, кто устал от Трюфеля и его бесконечного количества ошибок.
В утилите есть функция создания базового шаблона, нам достаточно запустить:
npx hardhat init
Давайте теперь отредактируем базовый шаблон в соответствии с нашими потребностями. В каталоге contracts нам нужно написать следующий код солидности:
Давайте теперь внимательно посмотрим на код, который мы написали:
- Флаг saleIsActive указывает, готова ли наша коллекция к продаже или нет. Эта функция очень полезна на начальном этапе, когда по каким-то причинам необходимо остановить продажи.
- В переменной maxPurchase хранится количество токенов, которые пользователь может купить за один раз. Это защита от ботов, чтобы они не смогли купить всю коллекцию сразу.
- Функция mintMonkey — это основная функция, с помощью которой пользователи могут покупать наш токен NFT. Модификатор payable просто говорит, что вызов этой функции подлежит оплате пользователю.
Чтобы скомпилировать наш смарт-контракт, нам нужно выполнить следующую команду:
npx hardhat compile
В результате аби-артефакты должны создаваться в каталоге artifact.
Тестирование смарт-контракта
Поскольку загруженный смарт-контракт нельзя изменить, нам обязательно нужно протестировать его перед развертыванием в блокчейне Ethereum.
Каталог test содержит тесты по умолчанию, которые можно удалить. Они нам больше не понадобятся, вместо них мы напишем свои собственные тесты.
Для запуска тестов нам нужно запустить команду:
npx hardhat test
Если тесты пройдены успешно, мы увидим:
Compiling 1 file with 0.8.4 Compilation finished successfully Token contract ✓ Should initialize contract ✓ Should set the right owner ✓ Should mint (41ms) 3 passing (1s)
Мы успешно протестировали:
- Создание смарт-контракта
- Владелец смарт-контракта успешно назначен
- Успешно вызвана платная функция mintMonkeys для продажи токена NFT.
Развертывание смарт-контракта
Мы развернем наш смарт-контракт в тестовой сети Ethereum. Для этого нам нужно перейти в каталог scripts и удалить все стандартные скрипты (они нам больше не нужны).
Напишем новый скрипт развертывания:
Нам также нужно изменить файл hardhat.config:
Все готово к развертыванию, запускаем финальный скрипт:
npx hardhat run scripts/deploy.js --network rinkeby
P.S. Весь исходный код можно найти на GitHub.