Розробка системи quest/task-платформи для крипто-проекту
Ми створюємо quest-платформи під ключ — від дизайну on-chain верифікації до розгортання смарт-контрактів для нагород. Основна біль замовника: як довести, що користувач виконав завдання, не довіряючи його словам? On-chain дії вимагають перевірки транзакцій через RPC, а off-chain — інтеграції OAuth. При цьому будь-який прорахунок у верифікації відкриває шлях для sybil-атак, коли один користувач накручує рейтинг сотнями гаманців.
На практиці верифікація транзакцій на Ethereum займає 2–5 секунд, а перевірка балансу токенів — до 10 секунд при завантаженості мережі. Для off-chain завдань, таких як підписка в Twitter, час перевірки не перевищує 1 секунди. Однак швидкісна верифікація не гарантує захист від накруток — тут потрібен комплексний підхід з використанням знімків стану та анти-sybil фільтрів.
Ми використовуємо комбінацію методів: для off-chain — OAuth 2.0 з PKCE (Twitter, Discord), для on-chain — виклики RPC через publicClient з підтвердженням подій. Кожен запит логується, а дані кешуються на 5 хвилин, щоб уникнути зайвих запитів до блокчейну.
Верифікація завдань: on-chain vs off-chain
Off-chain завдання
Twitter follow, Discord join, email підписка — верифікація через OAuth:
- Twitter: OAuth 2.0 з PKCE, перевірка через Twitter API v2 (
GET /2/users/:id/following) - Discord: OAuth2 + Discord Bot API для перевірки членства в сервері та наявності ролі
- Telegram: Telegram Login Widget + Bot API (
getChatMember)
Все це серверна логіка. Важливо зберігати OAuth токени зашифрованими та оновлювати їх — Twitter access token живе 2 години.
On-chain завдання
Це цікавіше та складніше. Типові категорії:
Holder verification — користувач повинен тримати X токенів або NFT певної колекції. Верифікація: balanceOf(address) виклик через RPC. Просто, але потрібно вирішити проблему часу перевірки — баланс міг бути на момент snapshot, а зараз немає.
Transaction verification — користувач зробив swap, надав ліквідність, зробив бридж. Верифікація через індексатор або RPC:
// Перевіряємо, чи робив адреса swap на Uniswap v3 за останні N днів const logs = await publicClient.getLogs({ address: UNISWAP_V3_ROUTER, event: parseAbiItem('event Swap(address indexed sender, address indexed recipient, ...)'), args: { recipient: userAddress }, fromBlock: BigInt(fromBlock), toBlock: 'latest', }) const completed = logs.length > 0 Contract interaction — користувач викликав конкретну функцію вашого контракту. Найнадійніший спосіб: emit event в контракті, індексуй його.
Порівняння on-chain та off-chain верифікації
| Критерій | Off-chain | On-chain |
|---|---|---|
| Час перевірки | <1 сек | 2-10 сек |
| Надійність | Середня (OAuth підробити можна) | Висока (незмінні дані) |
| Витрати на інфраструктуру | Низькі | Середні (RPC) |
Як захиститися від sybil-атак?
Головна проблема quest-платформ — sybil атаки. Одна людина створює 1000 гаманців, виконує всі завдання, збирає нагороди. Ми використовуємо комбінацію методів:
- Gitcoin Passport — score на основі Web2 та Web3 активності. API:
GET /registry/score/:address. Поріг score (наприклад, 15+) відсікає більшість sybil акаунтів. - Proof of Humanity / Worldcoin — biometric proof of unique human. Більш надійно, але friction для користувачів.
- On-chain activity score — перевіряємо вік гаманця, кількість транзакцій, наявність ETH/активів. Новий гаманець з нульовою історією — червоний прапорець.
- Rate limiting по IP + fingerprint — не бездоганно, але відсікає лінивих ботоводів.
Архітектура системи
Backend
REST API (Next.js API routes або Express) ├── /api/quests — список квестів, статус ├── /api/verify/:taskId — верифікація конкретного завдання ├── /api/claim — отримання нагороди після виконання всіх завдань └── /api/leaderboard — топ користувачів по XP База даних — PostgreSQL:
-
users: address, twitter_id, discord_id, passport_score -
quests: id, title, reward_type, reward_amount, requirements JSON -
task_completions: user_id, task_id, verified_at, proof JSON -
rewards_claimed: user_id, quest_id, tx_hash
Smart contract для нагород
Якщо нагорода — токени або NFT, потрібен контракт:
contract QuestRewards { mapping(address => mapping(uint256 => bool)) public claimed; function claimReward( uint256 questId, bytes32[] calldata merkleProof ) external { require(!claimed[msg.sender][questId], "Already claimed"); require( MerkleProof.verify(merkleProof, questRoots[questId], keccak256(abi.encodePacked(msg.sender))), "Invalid proof" ); claimed[msg.sender][questId] = true; token.transfer(msg.sender, questRewards[questId]); } } Merkle tree підхід: бекенд формує список eligible адрес, обчислює Merkle root, публікує його on-chain. Користувач отримує Merkle proof з сервера і клеймить сам, платячи gas. Це знижує навантаження на сервер та decentralizes claiming. Детальніше про Merkle tree можна прочитати в Wikipedia.
Frontend
Ключові екрани:
- Dashboard — активні квести, прогрес, накопичений XP
- Quest detail — список завдань зі статусами (locked/available/completed/claimed)
- Leaderboard — топ учасників, можна робити по тижнях/всього
- Profile — історія нагород, connected socials
UX-деталь: статус перевірки завдання не повинен бути синхронним. Користувач натиснув "Verify" — показуємо spinner, робимо запит на бекенд, бекенд перевіряє on-chain/off-chain дані, повертає результат. Типовий час — 2–5 секунд для on-chain verification.
Що входить в розробку під ключ?
| Компонент | Опис |
|---|---|
| Backend API | REST-сервер з PostgreSQL, інтеграція з Twitter/Discord/Telegram OAuth |
| Смарт-контракти | Контракт на Solidity 0.8.x з Merkle-дропом нагород |
| Anti-sybil | Підключення Gitcoin Passport, перевірка on-chain активності |
| Frontend | Next.js / React додаток з wallet connect (RainbowKit) |
| Документація | API-документація, інструкція з розгортання |
Наші інженери мають 10+ років досвіду в розробці смарт-контрактів та понад 50 успішних проектів у DeFi та NFT. Ми використовуємо Foundry для тестування контрактів та Tenderly для моніторингу.
Орієнтовні терміни
Базова система з кількома типами завдань та верифікацією — від 1 тижня. Повна платформа з anti-sybil, Merkle-based claiming та інтеграціями — до 2 тижнів. Точну оцінку дамо після аналізу ваших вимог.
Типові помилки при розробці quest-платформ
- Використання лише off-chain верифікації без on-chain — користувачі обманюють систему.
- Відсутність snapshot-логіки — нагороди отримують ті, у кого баланс був секунду.
- Синхронна верифікація — користувач чекає відповіді, інтерфейс зависає.
- Немає захисту від sybil — нагороди йдуть ботам.
Уникнути цих проблем допомагає правильна архітектура та досвід команди. Якщо ви розробляєте крипто-проект і хочете впровадити quest-систему, зв'яжіться з нами — оцінимо проект безкоштовно.







