Что такое расширение Enumerable?
Расширение Enumerable — необязательная часть стандарта невзаимозаменяемых токенов ERC-721. Оно позволяет смарт-контрактам и криптоприложениям находить ID NFT-токенов с помощью ончейн-запросов по индексам.Обычно оно обозначается именем интерфейса
В официальной спецификации ERC-721 это расширение описано как способ, с помощью которого контракт может предоставлять полный список действительных NFT и ID токенов, принадлежащих каждому адресу.
Расширение добавляет три функции:
Они не заменяют такие функции, как
Почему оно называется Enumerable?
Перечисление коллекции означает последовательное определение ее элементов с помощью индекса или другого упорядоченного метода.Базовый интерфейс ERC-721 позволяет приложению узнать, кому принадлежит токен с известным ID.Он также позволяет узнать, сколько NFT принадлежит адресу.Однако базовый интерфейс не предоставляет прямой ончейн-функции для поиска всех существующих ID токенов или всех ID токенов конкретного владельца.Расширение Enumerable устраняет этот пробел, добавляя индексированный доступ к коллекции в целом и токенам каждого владельца.Приложение может начать с индекса ноль и продолжать запрашивать следующие индексы, пока не достигнет соответствующего предложения токенов или баланса владельца.Что такое ID интерфейса расширения Enumerable?
ID интерфейса ERC-165 для расширения ERC-721 Enumerable —
Совместимый контракт должен возвращать
Стандарт обнаружения интерфейсов ERC-165 позволяет приложениям запрашивать у смарт-контракта, какие интерфейсы он заявляет к реализации.
У базового интерфейса ERC-721 отдельный ID, поэтому приложение может независимо проверить поддержку базового интерфейса и Enumerable.Контракт, реализующий расширение Enumerable, должен также реализовать базовый интерфейс ERC-721.Положительный ответ при обнаружении интерфейса повышает уверенность в совместимости, но не доказывает, что реализация корректна, безопасна или добросовестна.Функции, добавляемые расширением Enumerable
Расширение Enumerable добавляет только три общедоступные функции запросов.Функция
Функция
Функция
В стандартном интерфейсе все три функции являются доступными только для чтения функциями
Функция totalSupply
Функция
Это означает, что значение
Функция tokenByIndex
Функция
Допустимый индекс должен быть меньше значения, возвращаемого функцией
Функция tokenOfOwnerByIndex
Функция
Индексация начинается с нуля, а индекс должен быть меньше результата функции
Как работают три функции вместе
Приложение может вызвать
Затем оно может вызвать
Для каждого возвращенного ID токена приложение может вызвать
Чтобы перечислить активы конкретного адреса, приложение может вызвать
Порядок перечисления не гарантируется
Спецификация ERC-721 не определяет обязательный порядок сортировки для
Перечисление с помощью swap-and-pop
В распространенной реализации для эффективного удаления ID токенов из массивов используется метод под названием swap-and-pop.При удалении токена реализация помещает последний токен на место удаленного элемента в массиве.Затем она удаляет последнюю запись массива.Это позволяет не сдвигать все последующие токены и сохранять относительно низкую вычислительную сложность удаления.Однако порядок оставшихся ID токенов при этом меняется.В текущей реализации OpenZeppelin ERC721Enumerable этот метод используется как для глобальных индексов, так и для индексов отдельных владельцев.
Поэтому при изменении прав собственности во время длительного перечисления приложению следует начать процесс заново или тщательно сверить результаты пагинации.Пример перечисления всей коллекции
Предположим, контракт ERC-721 сообщает об общем предложении в четыре токена.Приложение вызывает
Для каждого ID оно может вызвать
Пример перечисления токенов владельца
Предположим, Алисе принадлежат токены с ID 9, 30 и 88 в NFT-контракте с поддержкой Enumerable.Функция контракта
Приложение запрашивает индексы владельца ноль, один и два с помощью
Расширение Enumerable и базовый ERC-721
Базовый стандарт ERC-721 предусматривает владение, передачу, подтверждения, события и проверки безопасного получения.Он позволяет узнать, существует ли токен с известным ID и кому он принадлежит.При этом он не предоставляет стандартизированный ончейн-список всех ID токенов.Расширение Enumerable добавляет механизм поиска таких токенов.Коллекция без перечисления может по-прежнему нормально передавать NFT и работать с кошельками, совместимыми с ERC-721.Отсутствие перечисления не делает NFT недействительным или несоответствующим стандарту.Для широкой совместимости с ERC-721 приложениям необходимо поддерживать как коллекции с перечислением, так и коллекции без него.Расширение Enumerable и расширение Metadata
Расширение Enumerable позволяет определять существующие ID токенов и токены, принадлежащие конкретным владельцам.Расширение Metadata предоставляет название и символ коллекции, а также URI токенов.Перечисление не описывает изображение, атрибуты, название или внешний контент, связанный с NFT.Поддержка метаданных не предоставляет полный список токенов.Контракт может реализовать одно или оба расширения либо не реализовывать ни одно из них, сохраняя при этом базовую функциональность ERC-721.Приложениям следует проверять каждый интерфейс отдельно.Расширение Enumerable и одна лишь функция totalSupply
Некоторые NFT-контракты добавляют собственную функцию
Знакомое имя функции не доказывает поддержку
Почему расширение Enumerable увеличивает расход газа
Для перечисления контракту необходимо поддерживать дополнительные структуры хранения данных.В распространенной реализации хранится массив всех существующих ID токенов.Кроме того, для каждого владельца хранятся индексированный список токенов и отображения их позиций.При выпуске новый токен нужно добавить и в глобальный список, и в список владельца.При передаче токен необходимо удалить из списка прежнего владельца и добавить в список нового владельца.При сжигании токен необходимо удалить как из списка владельца, так и из глобального списка.Эти дополнительные операции записи в хранилище увеличивают расход газа при транзакциях, меняющих состояние.В актуальных рекомендациях по реализации ERC-721 отмечается, что расширение часто не используют из-за значительных дополнительных затрат газа.
Бесплатны ли запросы перечисления?
Пользователь может вызывать функции
Циклы и лимиты газа блока
Смарт-контракту следует избегать функций, меняющих состояние и проходящих циклом по каждому NFT в коллекции или по каждому NFT, принадлежащему адресу с неограниченным числом токенов.Количество итераций может со временем увеличиться настолько, что транзакция превысит лимит газа блока.В документации Solidity по безопасности предупреждается, что циклы, зависящие от объема хранимых данных, могут со временем сделать выполнение операций контракта невозможным.
Офчейн-вызовы функций
Офчейн-индексация событий как альтернатива
Каждый совместимый с ERC-721 контракт генерирует события
Расширение Enumerable и индексация событий
Ончейн-перечисление предоставляет смарт-контрактам прямой стандартизированный доступ к индексам токенов.Индексация событий обеспечивает более широкие и масштабируемые возможности поиска офчейн.Перечисление полезно, когда другому смарт-контракту необходимо проверять или выбирать ID токенов, не полагаясь на внешнюю базу данных.Индексация событий обычно практичнее для интерфейсов кошельков, страниц коллекций, аналитики и исторического поиска.Проект может поддерживать оба метода.Оптимальный выбор зависит от того, оправдывает ли возможность ончейн-поиска дополнительные расходы на газ при каждом выпуске, передаче и сжигании.Поддерживает ли перечисление пагинацию?
Расширение не определяет функцию, которая возвращала бы страницу с ID токенов.Оно возвращает один ID токена для каждого запроса по индексу.Офчейн-приложение может реализовать пагинацию, запрашивая ограниченный диапазон индексов.Например, на первой странице можно запрашивать индексы от нуля до 49, а на второй — от 50 до 99.При переходе между страницами приложение должно учитывать изменения предложения и порядка токенов.Передача или сжигание токена может изменить позиции токенов, из-за чего длительный процесс пагинации пропустит или повторно вернет один из ID.Если RPC-система поддерживает исторические вызовы, для получения более согласованного снимка можно использовать данные с одной фиксированной высоты блока.Показывает ли перечисление всех владельцев?
Расширение перечисляет ID токенов глобально и ID токенов, принадлежащих известному владельцу.Оно не предоставляет функцию, возвращающую все уникальные адреса владельцев.Приложение может получить список владельцев, вызывая
Доказывает ли перечисление подлинность токенов?
Нет. Перечисление лишь сообщает ID токенов, отслеживаемых конкретным смарт-контрактом.Любой может развернуть контракт ERC-721 с поддержкой Enumerable и скопировать названия, изображения, символы или метаданные.Блокчейн-сеть и полный адрес контракта остаются важными составляющими идентификатора NFT.Корректная реализация интерфейса Enumerable не доказывает, что эмитент владеет произведением искусства, контролирует заявленный актив или действует добросовестно.Пользователям следует проверять контракт по авторитетной информации проекта и самостоятельно изучать его разрешения.Доказывает ли totalSupply дефицит?
Текущее количество токенов не устанавливает постоянное максимальное предложение.В контракте может быть публичная функция выпуска, роль администратора с правом выпуска, механизм выпуска через мост или право обновления контракта.Токен, у которого сейчас нет владельца, также может быть выпущен позднее.Правила предложения в обновляемых контрактах могут измениться после развертывания.Прежде чем полагаться на заявление о дефиците, пользователям следует изучить код и модель контроля доступа.Перечисление упрощает запрос текущего предложения, но не обеспечивает соблюдение экономических обещаний.Выпуск токенов и перечисление
При выпуске нового NFT реализация с поддержкой Enumerable должна добавить его ID в глобальный индекс и индекс первого владельца.После этого общее предложение увеличивается на единицу.ID токена может находиться на любой допустимой глобальной позиции, предусмотренной реализацией.Последовательный выпуск не означает, что индекс перечисления должен оставаться равным ID токена.Пользовательская логика выпуска должна согласованно обновлять все необходимые структуры перечисления.Неполное обновление может привести к расхождениям между балансами, записями о владельцах, общим предложением и результатами перечисления.Передача токенов и перечисление
Передача обычно не меняет общее предложение.ID токена удаляется из перечисления прежнего владельца и добавляется в перечисление получателя.Обычно тот же ID токена остается в глобальном списке.В процессе удаления позиции индексов конкретного владельца могут измениться.Самопередачи требуют тщательной реализации, поскольку отправитель и получатель — один и тот же адрес.Проверенные реализации обрабатывают такие случаи, не удаляя и не дублируя токен ошибочно.Сжигание токенов и перечисление
Сжигание прекращает действительное владение токеном по ERC-721.Реализация с поддержкой Enumerable удаляет ID сожженного токена из списка владельца и глобального списка токенов.Общее предложение уменьшается.Старые глобальный индекс и индекс владельца для этого токена больше не следует использовать.При удалении методом swap-and-pop другие токены могут переместиться на эти позиции.Для получения истории сожженных NFT историческим приложениям следует использовать события, а не текущее перечисление.Совместимость с пакетным выпуском
Некоторые реализации ERC-721 поддерживают сжатый или последовательный пакетный выпуск при создании контракта.Такие системы могут рассчитывать владение, не регистрируя каждый токен через обычную логику обновления перечисления.В текущей реализации OpenZeppelin содержится предупреждение, что расширение последовательного выпуска конфликтует с
Перечисление и обновляемые контракты
Если это допускает система управления, логику обновляемого NFT-контракта можно изменять после развертывания.Добавление перечисления после того, как уже выпущено много NFT, требует особого внимания.Новое хранилище для перечисления может быть пустым, хотя базовый контракт уже отслеживает тысячи токенов.Для заполнения глобальных индексов и индексов владельцев может потребоваться миграция.Большие ончейн-циклы миграции могут превысить лимиты газа.Ошибки в расположении данных в хранилище также могут повредить существующие сведения о владении или подтверждения.Администраторам обновления следует использовать протестированные процедуры миграции и ограниченные по объему транзакции, а также проводить независимый аудит безопасности.Перечисление и пользовательская логика balanceOf
Перечисление токенов владельца зависит от точных данных ERC-721 о балансе.Расширение, которое рассчитывает
Риски безопасности для интегрирующих приложений
Перед вызовом функций расширения приложению следует проверить поддержку Enumerable.Приложение должно обрабатывать ошибки выхода за границы индекса и не предполагать, что ранее проверенный индекс остается допустимым.Нельзя использовать порядок перечисления для определения редкости, приоритетов или финансовых показателей.Если состояние меняется во время пагинации, необходимо предотвращать появление повторов или пропусков в результатах.Кроме того, следует проверять, что каждый возвращенный ID токена относится к ожидаемому контракту и сети.Для принятия важных решений могут потребоваться согласованный снимок состояния на определенном блоке и подходящий уровень финальности.RPC и согласованность данных
В зависимости от сети и параметров запроса RPC-эндпоинт может возвращать данные перечисления из недавнего, безопасного, финализированного или исторического блока.Два вызова на разных высотах блоков могут возвращать разное общее предложение или разные списки токенов владельца.Недавно переданный NFT может отображаться у разных владельцев в несинхронизированных источниках данных.Если важна согласованность, при множественных запросах перечисления приложению следует записывать номер использованного блока.Критически важные системы могут сверять данные нескольких узлов или использовать независимо проверенный узел.Перечисление избавляет от зависимости от API конкретной коллекции, но не устраняет все риски, связанные с доверием к RPC.Преимущества расширения Enumerable
Расширение предоставляет стандартизированный способ находить все текущие ID токенов.Оно позволяет другому смарт-контракту запрашивать принадлежащие владельцу NFT без внешнего индексатора.Оно предоставляет стандартную функцию для запроса текущего предложения.Расширение может упростить работу с небольшими коллекциями, ончейн-играми, системами членства и приложениями, которым нужно напрямую выбирать токены.Оно также позволяет выполнять базовые запросы об инвентаре NFT, даже если сайт проекта или его закрытая база данных перестанут работать.Ограничения расширения Enumerable
Расширение увеличивает расходы газа при выпуске, передаче и сжигании токенов.Оно не гарантирует неизменность порядка токенов.В нем нет встроенных функций пагинации, сортировки, фильтрации или перечисления держателей.Оно показывает текущие токены, а не полную историю.Оно может быть несовместимо с сжатым пакетным выпуском или пользовательскими системами расчета баланса.Большие ончейн-циклы по-прежнему ограничены газом транзакции.Кроме того, расширение не предоставляет метаданные, роялти, цены, подтверждение подлинности или гарантии лимита предложения.Когда проекту следует использовать перечисление?
Перечисление может быть полезно, если смарт-контрактам необходимо напрямую находить ID токенов ончейн.Оно также может подойти для небольшой коллекции, если дополнительные расходы на передачу приемлемы.Игра может использовать его, если логике контракта нужно выбирать NFT игрока по индексу.Контракт системы членства может применять его, если ончейн-процессу необходимо проверять текущие токены членства пользователя.Тем не менее проекту следует ограничивать циклы и оценить, не будет ли эффективнее использовать более простое отображение или специальный индекс приложения.Когда проекту стоит отказаться от перечисления?
Большая NFT-коллекция может отказаться от перечисления, чтобы снизить расходы на каждый выпуск, передачу и сжигание.Проект может не использовать его и в том случае, если все функции поиска и обнаружения токенов уже зависят от офчейн-индексатора событий.Системы сжатого пакетного выпуска могут использовать модели владения, несовместимые с эффективной работой стандартного хранилища перечисления.Если проекту никогда не понадобится ончейн-перечисление токенов, он может не получить существенной выгоды от постоянных затрат на ончейн-индексы.Решение следует принимать исходя из реальных требований приложения, а не из предположения, что необходимо каждое необязательное расширение.Как разработчикам реализовать расширение
Разработчикам следует начать с активно поддерживаемой и проверенной реализации ERC-721 Enumerable.Необходимо убедиться, что функция
Инвариантные тесты должны подтверждать, что
Они также должны проверять, что количество перечисляемых токенов каждого владельца равно значению
Как пользователям проверить поддержку Enumerable
Сначала необходимо проверить адрес NFT-контракта и блокчейн-сеть.Затем вызвать
Затем сравнить значение
Наконец, сравнить результат
Распространенные ошибки при работе с расширением Enumerable
Частая ошибка — предполагать, что каждый контракт ERC-721 поддерживает перечисление.Другая ошибка — считать индекс перечисления постоянным ID токена.Третья ошибка — предполагать, что ID токенов идут по возрастанию или в порядке выпуска.Четвертая ошибка — считать
Седьмая ошибка — полагать, что пользовательская функция
Часто задаваемые вопросы
Что означает расширение Enumerable в криптовалютах?
Обычно так называют необязательное расширение ERC-721, которое позволяет приложениям перечислять все текущие ID NFT-токенов и ID токенов, принадлежащих указанному адресу.Обязательно ли расширение Enumerable для ERC-721?
Нет. NFT-контракт может соответствовать базовому ERC-721, не поддерживая перечисление.Какой ID интерфейса у расширения Enumerable?
ID интерфейса ERC-165 —
Какие функции добавляет расширение?
Оно добавляет
Что возвращает totalSupply?
Количество действительных NFT, которые контракт отслеживает в данный момент.Показывает ли totalSupply максимально возможное предложение?
Нет. Функция сообщает о текущем предложении и не доказывает, что будущий выпуск невозможен.Что возвращает tokenByIndex?
ID токена, находящегося на указанном глобальном индексе перечисления.Что возвращает tokenOfOwnerByIndex?
ID одного токена, принадлежащего указанному адресу и находящегося на заданном индексе владельца.Индексация перечисления начинается с нуля?
Да. Допустимые индексы начинаются с нуля и заканчиваются на единицу меньше соответствующего предложения или баланса.Индекс перечисления — это то же самое, что ID токена?
Нет. Индекс — временная позиция в списке, а ID токена идентифицирует NFT в рамках контракта.Возвращаются ли ID токенов в числовом порядке?
Нет. Стандарт не устанавливает обязательный порядок перечисления.Может ли порядок перечисления измениться?
Да. Передачи и сжигания могут изменить позиции индексов, особенно в реализациях, использующих удаление методом swap-and-pop.Уменьшает ли сжигание NFT значение totalSupply?
Да. Корректно реализованный контракт Enumerable удаляет сожженный NFT и уменьшает текущее общее предложение.Меняет ли передача NFT значение totalSupply?
Нет. Обычная передача меняет перечисление токенов владельцев, но не количество существующих NFT.Почему расширение дорого обходится?
Для поддержания глобальных индексов и индексов владельцев при выпуске, передаче и сжигании требуются дополнительные операции записи в хранилище.Бесплатны ли запросы перечисления?
Офчейн-запросы через RPC не требуют оплаты ончейн-газа, но вызовы смарт-контрактов в ходе транзакции расходуют газ.Может ли контракт пройти циклом по всем перечисляемым NFT?
Он может попытаться это сделать, однако неограниченный ончейн-цикл со временем может превысить лимит газа блока.Предусматривает ли расширение пагинацию?
Нет. Приложения реализуют пагинацию, запрашивая выбранные диапазоны индексов.Перечисляет ли расширение всех держателей NFT?
Нет. Оно перечисляет ID токенов глобально и для известного владельца, но не возвращает уникальный список всех адресов владельцев.Может ли индексация событий заменить перечисление?
Да. Офчейн-индексатор может восстановить предложение токенов и информацию о владении по событиям ERC-721
Включает ли перечисление метаданные NFT?
Нет. Метаданные предоставляются отдельным необязательным расширением ERC-721.Доказывает ли перечисление подлинность NFT?
Нет. Любой может развернуть контракт с поддержкой Enumerable, поэтому пользователям необходимо проверить сеть, адрес контракта, эмитента и разрешения.Можно ли добавить перечисление после развертывания?
В обновляемый контракт его можно добавить, но существующие токены необходимо безопасно перенести в новые структуры индексов.Совместим ли ERC721Enumerable со всеми расширениями ERC-721?
Нет. Сжатый пакетный выпуск и пользовательские реализации баланса могут конфликтовать со стандартным хранилищем перечисления.Когда расширение Enumerable особенно полезно?
Оно особенно полезно, когда контрактам или приложениям нужен стандартизированный ончейн-доступ к текущему списку токенов или ID токенов владельца.Заключение
Расширение Enumerable — необязательная функция ERC-721, которая позволяет находить ID NFT-токенов с помощью стандартизированных ончейн-запросов.ID его интерфейса —
Расширение добавляет функции
Вместо оплаты полного ончейн-перечисления крупные приложения часто используют события ERC-721
Вам также может быть интересно
ZK-Rollup
ZK-Rollup-as-a-Service
zk-SNARK
В тренде
Трендовые криптовалюты, которые в настоящее время привлекают значительное внимание рынка
ТОП по объему
Криптовалюты с наибольшим объемом торгов
Недавно добавленные
Криптовалюты недавно внесенные в листинг и доступные для торговли

