Разработка инструмента оценки рарити NFT
Когда пользователь смотрит на свой токен из коллекции в 10 000 штук, первый вопрос — насколько он редкий. "Редкий" кажется очевидным понятием, но за ним стоит нетривиальная математика: разные алгоритмы расчёта дают разные рейтинги для одного и того же токена, и выбор методологии прямо влияет на воспринимаемую стоимость.
Методологии расчёта рарити
Trait Rarity Score — базовый и самый распространённый подход. Для каждого атрибута токена берём его редкость: 1 / (count_of_tokens_with_this_trait / total_supply). Итоговый score — сумма по всем трейтам. Проблема: коллекции с разным числом атрибутов несравнимы, а токены с большим количеством трейтов получают преимущество просто за счёт их количества.
Statistical Rarity — произведение вероятностей трейтов. Токен редок только если все его атрибуты редки одновременно. Это интуитивно честнее, но математически подавляет токены с одним экстремально редким трейтом.
Jaccard Distance / Information Content — более академические подходы, используемые в инструментах типа Rarity Sniper и трекерах на базе rarity.tools. Information Content вычисляет −log2(p) для каждого трейта, что даёт более сбалансированное распределение без взрывного роста score для единственных трейтов.
Trait Normalization — корректировка на среднее количество трейтов в коллекции. Если средний токен имеет 5 атрибутов, а конкретный — 8, его score делится на поправочный коэффициент. Реализовано в OpenRarity — открытом стандарте, который сейчас активно продвигает OpenSea.
Для серьёзного инструмента имеет смысл показывать несколько методологий параллельно — пользователь сам выбирает, какой считать авторитетным.
Источники данных и индексирование
Метаданные NFT-коллекций хранятся либо в IPFS (CID коллекции), либо на централизованных серверах (через tokenURI). Для расчёта рарити нужно скачать и распарсить метаданные всей коллекции.
Стратегия сбора данных:
- Читаем
contractURIилиtokenURI(0..n)из контракта через batch RPC calls (eth_call multicall через Multicall3) - Для IPFS — резолвим gateway (Cloudflare IPFS, Pinata, или собственный IPFS-нод) и скачиваем JSON батчами
- Обрабатываем edge-cases: токены с
nullтрейтами (считаются как отдельный атрибут "None"), трейты с числовыми значениями (требуют бининга или отдельной обработки), metadata refresh после reveal
Индекс строим в PostgreSQL или Redis: таблица token_traits(collection_id, token_id, trait_type, trait_value) + агрегаты по каждому трейту. Пересчёт рарити после обновления метаданных — инкрементальный.
Реализация и API
Бэкенд-сервис на Node.js/Go принимает адрес контракта, определяет цепочку (через chainId), загружает и индексирует коллекцию, вычисляет scores по выбранным методологиям. Результат — эндпоинт /rarity/{contract}/{tokenId} с полным breakdown по трейтам.
Фронтенд отображает:
| Атрибут | Значение | Встречается | Рарити score |
|---|---|---|---|
| Background | Cosmic Purple | 3.2% | 31.25 |
| Eyes | Laser | 0.8% | 125.0 |
| Mouth | Gold Grill | 1.5% | 66.67 |
Плюс итоговый ранг токена в коллекции и перцентиль редкости.
Важная деталь: кэшируем результаты агрессивно. Метаданные коллекции после reveal не меняются — TTL можно ставить очень большим. Первый расчёт коллекции на 10k токенов занимает секунды, повторные запросы — миллисекунды.
Интеграция с маркетплейсами
Если инструмент встраивается в уже существующий маркетплейс или NFT-дашборд, рарити-score передаётся как атрибут при отображении токена. OpenRarity предоставляет npm-пакет @openrarity/rarity-scorer для клиентской интеграции без собственного бэкенда — подходит для небольших коллекций, которые полностью помещаются в память браузера.







