Attestation Schemas

Technical details of the attestation schemas used by Zipwire Attest, including IsAHuman and Private Data schemas on the Base blockchain.

Overview

Zipwire Attest uses eight attestation schemas on the Base blockchain through the Ethereum Attestation Service (EAS). These schemas provide different levels of verification and privacy protection for users, including basic proof of personhood, age verification, compliance verification, and selective data disclosure.

Schema Types

Core Schemas

IsAHuman Schema

The "IsAHuman" schema provides basic Proof of Personhood verification.

Schema Details

  • Schema Name: IsAHuman

  • Schema Type: Boolean

  • Data Structure: Simple true/false value

  • Privacy Level: Basic - no personal data included

  • Transferability: Not transferable

  • Revocability: Revocable by Zipwire

Use Cases

  • Bot prevention in any wallet-connectable application

  • Access to gated communities

  • Basic trust verification

  • DAO participation requirements

Limitations

  • No identity linkage to specific person

  • No selective disclosure capabilities

  • Can only be claimed against wallets connected before ID check

  • Revocable if verification is compromised

Private Data Schema

The "Private Data" schema provides cryptographic attestations of documents using Merkle root hashes.

Schema Details

  • Schema Name: Private Data

  • Schema Type: Merkle Root Hash

  • Data Structure: Cryptographic hash of document data

  • Privacy Level: High - enables selective disclosure

Merkle Tree Structure

Each Private Data attestation contains a Merkle root hash that represents:

  • Passport data - All fields from verified passport document

  • AML report data - All fields from background check report (if completed)

Leaf Structure

Each leaf in the Merkle tree includes:

  • data: Hex-encoded content of the field

  • salt: Random bytes to prevent preimage attacks

  • hash: Hash of data + salt

  • contentType: MIME type of the data

Selective Disclosure

Users can selectively reveal any field from their documents by generating Merkle proofs:

  • Age verification: Reveal only date of birth

  • Nationality verification: Reveal only nationality

  • AML status: Reveal only specific compliance fields

  • Any document field: Reveal any individual field as needed

Age-Based Schemas

Zipwire provides five age-based attestation schemas for different age verification requirements. All age attestations follow the same pattern but with different age thresholds.

IsThirteen Schema

  • Purpose: Confirms user is at least 13 years old

  • Use Cases: COPPA compliance, social media platforms, educational services

  • Privacy: Only confirms age threshold, not exact age

IsFourteen Schema

  • Purpose: Confirms user is at least 14 years old

  • Use Cases: Platform age requirements, content filtering, service eligibility

  • Privacy: Only confirms age threshold, not exact age

IsSixteen Schema

  • Purpose: Confirms user is at least 16 years old

  • Use Cases: Employment verification, driving services, financial services

  • Privacy: Only confirms age threshold, not exact age

IsEighteen Schema

  • Purpose: Confirms user is at least 18 years old

  • Use Cases: Adult services, legal contracts, financial services, employment verification

  • Privacy: Only confirms age threshold, not exact age

IsTwentyOne Schema

  • Purpose: Confirms user is at least 21 years old

  • Use Cases: Alcohol sales, gambling platforms, adult content, financial services

  • Privacy: Only confirms age threshold, not exact age

Age Schema Common Features

  • Verification Process: All use Yoti ID check to verify date of birth

  • Age Calculation: Zipwire calculates age from verified date of birth

  • Transferability: Attestations transfer with wallet ownership

  • Permanence: Once issued, attestations are permanent on blockchain

  • Privacy: Only reveal minimum age threshold, not exact age or date of birth

Compliance Schemas

Zipwire provides compliance attestation schemas for regulatory and financial verification requirements.

HasClearAML Schema

  • Purpose: Confirms user has clear Anti-Money Laundering (AML) status

  • Use Cases: Financial services, high-value transactions, regulatory compliance, DeFi protocols

  • Privacy: Only confirms clear AML status, not specific compliance details

Compliance Schema Common Features

  • Verification Process: All use specialized compliance verification processes

  • Regulatory Focus: Designed to meet specific regulatory requirements

  • Transferability: Attestations transfer with wallet ownership

  • Permanence: Once issued, attestations are permanent on blockchain

  • Privacy: Only reveal compliance status, not detailed verification information

Technical Implementation

Blockchain Integration

  • Network: Base blockchain

  • Service: Ethereum Attestation Service (EAS)

  • Attester: Zipwire's master attester address

  • Verification: On-chain attestation records

