Updated April 2026Verification

How proof verification works today

Kloak verification is intentionally layered. The goal is to rely less on Kloak alone over time and more on the package itself plus public Aleo evidence.

Verification order

The order matters because a proof package should fail fast if it was changed before any deeper checks happen.

>>

First, Kloak checks the proof package structure and digest integrity.

>>

Second, Kloak checks public Aleo references such as the payment transaction and the disclosure transaction.

>>

Third, Kloak checks its own proof record status for support signals like revocation and stored history.

Public chain checks

The public chain layer is treated as the primary confidence signal in the verify experience.

>>

It checks whether the payment transaction exists.

>>

It checks whether the disclosure transaction exists.

>>

It checks whether the disclosure transaction called the expected proof function.

>>

If the public chain says the references do not match, Kloak should not silently treat the proof as valid.

Why this matters

This is what reduces dependence on Kloak alone. A valid package plus confirmed public Aleo references carries more weight than a database row by itself.

Kloak record status

Kloak should not be the only trust layer, but it still plays an important support role.

Revocation

Kloak record status helps determine whether a proof has been revoked and should no longer be trusted.

History and operator context

Kloak record status helps explain whether the proof is still active in Kloak and whether supporting history is available.

Share formats

Kloak supports both verify links and portable proof packages, and each is useful in a slightly different situation.

Best when a reviewer wants the actual portable proof payload and its shared statement directly.

Portable proof package
{
  "kind": "kloak.selective-disclosure-proof",
  "version": 1,
  "program": "kloak_protocol_v10.aleo",
  "proofId": "sdp...",
  "subject": {
    "ownerAddress": "aleo...",
    "proverAddress": "aleo..."
  },
  "statement": {
    "actorRole": "receiver",
    "proofType": "existence",
    "disclosedAmount": null,
    "thresholdAmount": null,
    "constraints": {
      "requestId": "1293..."
    }
  },
  "chain": {
    "paymentTxHash": "at1...",
    "disclosureTxHash": "at1...",
    "requestId": "129...",
    "commitment": "760..."
  },
  "proofDigest": "dba...",
  "verificationGuide": {
    "primaryTrustSignal": "public-chain",
    "secondaryTrustSignals": [
      "kloak-record",
      "revocation-status",
      "payment-history"
    ],
    "checks": [
      {
        "id": "package-integrity",
        "label": "Proof package was intact",
        "source": "package"
      },
      {
        "id": "payment-transaction",
        "label": "Payment transaction was found on Aleo",
        "source": "public-chain"
      },
      {
        "id": "disclosure-transaction",
        "label": "Proof transaction was found on Aleo",
        "source": "public-chain"
      },
      {
        "id": "disclosure-match",
        "label": "Proof transaction matched the shared statement",
        "source": "public-chain"
      },
      {
        "id": "kloak-record",
        "label": "Kloak found the proof record",
        "source": "kloak"
      },
      {
        "id": "revocation-status",
        "label": "Kloak checked revocation status",
        "source": "kloak"
      },
      {
        "id": "payment-history",
        "label": "Kloak re-checked payment history",
        "source": "kloak"
      }
    ],
    "note": "Kloak verifies the shared package first, then tries to confirm the proof from public Aleo transactions. Kloak record checks add revocation and history status on top when available."
  }
}