PostgreSQL Blockchain Extension
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.


PostgreSQL Blockchain Extension

WARNING: This is work-in-progress, use at your own risk!

This is a C language Postgres extension that provides Bitcoin blockchain functionality.

What You Can Do

SELECT op_sym, encode(data, 'escape')
  FROM parse_script(E'\\x04ffff001d0104455468652054696d65732030332f4a616e2f32'::bytea ||
                    E'\\x303039204368616e63656c6c6f72206f6e206272696e6b206f66'::bytea ||
   op_sym    |                                encode
 OP_PUSHDATA | \377\377\000\x1D
 OP_PUSHDATA | The Times 03/Jan/2009 Chancellor on brink of second bailout for banks
(3 rows)


Assuming you have a table with a BYTEA column named tx, which contains transactions, you can do stuff like:

  -- Note: this requires the pgcrypto extension for digest().

  SELECT n_in, verify_sig(tx, ptx, n_in)
   FROM (
    SELECT (vin).n n_in, p.tx ptx, x.tx tx
      FROM (
        SELECT get_vin(tx) vin, tx
          FROM rtxs
        WHERE id = 37898
      ) x
    JOIN rtxs p
      ON (vin).prevout_hash = digest(digest(p.tx, 'sha256'), 'sha256')
   ) x;
 n_in | verify_sig
    0 | t
    1 | t


SELECT parse_script((get_vout(tx)).scriptpubkey) FROM rtxs WHERE id = 37898;
(5 rows)
-- Note: this will take a while to run!

SELECT (parse_script((get_vout(tx)).scriptpubkey)).op_sym, count(1)
FROM rtxs
GROUP BY op_sym
ORDER BY count(1) DESC LIMIT 10;
         op_sym         |   count
 OP_PUSHDATA            | 678204416
 OP_HASH160             | 672704434
 OP_CHECKSIG            | 598508189
 OP_EQUALVERIFY         | 597189173
 OP_DUP                 | 597189166
 OP_EQUAL               |  75515405
 OP_RETURN              |   3017195
 OP_CHECKMULTISIG       |    574881
 OP_TRUE                |    572552
 OP_9                   |      2635

More details to follow. This blog post has some more info.

If you find this interesting, comment here in an issue or on twitter @humblehack, whatever. Also if you'd like to help.


This extension requires, which is a fork of picocoin with SegWit support and other improvements.

Building and installing libbitc is up to the reader, the following worked on my Debian system perfectly:

  # build and install .deb packages
  git clone
  cd libbitc
  git submodule update --init --recursive
  make pgk-deb
  sudo dpkg -i ./libbitc*deb

Once you have libbitc installed, you should be able to just

sudo make install

This was developed and tested only on PG 9.6.