Интеграция с WorldCoin (Proof of Personhood)
WorldCoin решает одну из фундаментальных проблем Web3: как доказать, что за адресом стоит уникальный живой человек, не раскрывая его личность. Стандартные KYC-системы требуют паспорт и привязывают адрес к реальной личности. WorldCoin использует iris-scanning и zero-knowledge proof для подтверждения человечности без деанонимизации.
Как работает World ID
Iris-based biometry и 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 — проверяем что такого ещё нет, добавляем, больше использовать нельзя.
Это аналог serial number в physical cash — при погашении купюры её номер записывается как "использован". Без раскрытия кто именно её погасил.
Техническая интеграция
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 уже отмечен
}
Облачная верификация проще, но централизована — Developer Portal Worldcoin видит все верификации вашего приложения. Для privacy-critical use cases — только 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 verification), подходит для менее critical actions. VerificationLevel.Orb — полная биометрическая верификация.
Use cases и ограничения
Где применимо
Airdrop защита от sybil: вместо "1 адрес = 1 аллокация" → "1 человек = 1 аллокация". Nullifier привязан к action (например, claim_airdrop_season1) — повторная регистрация другим адресом не поможет.
Governance: "1 человек = 1 голос" в DAO без доверия к токен-взвешенному голосованию.
Rate limiting: ограничение действий (бесплатный trial, faucet) по-человечески, не по-адресно.
Сertificate/credential системы: выдача credential уникальному пользователю с возможностью его предъявить без раскрытия identity.
Ограничения
Географическое покрытие Orb: устройства Orb сети неравномерно распределены. В регионах с низким покрытием пользователи не могут пройти верификацию — это реальное UX ограничение.
World App зависимость: ZK proof генерируется в World App (мобильное приложение). Пользователь без смартфона или нежелающий устанавливать приложение — не может верифицироваться. Для B2B и enterprise сценариев это проблема.
Device verification: менее строгий уровень, но phone uniqueness — слабее чем iris uniqueness.
Процесс интеграции
| Этап | Содержание | Срок |
|---|---|---|
| Регистрация в Developer Portal | Создание app_id, настройка actions | 1 день |
| Smart contract | WorldID верификатор + nullifier хранение | 2-3 дня |
| Frontend | IDKit виджет, обработка proof | 1-2 дня |
| Тестирование | Staging environment, testnet деплой | 1-2 дня |
Базовая интеграция с on-chain верификацией — 5-7 рабочих дней. Стоимость рассчитывается индивидуально.







