Verify a proof
Check a proof yourself, offline, without trusting Linvesther or anyone else's server.
What you need
- A bundle: the folder an owner exports, with the proof, the account set and the manifest.
- The
linvesther-verifycommand-line tool, built fromcrates/verifier. - Optionally, a list of collectors you trust. Without it, no collector is trusted and every proof reads as self-attested.
Run it
cargo run -p verifier --bin linvesther-verify -- \
./bundle \
--trusted-collectors trust/collectors.jsonThe tool prints one result per check and two summary lines: whether the bundle is valid as of now, and where its data comes from.
summary: VALID_AS_OF(1789000000000)
origin: ORIGIN=TRUSTED_COLLECTOR(example collector)The checks
| Check | Fails when |
|---|---|
| Hashes | A file was changed or is missing. |
| Account set | The listed accounts do not produce the committed root. |
| Calculation | The receipt is not a real proof for the released program, or its journal was swapped. |
| Registry | The claimed on-chain anchor is not one you obtained independently. |
| Coverage | The gaps the bundle claims differ from the ones the calendar implies. |
Offline, a pass is always reported as VALID_AS_OF a moment, never as current: the tool cannot see corrections published later.
Where the data comes from
The origin line is separate from the checks above, because they answer different questions. It is one of:
| TRUSTED_COLLECTOR(name) | Signed by a collector on your list, for a period it is trusted for. |
| SELF_ATTESTED | Signed by a key that is not on your list. |
| REVOKED_COLLECTOR(name) | The collector is on your list but marked revoked. |
| COLLECTOR_OUTSIDE_VALIDITY(name) | The proof covers a period outside the collector's dates. |
| ORIGIN_UNAVAILABLE | There was no verified receipt to read the signer from. |
A valid calculation over data you do not trust is not a verified track record, so the tool exits with status 3 in that case. Pass --accept-self-attested if that is what you want, for example to check your own instance. The origin is still printed.
Exit status: 0 valid and trusted, 1 a check failed, 3 valid but the origin is not trusted.
The trust list
The list is a JSON file you control. The repository ships trust/collectors.json, which starts empty; a collector is added only deliberately.
{
"version": 1,
"collectors": [
{
"name": "example collector",
"fingerprint": "9c177b47de4c524a7b7754c648e488d3993b12b88930e0d67f9e3bcd01afc134",
"validFromMs": 1780000000000,
"validUntilMs": 1810000000000,
"revoked": false
}
]
}fingerprintis 64 hex characters: SHA-256 over a fixed tag and the collector's compressed public key. An instance reports its own at/public/collector.validFromMsandvalidUntilMsare optional. If set, the proof's period must fall inside them.- A collector marked
revokedis never trusted, at any date: from a proof alone there is no way to show a signature predates a key compromise. - A malformed list is refused. It is never read as an empty one.