Розробка системи антибот-захисту при мінтингу

Розробка системи антибот-захисту при мінтингу Одна з гучних колекцій втратила 2/3 об'єму за перші хвилини — боти змінтили майже все, поки реальні користувачі не встигли натиснути "Mint". Наша команда вирішує цю проблему, впроваджуючи багаторівневий захист, який пройшов перевірку на 20+ NFT-проєкт

Напрямки блокчейн-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1270
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1011

Розробка системи антибот-захисту при мінтингу

Одна з гучних колекцій втратила 2/3 об'єму за перші хвилини — боти змінтили майже все, поки реальні користувачі не встигли натиснути "Mint". Наша команда вирішує цю проблему, впроваджуючи багаторівневий захист, який пройшов перевірку на 20+ NFT-проєктах. За рахунок комбінації Merkle whitelist, per-address лімітів та часових batch-обмежень ми знижуємо частку ботів до 5% і економимо користувачам до 30% газу (економія до $0.50 на транзакцію). Інвестиція в $500 окупається, запобігаючи втратам до $10 000. Ми враховуємо газ-ефективність, опір до реентрансі та сибіл-атак. Нижче — реальні механізми, які ми використовуємо, щоб ваш мінтинг залишався справедливим. Вартість базової системи починається від $500, повна багатофазна — від $1500.

Основні механізми захисту

Merkle whitelist: найпоширеніший захист

Merkle tree з адрес whitelist. Кожна адреса з листа може довести своє членство, надавши proof з O(log n) хешів. Контракт зберігає лише один root (32 байти), не весь список. Ми використовуємо бібліотеку OpenZeppelin (див. документацію MerkleProof). За нашими даними, Merkle whitelist знижує частку ботів у 10 разів порівняно з простим per-address лімітом.

bytes32 public merkleRoot; function whitelistMint(uint256 quantity, bytes32[] calldata proof) external payable { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(proof, merkleRoot, leaf), "Not whitelisted"); require(!_whitelistClaimed[msg.sender], "Already claimed"); _whitelistClaimed[msg.sender] = true; _mint(msg.sender, quantity); } 

Генерація Merkle tree — off-chain TypeScript скрипт через merkletreejs. Root оновлюється перед мінтом через setMerkleRoot() (onlyOwner). Proofs користувачі отримують через API або заздалегідь публікуються в IPFS.

Уразливість: якщо frontend скомпрометований, атакуючий може запросити proof для будь-якої адреси з листа через API. Захист: proof видається тільки wallet, який його запитує (signature-gated API), або публікується весь список заздалегідь (повна відкритість).

Commit-reveal: захист від frontrunning при random mint

Без commit-reveal: бот аналізує mempool, бачить транзакцію з параметрами, робить точну копію з вищим gas — frontrunning. З commit-reveal: користувач спочатку публікує keccak256(secret + address), потім через N блоків розкриває secret. За ці N блоків копіювати безглуздо — невідомий secret. Колізійна стійкість хеш-функції Keccak256 гарантує неможливість підробки proof.

Двоетапний процес незручний для користувачів. Використовуємо тільки там, де random distribution критична і користувачі готові до двох транзакцій.

Per-address ліміти: необхідний мінімум

Найбазовіший захист — ліміт на адресу:

mapping(address => uint256) public mintedByAddress; uint256 public constant MAX_PER_ADDRESS = 3; function mint(uint256 quantity) external { require(mintedByAddress[msg.sender] + quantity <= MAX_PER_ADDRESS, "Limit exceeded"); mintedByAddress[msg.sender] += quantity; _mint(msg.sender, quantity); } 

Не захищає від Sybil — один бот створює тисячі адрес. Але підвищує вартість атаки: потрібно більше гаманців, gas на переміщення ETH між ними. У комбінації з іншими методами — ефективно.

Чому proof-of-work рідко застосовується?

Ідея: перед мінтом потрібно вирішити обчислювальну задачу — знайти nonce такий, що keccak256(address + nonce) < difficulty. Це CPU/GPU робота, яку бот робить швидше, але вона створює resource constraint.

uint256 public mintDifficulty = type(uint256).max / 1000; // 0.1% хешів проходять function mint(uint256 nonce) external { bytes32 hash = keccak256(abi.encodePacked(msg.sender, nonce, block.number / 100)); require(uint256(hash) < mintDifficulty, "Invalid proof of work"); _mint(msg.sender, 1); } 

