PokeGrail Proofs
Keys and format
Everything needed to check a PokeGrail record without asking PokeGrail.
GRAIL-PROOF/v1
- Algorithm: SLH-DSA-SHA2-128f (FIPS 205), pure mode, empty context, via @noble/post-quantum 0.5.2.
- Payload: strict schema grail-proof/1; no numbers — amounts, slots and quantities are decimal strings; timestamps UTC YYYY-MM-DDTHH:mm:ss.sssZ.
- Canonical bytes: RFC 8785 (JCS) of the payload, UTF-8.
- Signed message: UTF8("GRAIL-PROOF/v1\n") ‖ canonical bytes. No prehash.
- Envelope: payload, base64url signature (17,088 bytes), base64url SHA-512 digest of canonical bytes (an identifier, not a substitute for the signature), optional embedded public key (untrusted).
- Parsers must reject duplicate keys, lone surrogates, unknown fields and nonfinite numbers.
Offline check
cd tools/grail-proof-verify && npm ci node verify.mjs --proof proof.json --trusted-key key.json --env production
The tool reads only the files you give it. It uses the trust material you saved, so it can't tell you about a key that was retired or compromised later — check this page for today's key status.
What a valid signature does not mean
It shows PokeGrail issued these exact contents. It does not prove a collectible is authentic, that physical shipping happened, or that wallets, Solana or tokens are quantum-resistant. Timestamps are PokeGrail's own assertion. Wallets and asset custody are unchanged.
Full handbook chapter →