VEIL specification / 0004 · v0.1.0
Receipts and verification
Status of this document
This is a working draft of VEIL and not a standards-track document. It describes the receipt format, signatures and anchoring as designed for Verify Route. None of it is deployed yet; when a part ships, this section will say which, and the changelog will record it.
Abstract
Every call yields a router receipt signed with Ed25519, and on attested lanes also a node receipt signed by the enclave. Receipts carry hashes and counts, never text. Hourly Merkle roots of all receipts are anchored on Robinhood Chain.
1. Conventions and terms
The words MUST, MUST NOT, SHOULD, SHOULD NOT and MAY are used as in RFC 2119 and RFC 8174 when written in capitals. Terms used across the documents:
- Router: the Verify Route service that routes, prices and signs calls.
- Enclave: a confidential VM, optionally with a confidential GPU, running the sidecar and a model server.
- Sidecar: the process in the enclave that measures weights, holds keys and signs node receipts.
- Quote: hardware-signed evidence of what was measured into the enclave.
- Lane: the privacy floor of a request, one of
standard,attestedorblind.
2. Receipt claims
generation,model,provider,laneusage(prompt and completion tokens) andcost_usdgrequest_sha256andresponse_sha256over the exact bytes exchangedattestation_sha256on attested lanes,bondandcanarystatus at routing timeissued_at,key_idandsig
3. Signing
The signature covers the canonical JSON of all other claims (keys sorted, no whitespace). Public keys are published at /.well-known/vr-receipt-keys.json with their validity windows. For streamed answers, each chunk extends a hash chain and the final receipt signs the head of that chain.
4. Anchoring
Once an hour the router builds a Merkle tree of the receipts it issued and writes the root to a contract on Robinhood Chain. A receipt can then be shown with its Merkle path, proving it existed at that hour and has not changed.
5. Verification
- Canonicalize the claims and check the Ed25519 signature against the published key for its window.
- If you hold the request, hash it and compare with request_sha256.
- If a Merkle path is present, recompute the root and compare it with the anchored value on-chain.
- On attested lanes, compare attestation_sha256 with the registry entry for that host.
6. Privacy considerations
A hash does not reveal text, but anyone holding an exact guess of a request can confirm it. Receipts are therefore only returned to the caller, and the anchored roots reveal nothing about individual calls.