Attestation Process

  1. Wallet Connection: User connects their Ethereum wallet (must be done before ID check)

  2. ID Verification: User completes self-check on phone/PC camera + passport photo

  3. Document Processing: Zipwire automatically processes and verifies documents

  4. Merkle Tree Creation: Zipwire automatically creates Merkle tree from document data

  5. Root Hash Generation: Zipwire automatically generates cryptographic hash of the entire dataset

  6. User Claim: User claims attestation to their connected wallet

  7. Blockchain Attestation: Zipwire automatically attests root hash on Base via EAS

Proof Generation

When users need to prove specific information (coming soon):

  1. Select Fields: Choose which data fields to reveal via UI

  2. Generate Proof: Create Merkle proof for selected fields

  3. Create ProofPack: Package proof in ProofPack format

  4. Share: Send ProofPack to recipient

Note: OAuth integration allowing other sites/apps to view proofs is on the longer-term roadmap.

Schema Specifications

IsAHuman Schema

{
  "uid": "attestation_uid",
  "schema": "schema_uid",
  "attester": "0x2651e...",
  "recipient": "user_wallet_address",
  "data": "0x0000000000000000000000000000000000000000000000000000000000000001", // ABI encoded boolean true
  "timestamp": "2024-01-01T00:00:00Z",
  "revoked": false
}

Private Data Schema

{
  "uid": "attestation_uid", 
  "schema": "schema_uid",
  "attester": "0x2651e...",
  "recipient": "user_wallet_address",
  "data": "0x1316fc0f...", // ABI encoded bytes (Merkle root hash)
  "timestamp": "2024-01-01T00:00:00Z",
  "revoked": false
}

Age-Based Schemas

All age-based schemas follow the same JSON structure with boolean true values:

IsThirteen Schema

{
  "uid": "attestation_uid",
  "schema": "schema_uid",
  "attester": "0x2651e...",
  "recipient": "user_wallet_address",
  "data": "0x0000000000000000000000000000000000000000000000000000000000000001", // ABI encoded boolean true
  "timestamp": "2024-01-01T00:00:00Z",
  "revoked": false
}

IsFourteen Schema

{
  "uid": "attestation_uid",
  "schema": "schema_uid",
  "attester": "0x2651e...",
  "recipient": "user_wallet_address",
  "data": "0x0000000000000000000000000000000000000000000000000000000000000001", // ABI encoded boolean true
  "timestamp": "2024-01-01T00:00:00Z",
  "revoked": false
}

IsSixteen Schema

{
  "uid": "attestation_uid",
  "schema": "schema_uid",
  "attester": "0x2651e...",
  "recipient": "user_wallet_address",
  "data": "0x0000000000000000000000000000000000000000000000000000000000000001", // ABI encoded boolean true
  "timestamp": "2024-01-01T00:00:00Z",
  "revoked": false
}

IsEighteen Schema

{
  "uid": "attestation_uid",
  "schema": "schema_uid",
  "attester": "0x2651e...",
  "recipient": "user_wallet_address",
  "data": "0x0000000000000000000000000000000000000000000000000000000000000001", // ABI encoded boolean true
  "timestamp": "2024-01-01T00:00:00Z",
  "revoked": false
}

IsTwentyOne Schema

{
  "uid": "attestation_uid",
  "schema": "schema_uid",
  "attester": "0x2651e...",
  "recipient": "user_wallet_address",
  "data": "0x0000000000000000000000000000000000000000000000000000000000000001", // ABI encoded boolean true
  "timestamp": "2024-01-01T00:00:00Z",
  "revoked": false
}

HasClearAML Schema

{
  "uid": "attestation_uid",
  "schema": "schema_uid",
  "attester": "0x2651e...",
  "recipient": "user_wallet_address",
  "data": "0x0000000000000000000000000000000000000000000000000000000000000001", // ABI encoded boolean true
  "timestamp": "2024-01-01T00:00:00Z",
  "revoked": false
}

Verification Process

On-Chain Verification

  1. EAS Scan: Check attestation on Base blockchain

  2. Attester Verification: Confirm attestation from Zipwire's address

  3. Schema Validation: Verify correct schema type

  4. Revocation Check: Ensure attestation is not revoked

  5. Timestamp Check: Ensure attestation is current

Proof Verification

  1. Merkle Proof: Verify leaf hashes against root

  2. Data Integrity: Confirm revealed data matches proof

  3. Salt Validation: Check salt prevents preimage attacks

  4. Content Type: Validate MIME types

Note: ProofPack SDK is now available on NPM for easy verification.

Security Considerations

Privacy Protection

  • No Personal Data: Only cryptographic hashes stored on-chain

  • Selective Disclosure: Users control exactly what to reveal

  • Salt Protection: Prevents preimage attacks on hashes

  • Self-Sovereign: Users own and control their proofs

  • Localized Storage: Original data stored in double-encrypted localized storage

  • Technical Redaction: Advanced users can download full reveal proofs, delete data and salt, and create custom redacted proofs (unsigned but chain-validatable)

