Worked example
A state-at-date bundle with real receipts
Prepared for the W3C Agent Identity Registry Community Group. The credential is a synthetic test fixture; the records, receipts and ledger data are real. The question it answers: what did this credential say on a given date, and was anything recorded about it afterwards?
- credential-v1.jsonVersion 1 of the credential (synthetic test fixture).
- credential-v2.jsonVersion 2: narrows the scope and quotes version 1's SHA-256 (synthetic test fixture).
- state-at-date.jsonThe bundle, in the layout proposed by Xinghua Zhao, with the real records and receipts.
- interval-statement.jsonThe third condition: from version 2 to checkpoint 1672, no event was recorded for the credential.
- checkpoint-1672.jsonThe ledger checkpoint: Merkle root, operator signature, RFC 3161 token, OpenTimestamps proof (Bitcoin block 973827).
- ledger-interval.jsonThe 197 ledger entries in that range.
- check_interval.pyThe receiver side: six checks against these files and two public endpoints.
Check it yourself
python check_interval.py --bitcoin
Each ledger entry rebuilds its hash and links to the one before; the range starts at version 2's entry; its last entry is included in checkpoint 1672; the checkpoint signature verifies with the operator's published key; the OpenTimestamps proof matches the Bitcoin block header; and no entry in the range is recorded under the credential's issuer. Adding one issuer entry inside the range makes two of those checks fail.
What it does not show
A revocation the operator decided but never logged. And that every event of a credential is filed under its issuer is a rule of this ledger, stated here, not something the data proves.