Blog
Design decisions

Why we anchor proofs to a public ledger

By the Let’s Seal team6 min read

Every Let's Seal seal answers two questions: what is this file, and when did it exist. The first is a signature problem. The second is a trust problem, because a timestamp is only ever as good as the clock behind it.

A timestamp you issue is only a claim

When a service stamps a document with the time, you are trusting that service's clock and its honesty. If our server were compromised, or if we were compelled to, we could in principle sign a document with yesterday's date, or tomorrow's. A timestamp the issuer can move is only a claim.

We wanted when to be a fact: fixed the moment it is set, beyond our reach to alter, and yours to verify on your own.

A clock the whole world shares

A public blockchain is an ownerless, append-only ledger that anyone can read and no one can quietly rewrite. Every block is chained to the one before it, and rewriting an old block would mean redoing all the work stacked on top of it, across a global network, faster than that network keeps building. That puts backdating beyond reach. Once a piece of data is committed to a block, the whole world can see it was there by that block, and it stays fixed for everyone, us included. The design works with any ownerless public ledger that holds this property; we chose Bitcoin.

So we keep no clock of our own. We borrow the world's.

How your hash reaches a block, privately

32 bytes
of your file leave your machine: its SHA-256 digest alone
4
independent OpenTimestamps calendars aggregate it
£0
thousands of hashes share one transaction on the blockchain, so anchoring is free

We use OpenTimestamps, an open standard for blockchain timestamping. The privacy detail matters: your file stays on your machine. We take its SHA-256 digest, 32 bytes that identify the file uniquely while keeping its contents private, and we timestamp that.

1
Your file
SHA-256 digest, 32 bytes. Your file stays on your machine.
2
4 calendars
Independent OpenTimestamps servers collect hashes from everyone.
3
1 blockchain transaction
Thousands of hashes are batched together and committed at once.
4
Confirmed
The block is checked against the blockchain itself, and its height recorded.
Your hash is aggregated with thousands of others into a single transaction on the blockchain. The cost of that one transaction is shared across everyone in the batch, which is why anchoring stays free.

A single transaction on the blockchain is a scarce, and normally costly, thing. OpenTimestamps solves that with aggregation. Four independent public calendar servers collect hashes from everyone using the network, combine thousands of them into one tree, and commit only that tree's root to a single transaction. Your hash rides along inside the batch. Because the cost of that transaction is shared across everyone in it, anchoring on Let's Seal is free, and it stays free however much you seal.

Confirmation comes from the blockchain itself

A calendar hands back a receipt straight away, but that receipt marks acceptance alone, with a place in a block still to come. We keep those two states apart. A fresh anchor is marked pending. It becomes confirmed only once the blockchain attestation actually exists.

For confirmation, we go to the blockchain itself rather than the calendar's word. The proof is verified either through a full node, or by cross-checking the attested block against several independent block explorers that have to agree. Confirmation usually lands within a few hours, once the batching transaction is mined. Only then do we record the block height.

What you can check yourself

The proof travels with the file as a small .ots sidecar. Anyone can verify it with the standard OpenTimestamps client and a view of the blockchain:

ots verify sealed.pdf.ots

Everything the check needs is public: the standard client and the blockchain. If we vanished tomorrow, every anchor we ever made would still verify. That is the test we hold every part of the system to.

Inside that sidecar is a path. It records the steps that take your file's hash, fold it together with the other hashes in its batch, and arrive at the exact value committed by one transaction on the blockchain, along with the block that transaction landed in. The verifier replays those steps and checks the result against the public chain. Every link in the middle is arithmetic you can redo yourself, and it either lands on a real block or it falls short.

We anchor one more thing: the root of our transparency log. Committing the log's root to the blockchain pins the entire history of everything we have ever sealed to the same public clock. That is the subject of a companion post.

Why we chose Bitcoin

The obvious alternative is a traditional timestamping authority, the RFC 3161 kind. That hands you a single trusted party whose signature, and whose clock, you simply have to believe, exactly what we designed the system to move past. A private or permissioned chain is the same problem wearing different clothes.

The blockchain's cost and energy use are real, and worth naming plainly. Our own contribution to them is close to zero: the network mines its blocks regardless, the aggregation transaction happens regardless, and what we add is a single hash inside a batch of thousands. For that, we get a clock that stays beyond the reach of any government, company, or future version of us.

Proof of when should stand independent of the party who benefits from it. Borrowing the blockchain's clock is how we put it there.

Every claim here is something you can check yourself, offline, with tools we do not control. That is the whole point.