Whitepaper · v0.2 (draft)

Proof of Croatian Personhood

An open protocol for onchain proof of personhood rooted in the Croatian/EU eID. Certilia today → EUDI Wallet tomorrow.

Project: airKUNA (ITalk d.o.o.) Chain: Gnosis Licence (intended): Apache-2.0 / MIT 2026-07-07
This is the whitepaper (the whole picture + motivation + mechanism, for the community and for grants). Key decisions are recorded as separate ADRs in docs/decisions/ (airKUNA's own ADR base). Status: DRAFT v0.2, revised after two rounds of prior-art research.

0Summary

Problem: Croatians have a first-rate digital identity — Certilia MobileID (AKD, via the Ministry of the Interior, eIDAS level High) — but it is centralised. The onchain world has no reliable, Sybil-resistant proof that "this is a unique real person", which blocks legitimate onchain voting, democratic governance and fair resource allocation.

Solution: An open protocol that turns a verified eID login into a soulbound personhood token (SBT) on Gnosis. Uniqueness is bound not to a wallet but to a nullifier derived from the national ID number (nullifier = HMAC-SHA256(ID number, pepper)), so one person can hold several Safe wallets but only one identity. The raw ID number never leaves the backend (GDPR-first). The design is source-agnostic: Certilia today, the EU EUDI Wallet tomorrow — the same onchain layer works for all 27 EU countries.

Key insight (from the prior-art analysis): the MVP does not need expensive hardware infrastructure or a signer network of our own. Sybil resistance is achieved with a client-side proof (zkTLS over Certilia OIDC, or NFC reading of the eID chip) + an onchain nullifier registry. The decentralised Android verifier network is Phase 2 — it improves the decentralisation of trust, it is not a prerequisite.

1Problem

  1. Centralised trust. Certilia/AKD is the single source of truth. For onchain democracy we need proof of personhood that does not depend on one entity able to mint everything on its own.
  2. Sybil attacks. Without proof of personhood, one person opens 1000 wallets and outvotes the honest ones.
  3. Wallet binding. A naive "KYC per wallet" does not work: people have several wallets (cold, hot, a Safe for an association, a Safe for a company), and identity must sit above them.
  4. Privacy & GDPR. The national ID number is sensitive PII. It must not end up onchain or in a plaintext database.
  5. Inheritance/recovery. A lost wallet must not mean a lost identity.

2The core primitive: nullifier, not wallet

nullifier = HMAC-SHA256(ID_NUMBER, SECRET_PEPPER)

3Onchain architecture

Three open-source contracts on Gnosis:

3.1 IdentityRegistry

mapping(bytes32 nullifier => Identity) registry;
struct Identity { address anchor; uint64 loa; uint64 verifiedAt; uint64 reverifiedAt; }

function claim(Attestation calldata a, bytes calldata proof) external {
    require(registry[a.nullifier].anchor == address(0), "one person, one identity");
    require(_verify(a, proof), "invalid attestation");   // see 4 — pluggable verifier
    registry[a.nullifier] = Identity(a.anchor, a.loa, _now(), _now());
    sbt.mint(a.anchor, a.nullifier);
}

3.2 PersonhoodSBT (EIP-5484)

A non-transferable badge bound to the anchor Safe. It carries the LoA and timestamps; voting contracts read from it.

3.3 Resolving multiple wallets

4The eID → onchain bridge (pluggable verifier) — and why the mesh is not the MVP

_verify() is an abstraction with several implementations, chosen per phase:

VerifierHowDecentralisationPhase
A · zkTLS over Certilia OIDCThe client proves (Reclaim/zkTLS) that the Certilia JWKS signed an id_token containing their ID number; the contract verifies the zk proofNo oracle network; relies on the Certilia PKIMVP
B · NFC eID card chipThe client passively authenticates the chip issuer's signature (Rarimo/zkPassport style) and derives the nullifier locallyNo oracle network; relies on the state PKIMVP alt.
C · EIP-712 attestation oracleAn off-chain verifier validates the id_token (JWKS/iss/aud) and signs {nullifier,anchor,loa}; the contract checks the signerA single signer = centralisedTransitional
D · M-of-N Android verifier meshLike C, but M independent Android nodes (StrongBox + Key Attestation) co-signHigh — nobody mints alonePhase 2
Key insight from the prior art (confirmed over 2 rounds): verifiers A and B give Sybil resistance without any signer network, because the document/session proves itself cryptographically. Further confirmation: World ID does personhood with only a nullifier registry + Semaphore zk, with no signer mesh at all — a proven industry standard. The mesh (D) is justified only by: (1) a live-OIDC root that cannot be proven client-side, and (2) the political story that "neither AKD nor ITalk can mint alone". Hence: build A/B for the MVP; the mesh is Phase 2, not a prerequisite.

If you do build the mesh (Phase 2): consider Acurast as a SUBSTRATE rather than building from scratch. Acurast processors (250k+ phones) have their own EVM address, a code-bound hardware key, hardware attestation, and can sign/settle onchain. M-of-N Safe co-signing is custom logic on top of Acurast — it turns "buy and run phones" into "deploy a custom verifier onto an existing network".

⚠ Caveat for all HW-attestation approaches: the Android Key Attestation chain roots in Google (Google signs the attestation key). So a mesh built on Android attestation is trust-minimised, not trustless — Google is the root of trust. Say so honestly; the mitigation is mixing vendors (Samsung Knox + Titan + Qualcomm) so that no single manufacturer is the sole point of failure.

5Verifier network (Phase 2): a geolocated Android signer mesh

The design is retained because it delivers strong decentralisation of trust; it is not the MVP.

6Privacy and voting

7GDPR / compliance

8Positioning vs prior art

The full stack does not exist as a single product, but the components have strong prior art (Acurast, Lit, Rarimo/zkPassport, GEODNET, Reclaim/zkTLS, EBSI). Confirmed in research: "live eID-OIDC → onchain SBT via a decentralised verifier network" is genuinely unoccupied space. Our differentiation is not a patent but:

Patent / Freedom-to-Operate:nChain US 11,347,838 B2 covers "identity tokens → a fixed set of voters → counting onchain signals → releasing funds at a threshold" = a direct overlap with personhood-for-voting; an FTO opinion is needed before commercialisation. Choosing M separate EIP-712 signers (not true threshold ECDSA/MPC) routes around the nChain threshold-ECDSA patents. Patenting only defensively, with an attorney.

9Open source & funding

10Roadmap

PhaseDeliverable
0 — MVPIdentityRegistry + PersonhoodSBT + verifier A (zkTLS/Certilia) or B (NFC eID); mock issuer/verifier locally
1A second independent source (phone-SBT via sms.domovina.ai reverse-OTP) + credibility score; node map
2M-of-N Android verifier mesh (M separate EIP-712 signers, not MPC) + DAO onboarding + statuses + slashing
3Social attestation (web-of-trust score)
4zk anonymous voting (MACI/Semaphore)
5EUDI Wallet as a source (SD-JWT VC/mDoc over OpenID4VP) — pan-EU

11Open questions / risks


Appendix: ADR base

airKUNA maintains its own ADR base (docs/decisions/, starting at 0001):