Prove it, or lose it.
Proof of Retrievability runs on-chain, at the protocol level. On a fixed interval, the chain forces a random archive to prove it still holds a random chunk — settling a reward, or slashing stake, at consensus.
Five steps, every hundred blocks.
No one runs this loop by hand. The chain issues the challenge, the targeted archive answers with a Merkle proof, and validators settle the outcome at consensus.
- 1
Audit
block_hash → PRNGThe previous block hash seeds a deterministic PRNG. No human triggers it — challenge generation is built into block execution.
- 2
Challenge
StorageChallengeThe seed selects a funded file, a chunk index, and one of that chunk's assigned archives, then writes a StorageChallenge to L1 state.
- 3
Prove
SubmitStorageProofThe targeted archive reads the chunk from disk, rebuilds the Merkle tree, and generates the sibling path. It signs and submits SubmitStorageProof inside the response window.
- 4
Verify
blake3(l ‖ r)Validators walk the sibling path: blake3(left ‖ right) from the chunk hash up to the root. The result must equal the on-chain merkle_root.
- 5
Settle
reward / slashA valid proof transfers 10 Koppa from the file's fee pool to the archive. A missing or invalid proof inside the window slashes 5% of its stake. No exceptions.
Run a round.
Step through one challenge end to end. Roughly one in seven rounds fails here, to show what slashing looks like when an archive can't produce the proof in time.
verify_merkle_proof(chunk_hash, index, sibling_path, root)