Идентифицируйте токен вместе с сетью и контрактом
В ERC-721 номер tokenId различает токены внутри соответствующего контракта. Один и тот же номер может встречаться в разных контрактах. Поэтому запись только о токене номер семь не определяет уникальный объект для системы, работающей с несколькими коллекциями или сетями. Для учебного учёта сохраняйте сеть, адрес контракта и номер токена отдельно. Событие Transfer сообщает об изменении владения в рамках стандарта, но его получение не следует путать с ценой, продажей или гарантированной экономической ценностью. Передача может происходить в разных обстоятельствах, а дополнительные выводы требуют других данных.
Храните сообщение и результат его обработки
Если одно и то же событие получено повторно, оно не должно создавать второй самостоятельный результат. Для различения записей полезны данные сети, блока, транзакции и позиции события в журнале. Одного хеша транзакции недостаточно, если она содержит несколько событий. Локальный журнал помогает понять, что уже обработано и на основании каких сведений изменено состояние. При этом повтор одинаковой записи и новое событие о том же токене являются разными случаями. Идентификатор токена не подходит как единственный ключ для удаления дублей: один NFT может законно передаваться много раз.
Учитывайте изменение недавней истории
При реорганизации цепочки ранее полученные журнальные записи могут относиться к блоку, который больше не входит в актуальную ветвь. В уведомлениях о логах предусмотрен признак removed. Его нельзя игнорировать или просто отбрасывать как ещё один дубликат: последствия прежней обработки требуют пересмотра. Также подписка на текущие события не заменяет восстановление пропущенной истории после разрыва соединения. Система должна знать, какой участок проверен, уметь перечитать нужный диапазон и сверить актуальное состояние. Для значимых действий отдельно учитывают окончательность блоков. Учебный наблюдатель не должен автоматически превращаться в систему необратимых финансовых операций.
Попробуйте на практике
Проверьте бумажный журнал вымышленного NFT без реального кошелька, адресов, ключей и подключения к сети.
- Создайте условный идентификатор: учебная сеть, контракт К и токен семь. Начальным владельцем назначьте участника А, явно пометив все сведения как вымышленные.
- Добавьте событие Е1 о передаче от А к Б и затем повтор того же Е1. Запишите, почему второе получение не является новой передачей и не создаёт дополнительного результата.
- Отметьте Е1 как удалённое из актуальной ветви после условной реорганизации. Пересмотрите основанное на нём состояние, вместо того чтобы игнорировать изменение статуса записи.
- Добавьте новое событие Е2 актуальной ветви о передаче от А к В. Проверьте итог по последовательности действующих записей и запишите, какие сведения потребовались бы для независимой сверки.
Как проверить результат. Повтор Е1 учтён один раз, его удаление пересмотрено, а итоговый учебный владелец В основан на Е2. Номер токена не использован вместо идентификатора отдельного события.
Частые вопросы
Каждое событие Transfer означает продажу?
Нет. Оно относится к изменению владения в рамках стандарта. Для вывода об оплате и её условиях нужны дополнительные сведения.
Почему нельзя просто слушать уведомления бесконечно?
Соединение может прерваться, и подписка не выдаёт автоматически всю пропущенную историю. Нужен отдельный план восстановления и сверки.
Дедупликация решает проблему реорганизации?
Нет. Она предотвращает повтор одного результата, а реорганизация меняет применимость ранее полученных данных. Эти ситуации требуют разной обработки.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.