Fields
Bool(true) for a predicate that held, a bucket index, or a policy constant. A raw field value never becomes an output, so no payment detail leaves the phone. A Pesa payment claim carries one output, satisfied.
The context digest
order_id, expected_amount, currency, payee_id_hash, payer_id_hash and reference. The orchestrator rebuilds the same context from on-chain data and compares digests.
The nullifier
Canonical encoding
Every hash input starts with a versioned ASCII domain, then each field in order. Variable-width fields have a 4-byte big-endian length prefix; fixed-width fields are raw. A decoder must refuse anything that does not re-encode to itself, so a claim has exactly one byte form. The receipt digests are ordered K then T and must never be sorted. The transport form is the signed bytes followed by the 64-byte signature, base64-encoded asclaim.encoded in the SDK.
Verifying a claim
A consumer checks, in order:- Signature. Ed25519 over the canonical bytes (no prehash) by a claim key the trust bundle lists for
verifier_epoch, on a verifier that is not revoked, in a valid epoch. - Time.
issued_atat most 60 seconds ahead of the consumer’s clock, andexpires_atnot passed. - Holder binding. Refuse a bound claim unless the consumer itself checked a holder proof.
- Policy.
profile_idandpolicy_idare the ones asked for, and the outputs say what is needed. - Nullifier. If a fact may be proved once, refuse a nullifier already seen.