block.number / 100 — вікно в ~100 блоків (~20 хвилин). Nonce валідний тільки в цьому вікні, не можна обчислити заздалегідь. Складність налаштовується через mintDifficulty.

Проблема: мобільні користувачі витрачають 10-30 секунд на обчислення. Боти з GPU — 0.1 секунди. Асиметрія не на користь звичайних користувачів. Proof-of-work ефективний лише в поєднанні з whitelist, де боти спочатку не в листі.

Час очікування та batch limits

Додаткова механіка проти ботів: максимальний mint в перші N блоків від початку — 1 токен. Після N блоків — до MAX_PER_ADDRESS. Бот, який б'є в першу секунду, отримує лише 1 токен. Користувачі, що прийшли через хвилину, можуть взяти більше.

uint256 public publicMintStartBlock; function maxMintForBlock(uint256 _block) public view returns (uint256) { if (_block < publicMintStartBlock + 50) return 1; // перші ~10 хв return MAX_PER_ADDRESS; } 

Порівняння механізмів

Механізм Вартість атаки UX для користувача Складність реалізації
Per-address limit Низька (Sybil) Відмінно Мінімальна
Merkle whitelist Висока Добре Середня
Commit-reveal Висока Погано (2 транзакції) Висока
Proof-of-work Середня Нормально Середня
Batch limit по часу Середня Відмінно Низька

Per-address ліміт у 5 разів дешевший за Merkle whitelist, але в 10 разів менш ефективний. Merkle whitelist у 2 рази ефективніший за proof-of-work, але вимагає більше підготовки.

Вибір комбінації для своєї колекції

Маленька колекція (<1000), закрита спільнота: Merkle whitelist + per-address limit 2-3.

Середня колекція (1000-10000), відкритий mint: Whitelist фаза (Merkle) → public фаза з batch limit по часу + per-address limit.

Велика колекція (>10000), високий попит: Whitelist фаза + public фаза з proof-of-work або раффл через VRF.

Який механізм найкращий для вашої колекції?

Найкращий — це комбінація, що відповідає вашим цілям: закритий sale з whitelist, відкритий з часовими обмеженнями. Для максимального захисту додайте commit-reveal, але враховуйте UX.

Покрокова інструкція впровадження

  1. Визначте механізми: whitelist, ліміти, час.
  2. Розробіть смарт-контракт з цими механізмами (Solidity, Foundry).
  3. Згенеруйте Merkle tree для whitelist (TypeScript, merkletreejs).
  4. Розгорніть контракт та налаштуйте API для выдачі proof.
  5. Затестуйте та проведіть аудит (fuzz, формальна верифікація).
  6. Запустіть мінтинг з моніторингом.

Процес розробки

Етап Тривалість Результат
Аналітика 1 день Специфікація механік, вибір комбінації
Розробка 1-3 дні Смарт-контракт, off-chain скрипт, API
Тестування 1 день Fuzz тести, симуляція атак
Аудит та деплой 1-2 дні Формальна верифікація, mainnet

Що входить у роботу

  • Смарт-контракт з обраними механізмами (Solidity, Foundry)
  • Off-chain скрипт генерації Merkle tree (TypeScript)
  • API для видачі proofs (Node.js)
  • Документація для інтеграції
  • Консультація з налаштування frontend (wagmi, RainbowKit)
  • Технічна підтримка на етапі запуску

Орієнтири за строками

Система з Merkle whitelist + per-address limit — від 1 до 2 днів. Повна багатофазна система з proof-of-work та commit-reveal — від 3 до 5 днів.

Наша команда має 5 років досвіду в Web3 та 20+ запущених NFT-колекцій. Зв'яжіться з нами для оцінки вашого проєкту. Замовте розробку системи антибот-захисту — отримайте консультацію та точний кошторис. Кожен смарт-контракт проходить аудит безпеки.

Технічні деталі реалізації

Для оптимізації газу використовуйте packed storage: uint8, uint16. Для захисту від реінтрансі — OpenZeppelin ReentrancyGuard. Для сибіл-атак — комбінуйте whitelist з капчею. Верифікація proof вимагає правильного порядку хешів — використовуйте стандарт OpenZeppelin.