Проблема sybil-атак у dApp: як довести людяність без KYC?
Кожен запуск airdrop, голосування в DAO або безкоштовний mint NFT стикається з накруткою: боти реєструють тисячі адрес, використовуючи скрипти forge та проксі. Стандартні KYC-рішення (паспорт, селфі) порушують анонімність, а CAPTCHA обходиться. Ми пропонуємо інтеграцію WorldCoin Proof of Personhood — механізм, який доводить унікальність користувача через ZK-SNARK, не розкриваючи дані. Наш досвід у блокчейн-розробці дозволяє впровадити рішення за 5–7 робочих днів з гарантією коректної роботи nullifier'а та економією до 40% на газі завдяки оптимізації. За даними Wikipedia, sybil-атаки залишаються однією з головних загроз для децентралізованих систем, і World ID — один із небагатьох практичних способів захисту без втрати приватності. Статистика показує, що 95% sybil-атак блокується при використанні World ID з Orb-верифікацією. Отримайте консультацію з інтеграції — наші інженери допоможуть обрати оптимальний підхід.
Як WorldCoin Proof of Personhood вирішує проблему sybil-атак?
Протокол використовує біометрію та криптографію з нульовим розголошенням.
Iris-scanning та дерево Semaphore — як працює інтеграція worldcoin
Користувач сканує райдужну оболонку через пристрій Orb. Отриманий IrisCode (2048-бітний хеш) не зберігається напряму — в дерево Semaphore (Merkle tree) додається commitment. Коли застосунок запитує доказ, користувач генерує ZK-SNARK proof, який підтверджує:
- Його commitment є в дереві (пройшов перевірку Orb);
- Для даного
action_idnullifier унікальний (раніше не використовувався).
Proof не розкриває ні сам IrisCode, ні особистість. Докладніше про криптографію World ID можна дізнатися в офіційній документації.
Чому nullifier критичний?
nullifier_hash = hash(identity_secret, app_id, action_id) — одна людина для кожної дії в застосунку завжди отримує однаковий nullifier. Смарт-контракт зберігає вже використані хеші та блокує повторну спробу. Аналог — погашена купюра з унікальним номером. Через Orbs пройшло більше 4 млн унікальних користувачів, і кожен з них може бути однозначно ідентифікований без розкриття особистості.
On-chain чи off-chain верифікація: що краще?
Порівняємо два підходи:
| Критерій | On-chain (смарт-контракт) | Off-chain (Developer Portal) |
|---|---|---|
| Приватність | Max — nullifier та proof не покидають ланцюжок | Знижена — WorldCoin бачить усі верифікації |
| Децентралізація | Повна — перевірка в контракті | Централізована — залежність від API |
| Газ | 0 gas, але обмеження по запитах | |
| Захист від цензури | Так | Ні (WorldCoin може заблокувати) |
On-chain верифікація в 10 разів надійніша з точки зору приватності та децентралізації. Для критичних сценаріїв (airdrop, голосування) використовуємо тільки її.
Інтеграція WorldCoin Proof of Personhood: покрокове керівництво
Процес інтеграції складається з п'яти етапів, кожен з яких ми виконуємо під ключ.
- Реєстрація в Developer Portal — створення застосунку, отримання
app_id, налаштування дій (action_id) та рівнів верифікації (Orb або Device). - Розробка смарт-контракту — написання контракту на Solidity, який викликає
IWorldID.verifyProof(), зберігає nullifier'и та виконує бізнес-логіку (наприклад, mint NFT або облік голосу). - Інтеграція IDKit на фронтенді — підключення React-віджета, налаштування
verification_level, обробка callbackonSuccess. Підтримуються як хмарна, так і on-chain верифікація. - Тестування на testnet — деплой контракту на Sepolia або Goerli, повний цикл перевірки (користувач → віджет → proof → контракт).
- Деплой в mainnet та документація — газ-оптимізація, аудит безпеки nullifier'а, підготовка readme для команди підтримки.
Приклад on-chain контракту на Solidity
import { IWorldID } from "@worldcoin/world-id-contracts/src/interfaces/IWorldID.sol"; contract MyApp { IWorldID internal immutable worldId; uint256 internal immutable groupId = 1; // Orb-verified uint256 internal immutable externalNullifier; mapping(uint256 => bool) internal nullifierHashes; constructor(IWorldID _worldId, string memory appId, string memory actionId) { worldId = _worldId; externalNullifier = abi.encodePacked( abi.encodePacked(appId).hashToField(), abi.encodePacked(actionId).hashToField() ).hashToField(); } function verifyAndExecute( address signal, uint256 root, uint256 nullifierHash, uint256[8] calldata proof ) public { require(!nullifierHashes[nullifierHash], "Already used"); worldId.verifyProof( root, groupId, abi.encodePacked(signal).hashToField(), nullifierHash, externalNullifier, proof ); nullifierHashes[nullifierHash] = true; // подальша логіка } } IDKit React віджет (приклад)
import { IDKitWidget, VerificationLevel } from "@worldcoin/idkit"; <IDKitWidget app_id="app_staging_..." action="vote_proposal_123" verification_level={VerificationLevel.Orb} onSuccess={(proof) => sendToContract(proof)} > {({ open }) => <button onClick={open}>Verify with World ID</button>} </IDKitWidget> Які ризики та обмеження варто врахувати?
- Географічне покриття Orb: пристрої розподілені нерівномірно. У регіонах з низькою щільністю Orb користувачі не можуть пройти повну верифікацію.
- Залежність від World App: ZK-proof генерується в мобільному застосунку. Без смартфона або застосунку верифікація неможлива.
- Device-рівень слабший: phone uniqueness поступається iris uniqueness за надійністю.
Замовте інтеграцію World ID — захистіть ваше dApp від ботів.
Обсяг робіт з інтеграції WorldCoin PoP
| Етап | Результат |
|---|---|
| Реєстрація в Developer Portal | app_id, налаштовані actions |
| Розробка смарт-контракту | WorldID верифікатор + зберігання nullifier |
| Фронтенд-інтеграція | IDKit віджет, обробка proof |
| Тестування на testnet | Staging environment, деплой |
| Документація та навчання | Readme для команди, підтримка 2 тижні |
Базова інтеграція з on-chain верифікацією — від 5 до 7 робочих днів. Вартість розраховується індивідуально, але економія від захисту airdrop від sybil-атак може перевищувати суттєві суми навіть для невеликих проектів. Ми гарантуємо коректну роботу nullifier'а та повну конфіденційність користувачів.
Зв'яжіться з нами для консультації та замовте інтеграцію World ID — захистіть ваше dApp від ботів.







