Reference

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-verify command-line tool, built from crates/verifier.
  • Optionally, a list of collectors you trust. Without it, no collector is trusted and every proof reads as self-attested.

Run it

Shell
cargo run -p verifier --bin linvesther-verify -- \
  ./bundle \
  --trusted-collectors trust/collectors.json

The tool prints one result per check and two summary lines: whether the bundle is valid as of now, and where its data comes from.

Output
summary: VALID_AS_OF(1789000000000)
origin: ORIGIN=TRUSTED_COLLECTOR(example collector)

The checks

CheckFails when
HashesA file was changed or is missing.
Account setThe listed accounts do not produce the committed root.
CalculationThe receipt is not a real proof for the released program, or its journal was swapped.
RegistryThe claimed on-chain anchor is not one you obtained independently.
CoverageThe 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_ATTESTEDSigned 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_UNAVAILABLEThere 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.

trust/collectors.json
{
  "version": 1,
  "collectors": [
    {
      "name": "example collector",
      "fingerprint": "9c177b47de4c524a7b7754c648e488d3993b12b88930e0d67f9e3bcd01afc134",
      "validFromMs": 1780000000000,
      "validUntilMs": 1810000000000,
      "revoked": false
    }
  ]
}
  • fingerprint is 64 hex characters: SHA-256 over a fixed tag and the collector's compressed public key. An instance reports its own at /public/collector.
  • validFromMs and validUntilMs are optional. If set, the proof's period must fall inside them.
  • A collector marked revoked is 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.
Trust is your decision. The list on a website is a convenience: to be sure, keep your own and verify with it.
Verify a proof