Each example holds the license's text as LICENSE (wai/LICENSE, byte for byte) and says so in its README; wai create writes it with the rest of the template, from one copy in the binary. Co-Authored-By: Claude Opus 5.5 <[email protected]>
32 lines
1.5 KiB
Markdown
32 lines
1.5 KiB
Markdown
# Verify receipts in Rust and in Python
|
|
|
|
**What it shows.** WAI receipts checked offline, twice: once by the reference implementation
|
|
(`rust/`, on the `wai` crate) and once by a second implementation in plain Python
|
|
(`python/`, standard library only, sharing no code with the first). A receipt index sits
|
|
beside each object; it names the object's group receipt, which is signed with Ed25519 and
|
|
holds the Merkle root the object's BLAKE3 content hash reaches.
|
|
|
|
**Run it.**
|
|
|
|
```sh
|
|
wai create my-check --template verify-receipts
|
|
cd my-check
|
|
wai hello receipts # writes an object and its receipts in receipts/
|
|
python3 python/verify_receipts.py receipts
|
|
cd rust && cargo run --release -- ../receipts # builds the wai crate from the repository
|
|
```
|
|
|
|
**What you see.** Each verifier prints `ok` for the object, the group that signed it and the
|
|
key that signed the group. Change one byte of `receipts/*.wai`, or of a file in
|
|
`receipts/rcpt/`, and each prints `FAIL` with the reason.
|
|
|
|
**Make it yours.** Point either verifier at any directory laid out the same way: an object
|
|
`<cid>.wai`, its index `<cid>.wai.receipts`, and the group receipts under `rcpt/`, as WAI's
|
|
HTTP delivery serves them beside an object. `wai verify <dir>` runs the Rust checks from the
|
|
command line.
|
|
|
|
**With a coding assistant.** Run `wai setup-agent` in this directory: it writes the
|
|
instructions an assistant reads and connects it to WAI's tools.
|
|
|
|
**License.** Apache-2.0: the text is in `LICENSE`, and a project `wai create` makes from this
|
|
example carries it.
|