WorldCoin інтеграція (Proof of Personhood)
WorldCoin вирішує одну з фундаментальних проблем Web3: як довести що за адресою стоїть унікальна жива людина, без розкриття ідентичності. Стандартні KYC системи вимагають паспорт та прив'язують адресу до реальної людини. WorldCoin використовує iris-scanning та zero-knowledge proof для підтвердження людської природи без деанонімізації.
Як працює World ID
Iris-based біометрія та ZK-proof
Користувач проходить сканування радужної оболонки через Orb пристрій. Зі скану формується IrisCode — 2048-бітний хеш біометричних даних. IrisCode не зберігається відкрито: у Semaphore-дереві (Merkle tree) додається leaf з commitment користувача.
Коли користувач доводить унікальність додатку, генерує ZK-SNARK proof, що доводить:
- Commitment користувача в дереві (пройшов Orb верифікацію)
- Користувач ще не використав World ID для даної
action(nullifier унікальний)
Proof не розкриває адресу, IrisCode чи зв'язок між різними додатками. Це selective disclosure у чистому вигляді.
Nullifier та захист від double-spend
Ключовий криптографічний примітив: nullifier_hash = hash(identity_secret, app_id, action_id). Одна людина для однієї action в одному додатку завжди генерує той же nullifier. Потрібно тільки зберігати вже використані nullifiers — перевіряємо що такого немає, додаємо, більше використовувати не можна.
Це аналог серійного номера в фізичному грошах — при погашенні купюри номер записується як "використаний". Без розкриття хто саме її погасив.
Технічна інтеграція
On-chain верифікація через WorldID контракт
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;
// подальша логіка
}
}
Off-chain верифікація через Developer Portal
Для Web2 бекенду — спрощений варіант без on-chain транзакції:
import { verifyCloudProof } from "@worldcoin/idkit";
const result = await verifyCloudProof(
proof, // з IDKit віджету
app_id,
action,
signal // опціональний
);
if (result.success) {
// користувач верифікований, nullifier вже позначений
}
Cloud верифікація простіша, але централізована — Developer Portal Worldcoin бачить всі верифікації вашого додатку. Для privacy-critical випадків — тільки on-chain.
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>
VerificationLevel.Device — нижчий рівень (без Orb, тільки phone верифікація), придатний для менш critical actions. VerificationLevel.Orb — повна біометрична верифікація.
Випадки використання та обмеження
Де застосовно
Захист airdrop від sybil: замість "1 адреса = 1 allocation" → "1 людина = 1 allocation". Nullifier прив'язаний до action (наприклад, claim_airdrop_season1) — повторна реєстрація іншою адресою не допоможе.
Governance: "1 людина = 1 голос" в DAO без довіри до token-weighted голосування.
Rate limiting: обмеження дій (безплатна trial, faucet) по-людськи, не по-адресно.
Certificate/credential системи: видання credential унікальному користувачу з можливістю його предʼявити без розкриття ідентичності.
Обмеження
Географічне покриття Orb: пристрої Orb неправномірно розподілені. У регіонах з низьким покриттям користувачі не можуть верифікуватися — реальне UX обмеження.
World App залежність: ZK proof генерується у World App (мобільному додатку). Користувач без смартфона або той що не хоче встановлювати додаток — не може верифікуватися. Для B2B та enterprise сценаріїв це проблема.
Device верифікація: менш строгий рівень, але phone унікальність — слабіша ніж iris унікальність.
Процес інтеграції
| Етап | Зміст | Час |
|---|---|---|
| Реєстрація в Developer Portal | Створення app_id, налаштування actions | 1 день |
| Smart contract | WorldID верифікатор + nullifier сховище | 2-3 дні |
| Frontend | IDKit віджет, обробка proof | 1-2 дні |
| Тестування | Staging environment, testnet deploy | 1-2 дні |
Базова інтеграція з on-chain верифікацією — 5-7 робочих днів. Вартість розраховується індивідуально.