Integrity Assurance

  • Cryptographic Proofs: Merkle trees ensure data integrity

  • Blockchain Verification: On-chain attestations prevent tampering

  • Signature Validation: JWS envelopes provide tamper-proofing

  • Timestamp Protection: Prevents replay attacks

Developer Integration

EAS Integration

// Example: Verify attestation on Base
const attestation = await eas.getAttestation(attestationUid);
const isValid = attestation.attester === "0x2651e..."; // check official Zipwire attester address
const isNotRevoked = !attestation.revoked;

See our official Zipwire attester address on our GitHub.com

ProofPack Verification

// Using the ProofPack SDK (recommended)
import { AttestedMerkleExchangeReader } from '@zipwire/proofpack';
import { EasAttestationVerifierFactory, ES256KVerifier } from '@zipwire/proofpack-ethereum';

// Configure networks and create verifier
const networks = {
    'base': {
        rpcUrl: `https://api.developer.coinbase.com/rpc/v1/base/${apiKey}`,
        easContractAddress: '0x4200000000000000000000000000000000000021'
    }
};

const attestationVerifierFactory = EasAttestationVerifierFactory.fromConfig(networks);
const reader = new AttestedMerkleExchangeReader();

// Verify complete document with attestation
const result = await reader.readAsync(jwsEnvelopeJson, verificationContext);

if (result.isValid) {
    console.log("Verified data:", result.document);
    console.log("Merkle Root:", result.document.merkleTree.root);
    console.log("Attestation Network:", result.document.attestation.eas.network);
}

Note: ProofPack SDK is now available on NPM for easy verification. See GitHub repository for documentation and examples.

Core Attestations

Age-Based Attestations

Compliance Attestations

External Resources

Schema UIDs

Zipwire uses the following EAS schema UIDs for its attestations:

Core Schemas

IsAHuman Schema

  • Schema UID: 0x8af15e65888f2e3b487e536a4922e277dcfe85b4b18187b0cf9afdb802ba6bb6

  • Purpose: Proof of personhood verification

  • Type: Simple boolean attestation

  • Use Cases: Bot prevention in any wallet-connectable application

Private Data Schema

  • Schema UID: 0x20351f973fdec1478924c89dfa533d8f872defa108d9c3c6512267d7e7e5dbc2

  • Purpose: Selective disclosure of document information

  • Type: Merkle root attestation with selective disclosure

  • Use Cases: Age verification, nationality verification, credential verification

Age-Based Schemas

The following age-based schemas are available:

IsThirteen Schema

  • Schema UID: 0x8a236ef2aa0b65165326fc1d6f8fa29dfd139e391432c59ab6ea7605ed578425

  • Purpose: Confirms user is at least 13 years old

  • Type: Simple boolean attestation

  • Use Cases: COPPA compliance, social media platforms, educational services

IsFourteen Schema

  • Schema UID: 0x175f46f002f3c955b85654294bb7ba489a20170b92affc31384e4c99ffa891e7

  • Purpose: Confirms user is at least 14 years old

  • Type: Simple boolean attestation

  • Use Cases: Platform age requirements, content filtering, service eligibility

IsSixteen Schema

  • Schema UID: 0xbf0313ff4991a4f628ba7e0ead6a5bcd633e2049ea78ca906fe65e126942530b

  • Purpose: Confirms user is at least 16 years old

  • Type: Simple boolean attestation

  • Use Cases: Employment verification, driving services, financial services

IsEighteen Schema

  • Schema UID: 0xba73ff8acaee0bf6c4a8d294dcdc27b1a60489f5338a13058d129fc7e640212f

  • Purpose: Confirms user is at least 18 years old

  • Type: Simple boolean attestation

  • Use Cases: Adult services, legal contracts, financial services, employment verification

IsTwentyOne Schema

  • Schema UID: 0x1681ac077844d5f53b9a59a1495bde1bd62af45e646de7feda722f68164a1465

  • Purpose: Confirms user is at least 21 years old

  • Type: Simple boolean attestation

  • Use Cases: Alcohol sales, gambling platforms, adult content, financial services

HasClearAML Schema

  • Schema UID: 0xdc1cb4d85858a3c6fe90fcce9779c3ffad0376d5dd3583cf684056fd98359f9c

  • Purpose: Confirms user has clear Anti-Money Laundering (AML) status

  • Type: Simple boolean attestation

  • Use Cases: Financial services, high-value transactions, regulatory compliance, DeFi protocols

Attester Information

All Zipwire attestations are issued by our master attester wallet. For verification purposes, you can find the official public key and Ethereum wallet address at:

Zipwire Public Keys on GitHub

This is the authoritative source for verifying that attestations were issued by Zipwire.

Last updated