The Power of Bitcoin: Proof of a Document Existence with the Blockchain

Ever wondered how can you notarize a document without all the government centralization and trusted "authorities"?

Bitcoin is not only a great payment system but also a permanent storage of data.

Because of it's decentralized and distributed nature it's very difficult to shut it down or tamper the data passing through the network.

This allows us to certify any kind of document or text in a cryptographically proven way.

Let's create a scenario, where a logo designer designs a logo for his client. He wants to make sure he's the indisputable author of the creation should authorship issues arise later.

I will use the real scenario with our client.

I and my friend Matus have recently created a logo for my friend's company Bambooska.

To prove that we are indeed creators of the logo we will write a proof to the Bitcoin's blockchainbefore the logo is handed over to the client.

The proof consists of a timestamp and a cryptographic digest of the logo's source file - in our case a PDF.

For writing the proof to the blockchain we will use a reasonably priced service called Proof of Existence (PoE). The cost of the service is 0.005 BTC per file, which is ~$3.5 as of the date of writing.

Note: If you don't like paying for the service, you may write proofs in the blockchain yourself. You can either do it manually creating a raw transaction with Bitcoin Core wallet and pushing it to the chain or use CryptoGraffiti that will do all the hard work for you.

A new free service has emerged since I wrote the post. You can now use OpenTimestamps created by the former Bitcoin Core developer Peter Todd.

Create the Proof of Existence

Simply drag and drop your document to the box on the main page.

The page will locally create a sha256 hash of the file and save it to their database. Don't worry, your document isn't uploaded anywhere!

If you're paranoid you may check whether the hash is correct by using "shasum" (available for Unix-like systems only):

shasum -a 256 Bambooska_Final.pdf

In our case it outputs the following:

ac41bc826d4aa013f2a11aa52d48da6630303346276f3a7032e0ec3893d0928a

Great, it matches!

As I said earlier the service is not free so we need to pay the amount of 0.005 BTC plus a small transaction fee.

Either scan the QR code with your mobile wallet or copy and paste the wallet address and send the desired amount.

The payment is recognized immediately. After it's confirmed by the network (usually within 10 minutes) the proof is written to the blockchain permanently!

Now we can send our logo to the client because our file has already been certified.

Note: Make sure to save both the hash and the transaction URL/ID to use it later if needed.

Verify the Proof

In case a dispute arises and somebody wants to claim the authorship to our logo, all we have to do is go to PoE again and "reupload" the same file.

It will show us the same hash as the first time (which anyone holding the logo source file can reproduce), the date and time when the hash was written in the blockchain and the bitcoin transaction details that prove it indeed was written there.

Since we sent our logo after the proof was already created, nobody can provide a genuine proof with an earlier timestamp.

Transaction Verification

To prove that we really made the bitcoin transaction we need to verify a "random" message. This message is cryptographically signed with the wallet address used to send the transaction from.

Note: I'll be using a different wallet address in this example. I paid the transaction with breadwallet which doesn't have the signing feature, nor lets me export the private key. Let's suppose I used Electrum wallet and an address 1DBKaSLXpzGEXSWk1wJLRSAU7qAHhCYXvk

Let the message be:

Whoever unlocks the message has written the Bambooska logo hash in the blockchain

A cryptographic signature of the above message signed with wallet address 1DBKaSLXpzGEXSWk1wJLRSAU7qAHhCYXvk is:

H+M2UEI6GuZ5YbZXq1NYcnOIrZe4fUf0svjoKDiE96axGRuf0fa1VUqd+unbz4QI0adkNx35ui91DhdNyq0V1LA=

Only a person holding the private key of the above wallet address is able to verify the message. Trying to verify it with another key will ultimately fail!

To verify the message:

  1. Open Electrum wallet
  2. In the app menu choose: Tools -> Sign/verify message.
  3. Fill in all the fields and click Verify

Signature is verified, it gives us the necessary proof and the dispute may be closed in our favor.

Do you use the blockchain as a proof of existence system? What are your common uses? Let me know in the comments below.

Updated on Jun 28, 2018:

A better alternative to the existing timestamping services has emerged since I wrote the post in 2016.

I recommend you to have a look at OpenTimestamps created by the former Bitcoin Core developer Peter Todd.

OpenTimestamp minimizes the trust, it's completely opensource (including the server part) and is highly scalable due to many timestamps being aggregated into a single transaction which saves tons of resources.