Без продуманной системы рарити коллекция из 10 000 токенов торгуется как однородная масса, где цена определяется только floor price. С правильной системой top-1% коллекции стоит в 10–50 раз дороже floor — это прямо влияет на ликвидность и интерес трейдеров. Задача состоит из двух частей: off-chain генерация и ранжирование, и on-chain верификация через Merkle tree или хранение в metadata. Мы разрабатываем такие системы под ключ: от выбора алгоритма до интеграции с маркетплейсами. Более 5 лет на рынке, десятки завершённых NFT-проектов — наш опыт гарантирует прозрачность каждого этапа.
Как выбрать алгоритм rarity score?
Statistical rarity (метод Rarity Tools)
Классический подход: для каждого атрибута считается частота появления в коллекции. Score = сумма 1 / trait_frequency по всем атрибутам токена.
# Псевдокод расчёта for nft in collection: score = 0 for trait_type, trait_value in nft['attributes']: frequency = count(trait_value) / total_supply score += 1 / frequency nft['rarity_score'] = score Проблема statistical rarity: trait count bias. Токен с 10 обычными атрибутами может получить более высокий score, чем токен с 5 атрибутами, один из которых уникальный (1/10000). Это counterintuitive для пользователей.
Information content rarity (метод Rarity Sniper)
Использует information-theoretic подход: каждый атрибут вносит вклад пропорционально его информационному содержанию -log2(probability).
IC(trait) = -log2(count(trait) / total_supply) Information content rarity превосходит statistical rarity в 2–3 раза по справедливости ранжирования — не страдает от trait count bias.
Нормализованный score для single-attribute rarities
Если в коллекции есть trait типа "background" с 20 вариантами и trait "special" с 2 вариантами (один из которых встречается в 1 токене), нормализация позволяет сравнивать вклад разных trait types на единой шкале:
normalized_score(trait) = rarity_score(trait) / max_rarity_score(trait_type) Почему важна on-chain верификация?
Генерация и расчёт (off-chain)
Python-скрипт с тремя этапами:
- Trait analysis — парсинг всех JSON metadata, построение частотной таблицы по каждому trait_type/trait_value
- Score calculation — выбранный алгоритм, нормализация, ранжирование
- Output — обновлённые JSON файлы с добавленными полями
rarity_score,rarity_rank
Ключевой момент: metadata обновляется до загрузки на IPFS. После pin на IPFS CID фиксирован — изменить rarity score без смены CID нельзя. Прозрачность и неизменность — обязательные условия доверия к проекту.
Merkle-based on-chain верификация
Для проектов, которые хотят on-chain верификацию rarity (например, для выдачи бонусов top-100 холдерам):
// Merkle proof верификация rarity rank function verifyRarityRank( uint256 tokenId, uint256 rank, bytes32[] calldata proof ) external view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(tokenId, rank)); return MerkleProof.verify(proof, rarityMerkleRoot, leaf); } Затраты на газ при on-chain верификации через Merkle tree составляют менее $10 за апдейт — экономия порядка 90% по сравнению с полным хранением.
API для агрегаторов
Rarity Tool, Rarity Sniper, OpenSea — все они читают metadata из tokenURI(). Важно корректно форматировать поле attributes:
{ "attributes": [ {"trait_type": "Background", "value": "Gold"}, {"trait_type": "Eyes", "value": "Laser"}, {"display_type": "number", "trait_type": "Rarity Rank", "value": 42}, {"display_type": "number", "trait_type": "Rarity Score", "value": 847.3} ] } display_type: "number" позволяет OpenSea и другим маркетплейсам показывать rarity rank как числовое поле с сортировкой.
Сравнение алгоритмов rarity score
| Метод | Достоинства | Недостатки | Когда использовать |
|---|---|---|---|
| Statistical rarity | Простота, широкая поддержка | Trait count bias | Коллекции с равным числом атрибутов |
| Information content rarity | Без bias, математически справедлив | Сложнее для понимания | Коллекции с переменным числом атрибутов |
| Normalized score | Удобство сравнения | Зависит от max score | Single-attribute rarities |
Этапы и сроки разработки
| Этап | Длительность | Результат |
|---|---|---|
| Анализ trait structure | 0.5–1 день | Выбор алгоритма, частотная таблица |
| Разработка скрипта | 1–2 дня | Python pipeline, CSV, JSON с rank |
| On-chain компонент (если нужен) | 1 день | Merkle tree, контракт верификации |
| Интеграция с маркетплейсами | 0.5 дня | Проверка отображения на OpenSea, Blur |
Посмотреть код расчёта (Python-псевдокод)
for nft in collection: score = 0 for trait_type, trait_value in nft['attributes']: frequency = count(trait_value) / total_supply score += 1 / frequency nft['rarity_score'] = score Типичные ошибки при разработке rarity системы
- Trait count не учтён. Токены с разным числом атрибутов (у некоторых NFT может не быть определённых trait_type) получают несправедливый score. Решение:
Noneкак отдельное значение с частотой появления. - Score рассчитан до финальной генерации. Если художник добавил новые варианты после расчёта score — вся таблица невалидна. Рarity рассчитывается единожды по финальной коллекции, до любых изменений.
- Отсутствие тай-брейкера. Токены с одинаковым score получают одинаковый rank. Стандартный подход — тай-брейк по tokenId (меньший ID = более высокий rank при равных score).
Что входит в работу
- Документация по алгоритму и процессу расчёта
- Обновлённые JSON metadata с rarity score и rank
- CSV-экспорт редких токенов
- Merkle tree и контракт верификации (при необходимости)
- Поддержка после внедрения в течение 2 недель
Сроки: 2–3 дня для коллекции до 10 000 токенов. Для более крупных коллекций или нестандартных алгоритмов — до 5 дней. Стоимость рассчитывается после анализа структуры коллекции. Напишите нам — оценим ваш кейс и предложим оптимальное решение.







