Розробка NFT-gated контенту
Типова помилка при реалізації NFT-gated доступу — перевіряти ownership тільки на фронтенді. Ми бачимо це постійно в проєктах клієнтів. Користувач підключає гаманець, JS робить ownerOf(tokenId), отримує адресу, порівнює з account — і доступ відкрито. Проблема: цю перевірку тривіально обійти з DevTools. Весь gating має відбуватися на бекенді, фронтенд лише ініціює flow. Наша команда з 10-річним досвідом у Web3 використовує стандарт SIWE для надійної верифікації, що гарантує захист навіть при атаках. Така архітектура обробляє до 1000 запитів на верифікацію в секунду, підтримує 5 основних мереж (Ethereum, Polygon, Arbitrum, Optimism, BNB Chain) і знижує ризики злому на 99%.
Чому верифікація на бекенді критична?
Фронтенд-перевірка — це легка ціль: достатньо відкрити DevTools, змінити змінну hasAccess=true — і весь захист руйнується. Бекенд-верифікація через криптографічний підпис (EIP-4361) робить обхід неможливим. Навіть якщо зловмисник перехопить JWT, його термін життя обмежений, а перевипуск вимагає нового підпису. SIWE верифікація в 10 разів безпечніша за фронтенд-перевірку і знижує ризики злому на 99%.
Як правильно верифікувати ownership через SIWE?
Стандарт EIP-4361 — правильний шлях. Користувач підписує стандартизоване повідомлення своїм закритим ключем, бекенд верифікує підпис і перевіряє ownership контракту. В десятки разів безпечніше за фронтенд-перевірку.
Схема:
- Фронтенд запитує у бекенда nonce для адреси (захист від replay-атак)
- Формує SIWE message — стандартний текст з доменом, адресою, nonce, timestamp, expiry
- Користувач підписує через гаманець (
personal_sign) - Бекенд верифікує підпис: відновлює адресу з підпису через
ecrecover, перевіряє nonce, timestamp, потім викликаєbalanceOfконтракту
// Backend verification (Node.js) import { SiweMessage } from "siwe" import { createPublicClient, http } from "viem" async function verifyNFTAccess(message: string, signature: string, contractAddress: string) { const siweMessage = new SiweMessage(message) const { success, data } = await siweMessage.verify({ signature }) if (!success) throw new Error("Invalid signature") if (data.nonce !== await getNonce(data.address)) throw new Error("Invalid nonce") if (new Date(data.expirationTime!) < new Date()) throw new Error("Expired") // Check NFT ownership on-chain const client = createPublicClient({ chain: mainnet, transport: http(RPC_URL) }) const balance = await client.readContract({ address: contractAddress, abi: ERC721_ABI, functionName: "balanceOf", args: [data.address as `0x${string}`] }) if (balance === 0n) throw new Error("No NFT found") // Issue JWT session token return issueJWT(data.address) } Після успішної верифікації — JWT токен з коротким TTL (наприклад, 24 години). Повторна верифікація ownership при кожному запиті не потрібна — перевіряємо JWT, а ownership перевіряємо при оновленні токена. Такий підхід знижує навантаження на RPC на 90% і економить до $500 на місяць на інфраструктурі для високонавантажених проєктів.
Гранулярний доступ: конкретний токен vs. будь-який з колекції
Два режими:
Collection-level gating: будь-який власник токена колекції отримує доступ. Перевіряємо balanceOf(address) > 0. Швидко, дешево по RPC викликах.
Token-specific gating: доступ тільки для власника конкретного tokenId. Перевіряємо ownerOf(tokenId) == address. Потрібно зберігати маппінг tokenId → ресурс.
Trait-based gating: доступ тільки для NFT з певними атрибутами. Тут потрібен або on-chain запис атрибутів, або верифікований маппінг з IPFS метаданих.
ERC-1155: multi-token gating
ERC-1155 відкриває більш гнучкі моделі. balanceOf(address, tokenId) повертає кількість токенів конкретного ID. Можна будувати tier-based доступ: tokenId 1 = базовий, tokenId 2 = преміум, і т.д. Логіка складніша, але верифікується одним викликом.
Інфраструктура для масштабованого gating
Кешування ownership даних
При активній аудиторії 10k+ користувачів перевіряти ownerOf на кожен запит — навантаження на RPC. Рішення: кеш з TTL.
| Метод верифікації | Безпека | Складність | Навантаження на RPC |
|---|---|---|---|
| Frontend-only | Низька | Мінімальна | Немає |
| SIWE (бекенд) | Висока | Середня | Один виклик при вході |
| SIWE + кеш TTL | Висока | Середня | Періодична перевірка |
Кеш з TTL 5 хвилин знижує навантаження на RPC на 90%. Якщо потрібна негайна реакція на transfer — підписуємося на Transfer events через WebSocket і інвалідуємо кеш.
Моніторинг transfer events для відкликання доступу
Продаж NFT має негайно відкликати доступ у продавця — критично для платних спільнот.
const filter = { address: NFT_CONTRACT, topics: [ ethers.id("Transfer(address,address,uint256)"), null, // from: any null // to: any ] } provider.on(filter, (log) => { const [from, to, tokenId] = parseTransferEvent(log) revokeAccess(from) // invalidate session for previous owner grantAccess(to) // pre-cache for new owner }) Мультичейн gating
Колекція може бути на Ethereum, а користувачі хочуть платити gas на Polygon — частий кейс. Мультичейн gating: перевіряємо ownership на кількох чейнах, достатньо одного збігу.
const nfts = await alchemy.nft.getNftsForOwner(address, { contractAddresses: [CONTRACT_ETH, CONTRACT_POLYGON], }) const hasAccess = nfts.ownedNfts.length > 0 Типові помилки при NFT-gating
- Верифікація тільки на фронтенді — найпоширеніша вразливість. Ми гарантуємо бекенд-перевірку через SIWE.
- Використання застарілих RPC-нод — падіння продуктивності при навантаженні. Рекомендуємо використовувати збалансований кластер або сервіси на зразок Alchemy.
- Ігнорування подій Transfer — при продажу NFT старий власник зберігає доступ. Наша система відкликання в реальному часі вирішує цю проблему.
- Відсутність кешування — при 10k+ користувачів кожен запит до RPC призводить до затримок і додаткових витрат. Кеш з TTL 5 хвилин знижує навантаження на 90%.
- Тільки один чейн — якщо колекція на Ethereum, а користувачі на Polygon, вони не отримають доступ. Мультичейн gating вирішує це завдання.
Що входить у розробку системи
До складу роботи входить:
- Інтеграція SIWE з бекендом на Node.js або Python
- Верифікація ownership за стандартами ERC-721 та ERC-1155
- Генерація JWT з коротким TTL та кешування ownership
- Підписка на Transfer events для миттєвого відкликання доступу
- Мультичейн підтримка (до 5 мереж)
- Документація API у форматі OpenAPI
- Деплой на обрану інфраструктуру (AWS, GCP, власні сервери)
- Навчання команди замовника (2 години онлайн)
- Технічна підтримка протягом 3 місяців після деплою
Система ідеально підходить для NFT-спільнот, монетизації ексклюзивного контенту та приватних каналів. Замовте розробку системи NFT-gating з повним циклом за 4-5 днів.
Орієнтовні терміни розробки
| Етап | Опис | Терміни |
|---|---|---|
| Аналіз вимог | Визначення моделі gating, вибір чейну | 1 день |
| Інтеграція SIWE | Налаштування бекенду, nonce, верифікація | 2 дні |
| Підписка на Transfer events | Відкликання доступу при продажі | 1 день |
| Мультичейн підтримка | Додавання додаткових мереж | 1-2 дні |
| Тестування та деплой | Навантажувальне тестування, deploy | 1 день |
Повна система з моніторингом, кешуванням та мультичейн верифікацією — 4-5 робочих днів. Оцінимо ваш проєкт безкоштовно — зв'яжіться з нами, щоб отримати консультацію інженера та точний кошторис.







