Skip to content
Store and reference data on the Bitcoin SV blockchain
Branch: master
Clone or download
Latest commit f66a779 Apr 12, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore B Jan 28, 2019
README.B update readme Apr 12, 2019 update readme Apr 12, 2019
reference.png Filename addition Feb 1, 2019
store.png update store.png Feb 2, 2019


Bitcoin Data Protocol


Store and reference data on the Bitcoin blockchain.




B is an OP_RETURN protocol to store and reference arbitrary data on Bitcoin.

The design goal:

  1. The simplest protocol to upload arbitrary media to the blockchain
  2. A protocol to reference previously uploaded media from another on-chain media.


Here's an example of what POST transactions look like:

  [Media Type]

The order is deliberately data, media type, and encoding, filename, in the order of significance (With future extensibility through adding additional push data).

  1. Data: data to store
  2. Media Type: As listed at
  3. Encoding: As listed at (The default is binary)
  4. Filename: a filename to store the blob as (the default has no filename and just stored as a blob, identified simply by the txid)

Example: HTML

OP_RETURN 19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut  <html><body>hello world</body></html>  text/html  UTF-8  hello.html


B:// is NOT a protocol for handling authenticated and encrypted media (That would be a much more complex problem). The main design goal of B is:

  1. Public: Public assets
  2. Simple: Simple to implement
  3. Versatile: Easily pluggable to any application in any context
  4. Extensible: Future extensibility with additional push data support


Try it here:


1. Uploading Large Media

Let's upload an image.

You can try it here (up to 100KB)

When you select a file, it directly writes the binary (ArrayBuffer) into Bitcoin pushdata (instead of base64 string). The resulting OP_RETURN would look something like this:

OP_RETURN 19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut [ArrayBuffer from the file]  image/png  binary  duck.png

By default, the encoding is binary, so you could just do (if you don't care about file names):

OP_RETURN 19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut [ArrayBuffer from the file]  image/png

Another example:

OP_RETURN 19HxigV4QyBv3tHpQVcUEQyq1pzZVdoAut [ArrayBuffer from the file]  text/html  UTF-8  index.html

2. Referencing Media

Once uploaded, this media can be referenced from ANY other transactions using a transaction hash. For example, let's say the media hash for an image uploaded this way was 46e1ca555622e73708a065f92df0af2cc0fe00ed1dd352d5fb8510365050347c.

You can reference it in another HTML file like this:

<img src="b://46e1ca555622e73708a065f92df0af2cc0fe00ed1dd352d5fb8510365050347c">

Of course, to upload this HTML file itself, you would do this:

<html><body><img src="b://46e1ca555622e73708a065f92df0af2cc0fe00ed1dd352d5fb8510365050347c"></body></html>

Once this HTML file is uploaded to Bitcoin, and the tx hash is e2be88f33d98074f778ddd94c13fe500cb1f5a4dfb3ed958391c95f431c20549, you can link it from another HTML, like this:

Check out <a href="b://e2be88f33d98074f778ddd94c13fe500cb1f5a4dfb3ed958391c95f431c20549">my website!</a>

You can use it in a markdown too:

[Here](b://e2be88f33d98074f778ddd94c13fe500cb1f5a4dfb3ed958391c95f431c20549) is a website, which contains the following image:


Of course, you will upload it like this:

[Here](b://e2be88f33d98074f778ddd94c13fe500cb1f5a4dfb3ed958391c95f431c20549) is a website, which contains the following image:\n![image](b://46e1ca555622e73708a065f92df0af2cc0fe00ed1dd352d5fb8510365050347c)
You can’t perform that action at this time.