Blockchain · 18 June 2018

Storing a Minister's Declarations on Bitcoin

by Tan Ji Sheng

An archival field note — documenting work from that era, written up for the record later.

A public statement is a fragile thing. Someone says something on the record, and then the record moves. A press release gets quietly edited. A speech transcript loses a paragraph. A quote gets walked back and the walk-back gets more coverage than the quote. The words existed, but proving when they existed, and that they haven't changed since, turns out to be surprisingly hard.

So we built a small demonstration to prove a point. Our team took a minister's declarations and wrote them into the Bitcoin blockchain. Not a private ledger, not a permissioned chain — the actual public BTC chain that anyone on earth can read. The idea was simple: once a statement is in there, it is timestamped, it cannot be silently changed, and anyone can verify it themselves without asking us for permission.

I want to be precise about what this was. It was a demonstration. Nobody adopted it as an official system, nothing was mandated, and it wasn't a national registry. We were proving a capability, not launching a product. But the capability is real, and I still think it matters.

The tool: OP_RETURN

Bitcoin has an opcode called OP_RETURN. It creates a provably unspendable output — one that lets you attach a small piece of arbitrary data to a transaction. Because the output is provably unspendable, full nodes don't have to keep it in the UTXO set (the working memory of who-owns-what), which is exactly why the network tolerates people using it to carry data instead of coins.

You put your bytes in the OP_RETURN output, you pay the transaction fee, the transaction gets mined into a block, and now your data lives in the chain's history forever alongside everyone else's.

The catch — and this is the whole engineering story — is the size limit. By default, nodes only relay OP_RETURN outputs up to 80 bytes of data. That limit wasn't always there: early on it was 40 bytes, and it was raised to 80 bytes in Bitcoin Core 0.11 (2015). Eighty bytes is not a lot. It's a sentence fragment. You are not fitting a minister's full remarks into a single output.

Chunking the text

So how do you store something longer than 80 bytes? You have two honest options.

The clean one: hash the full text, store only the hash on-chain, and keep the full text somewhere off-chain. The chain then proves the text existed and hasn't changed, but you have to hold the original yourself for anyone to read the actual words.

The one we did for the demonstration: chunk the text into the open data itself. We split the declaration into 80-byte pieces and wrote each piece into its own OP_RETURN output across a sequence of transactions, so the words themselves — not just a fingerprint of them — sit in the public chain. It was deliberately clunky. Chunking plain text across many outputs is not elegant, and it costs a fee per transaction. But it meant anyone could open a block explorer, read the raw data straight off the chain, and reassemble the statement without trusting our copy of it. That was the point we wanted to make visible.

What Bitcoin actually gives you

It helps to be clear-eyed about what you're buying here, because it's easy to oversell.

Immutability. Once the transaction is mined and buried under enough confirmations, rewriting it means rewriting proof-of-work history — economically absurd on Bitcoin. The words are stuck.

A timestamp. The block your data lands in has a block time. That gives you a credible "this existed no later than this moment" — a notarization anyone can check.

Public verifiability. No API key, no login, no asking us. Anyone with a block explorer can read it. That's the property that makes it worth doing on a public chain instead of a database we control.

What it is not is a database. You don't query it, you don't index it well, you don't update a record. Bitcoin here is a notarization layer — an attestation that a specific string of bytes existed at a specific time and has not changed. Nothing more. If you need more, you're using the wrong tool.

Why it still matters

Back in 2018 there wasn't a tidy name for this. The whole industry vocabulary of "on-chain attestations" and "verifiable credentials" that came later hadn't crystallized yet. We were just a small team in Malaysia proving that the immutability and timestamping properties I keep talking about could be pointed at something real — a public statement, made by a public figure, pinned to a public chain.

The honest value of the exercise was narrow and specific: a declaration can be quietly edited or denied later, but a statement written into Bitcoin provably existed at a point in time and can never be silently changed. You don't have to trust the person who published it. You don't have to trust us. You check the chain.

We didn't invent the technique — OP_RETURN was already there, and people were already stuffing data into it. What we did was aim it at a use case that actually needed the trust properties Bitcoin provides, and show it working end to end. Being early to that idea is the thing I'm proud of. Not a mandate, not an official system — a demonstration that the record can be made to hold still.