Чеканка каждого предмета. По одной транзакции за раз. И вы не будете платить за газ.

Ленивая чеканка - это метод, который все чаще используется в контрактах NFT. Это решение одной-единственной проблемы: безумно высокой платы за газ на Ethereum.

Простое объяснение - это изменение функции mint с onlyOwner на payable. Если вы хотите получать хотя бы доплату. В противном случае вам нужно будет только изменить функцию mint и помнить о некоторых других деталях.

Код

В нашем примере мы будем использовать простой контракт OpenZeppelin Wizard. По умолчанию только владелец может чеканить новые токены. Это полезно, если у вас нет ограничения на количество доступных токенов. Но поскольку у большинства коллекций NFT есть ограничение, нам нужно проверить, не достигнут ли предел.

Обычная функция safeMint будет выглядеть примерно так:

Только владелец контракта (вы) мог это назвать. Это будет стоить вам платы за газ. И вам также нужно знать, кому отчеканить его для параметра to. Вы также не могли принять оплату за свои уникальные и красивые жетоны.

Нам нужно изменить параметры, как если бы мы передавали элемент вызывающему или msg.sender внутри самой функции.

Если мы хотим, чтобы пользователь мог создавать несколько токенов, нам нужен только uint256 _amount в качестве параметра, в противном случае нам не нужны никакие параметры. Нам также потребуется создать простой цикл for для чеканки количества токенов, выбранных в параметре _amount.

Нам нужно сделать это payable функцией, если мы хотим принять платеж, и нам нужно удалить модификатор onlyOwner, потому что мы хотим, чтобы наши пользователи чеканили свои собственные токены.

Это даст нам safeMint функцию, подобную этой:

Подводные камни

Функция safeMint пока выглядит хорошо, но в ней есть некоторые подводные камни, которые нам действительно необходимо исправить. Я объясню, почему и как мы могли это сделать.

При желании пользователь может чеканить все доступные токены за одну транзакцию. Это может быть проблемой, особенно в таких сетях, как Polygon, поскольку плата за газ не так велика, чтобы пользователь не стал этого делать. Для этого нам нужно добавить оператор require, который позволяет пользователю чеканить только определенную сумму за одну транзакцию.

Еще одна ошибка, возможно, более важная: мы не установили цену. Для этого потребуется фрагмент кода, аналогичный приведенному выше. Нам нужно сверить msg.value с нашей ценой.

Сейчас он выглядит все лучше и лучше, но у нас может быть другая проблема. Большинство коллекций NFT или децентрализованных приложений имеют ограничение на количество токенов. Этот отчет будет похож на количество токенов на продажу, но нам нужно сверить его с общим количеством.

Теперь мы решили наиболее распространенные проблемы и свели на нет их последствия, если они были реализованы должным образом. Теперь вся функция safeMint может выглядеть так (я также реализовал переменную для переключения продаж):

Вывод

Смарт-контракты - отличный способ использовать блокчейн, но, поскольку комиссии высоки, в некоторых случаях мы хотим возложить это на наших пользователей. Такие цепочки, как Polygon, делают эту проблему менее важной.

Нам также необходимо поработать над безопасностью и попытаться защитить наше приложение от любых злонамеренных попыток, которые может предпринять пользователь, таких как добыча всех доступных токенов.

Большое спасибо за чтение и удачного дня.

Зацените меня в Твиттере и посмотрите мою первую коллекцию NFT в сети Polygon.