Proovik
Public verifier · PVK-PROOF/1

How to verify a Proovik proof without trusting Proovik

You need the proof file (or the certificate PDF) and your copy of the original document. Nothing is uploaded: the fingerprint is computed in your browser. Below, the full specification, step by step and with real values.

Version 1 Network: Kaspa mainnet Reference verifier: 248 lines of Python, no dependencies
Tool

Verify a proof online

Check a certificate here with the same engine described below. The document never leaves your device: its SHA-256 is computed in your browser and only the fingerprint travels. You provide the hash; it is never taken from the proof file. If you drop the certificate PDF, the attached evidence package is extracted in your browser and the PDF is not sent either.

1 · Proof file

2 · Original document

The verifier never takes the hash from the proof file: you provide it.

The package and the hash are sent to POST /api/verify/proof. No account. Limit: 120 verifications per hour and IP.

Printed on the certificate PDF and shown in the Kaspa explorer.

You can compute it by dropping the document in the other tab: the value is shared.

This mode rebuilds the package by querying api.kaspa.org. Kaspa only serves the full header for about 40 hours after anchoring: after that, links 3 and 4 cannot be recomputed and the verdict will be Inconclusive, never “Established”. For a complete verification use the proof file captured at the time.

GET /api/verify/proof/{txid}?hash=…. Limit: 30 per hour and IP (it queries the network).

Verdict ·

Established Inconclusive Not established

The four links hold: the document with this SHA-256 existed when the given block was mined. Remember what the proof does not establish: authorship or truthfulness of the content.

What could be recomputed holds, but some data is missing (usually the full block header, beyond the pruning window) to close the chain. This is not a failure of the proof: it is a partial verification. With the proof file captured at the time, or with the complete evidence package, it can be completed.

At least one link does not hold for the given hash. Most often: the document is not exactly the one that was sealed (a single different byte changes the SHA-256) or the proof file does not belong to this document. Check each link's detail.

document
txid
block_hash
network
mode
header
verified

The links, one by one

Warnings

What each link means

Scope of the proof

What is claimed, exactly

Precision matters more than eloquence here, because whether the proof survives cross-examination depends on it.

What the proof establishes

That a byte string whose SHA-256 is a given value was placed into a Kaspa transaction, that this transaction was committed inside a block header, and that a valid proof of work was executed over that header, which includes a timestamp. Because the timestamp sits inside the data the work was done on, altering it invalidates the work. The date is nobody's declaration: it is a physical quantity already spent.

What the proof does NOT establish

Who created the document, whether its content is true, whether its author was entitled to create it, or that the document did not exist earlier. It establishes priority to an instant, not authorship or truthfulness. Proovik never sees the document: it only receives its hash.

On the hash

SHA-256 is a 256-bit digest function. Finding two different documents with the same digest has never been achieved and the estimated effort exceeds what humanity can compute. So if the digest of the submitted document matches the one on chain, the document is the same, with no practical room for doubt.

Real example · 20-09-2026

The four links

Verification is a chain. Each link connects to the next, and a single broken link makes the proof worthless. The values shown below are real: they belong to a certificate issued on 20 September 2026.

1 2 3 4
The date

Why the date is a physical quantity, not a declaration

This is the part cross-examination usually demands, so it is better shown than argued. The timestamp sits inside the header, and the header is the input to the proof of work. Change the time and you change the input, and the work is no longer valid. It is checked experimentally by altering the header verified in step 4 and repeating the computation:

Effect of altering the header on the proof-of-work result
Header Work result Verdict
Original, untouched0x15222b53caabb3b049ec…Valid
nonce + 10x6775abc19ba960657f66…Invalid
timestamp moved forward one second0xaee1e8274b1d268866ed…Invalid
The consequence

To present the document with a different date one would have to redo that header's proof of work against the network's real difficulty. This is not a cost barrier: it is a compute barrier on the order of the whole network's aggregate power over the interval one intends to falsify. Nobody declares the date. The date is paid for.

Permanence

Will it still work after future hardforks?

The honest answer is yes, and it is worth understanding why. A captured proof is not a live query to the network: it is a historical fact, verified under the rules in force at the moment it was anchored. Kaspa changes over time —the Crescendo/Toccata transition, for instance, altered the DAA cadence and the difficulty count— but that does not erase the past: it just means a January 2026 block is verified with January 2026 rules, and one three years from now with the rules of three years from now.

The reference verifier is built exactly for this: it distinguishes eras. It knows the activation point of each consensus change (for example, the CRESCENDO_DAA_MAINNET constant) and applies to each block the rules of its epoch, not today's. A later hardfork adds a new era; it does not invalidate the earlier ones.

The permanence of the proof then rests on three conditions, all under the control of whoever holds it:

1

Capture within the window

Save the whole header at anchoring time, before the network discards the full data (some 30-40 hours).

2

Keep the proof

The proof file (or the PDF that embeds it) is self-sufficient: it points to no server and no online lookup.

3

Keep the reference verifier

248 lines of open code, no dependencies, re-derivable from Kaspa's public source. Even if lost, it can be rewritten.

Verify it yourself

Do it without Proovik

The reference verifier is 248 lines of Python with no external dependencies: it implements keyed blake2b, the Keccak-f[1600] permutation, the xoshiro256++ generator and the matrix arithmetic. It reads in an afternoon and audits in two.

Terminal
$ python3 verificador_kaspa.py prueba.json 0f7383b381366cc3a75dadd7e4a1e8998c492f7c5c5610f4384d7320f484aad8

  OK    1. El payload on-chain es el hash del documento
  OK    2. La transaccion esta en el arbol Merkle del bloque
  OK    3. La cabecera produce el hash de bloque declarado
  OK    4. La prueba de trabajo de esa cabecera es valida

RESULTADO: PRUEBA VALIDA

Download the reference verifier

Two files. Put them in the same folder and run the first. They install nothing and never reach the network.

Anyone who prefers not to run someone else's code can reimplement it: the four algorithms are described above without ambiguity, and every parameter comes from rusty-kaspa's public source. It is equally legitimate to look the transaction up in any public Kaspa explorer as a cross-check, but the difference matters: the explorer is testimony; the computation is a demonstration. This specification exists so as not to depend on the former.

Legal framework

Legal scope

Proovik provides a non-qualified electronic time stamp service within the meaning of Article 3.16(i) of Regulation (EU) 910/2014. It is worth being explicit about what that means.

  • Under Article 41.1 of that Regulation, an electronic time stamp shall not be denied legal effect or admissibility as evidence in legal proceedings solely on the grounds that it is in electronic form or does not meet the requirements of a qualified stamp.
  • A non-qualified stamp does not enjoy the presumption of accuracy of the date and time of Article 41.2, which is reserved for qualified ones. If challenged, the burden of substantiating the proof falls on the party presenting it.
  • That is precisely why this specification exists: so that this burden is met with an arithmetic check anyone can reproduce, rather than with the provider's declaration.

Proovik does not verify the content, authorship or lawfulness of documents, and never accesses them: it receives only their cryptographic digest. What is established is a proof of existence and prior date to a given instant.

References

Header and transaction serialization, Merkle tree construction and proof of work, per the source code of the Kaspa reference implementation (rusty-kaspa): consensus/core/src/hashing/header.rs, consensus/core/src/hashing/tx.rs, consensus/core/src/merkle.rs, crypto/hashes/src/pow_hashers.rs, consensus/pow/.

The values used as examples belong to real certificates and are verifiable by anyone. This specification is versioned: proofs record inside themselves the version they were issued under.