В предыдущих статьях мы научились генерировать 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.