Happy to publish today the results of an audit I performed for the Bitfinex exchange. This is similar to the Kraken audit, we simply took some of the feedback on board (hash email address into leaf nodes), improved the security in a few places (balances were anonymized even to me) and streamlined the process some more (presenting
easy-audit.)
As always, an audit does not constitute an endorsement and it does not address any risks outside of present insolvency. It's also not infallible, exchanges can borrow money or ask others to sign their audit message. Finally, until we can implement fully zero-knowledge, cryptographically provable audits, you have to trust the auditor, i.e. me, to have done my job correctly.
Also same as last time, I did not receive any compensation for the audit and I did it in my free time.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
=====BEGIN AUDIT REPORT=====
AUDITOR: Stefan Thomas
AUDITED ENTITY: iFinex, Inc.,
https://www.bitfinex.comROOT HASH: 37c49d606c61aab140726265099992c3dd0fba30e1ce1a8a04f0e56cec6dc19f
BLOCK HEIGHT: 294378
RESULT: >100% reserves
April 6, 2014
San Francisco
This post is to report on an audit I performed for the Bitfinex Bitcoin exchange on April 5th and 6th, 2014 from my home office here in San Francisco. I've not received any payment for this audit - my personal goal with this is to help improve the stability of and confidence in the math-based currency industry overall.
Statement
=========
The audit process is designed to allow the auditor - in this case me, Stefan Thomas - to verify that the total amount of bitcoins held by Bitfinex matches the amount required to cover an anonymized set of customer balances. I am attesting to is the root hash of a merkle tree containing all balances that were considered in the audit. If you are a customer of Bitfinex, you'll be able to verify using open-source tools that your balance at the time of the audit is part of this root hash. If it is and if you believe that I am trustworthy, then you can be confident that your balance was covered by 100% reserves at the time of the audit.
Compared to audits performed by other exchanges, this approach is very strict while still maintaining absolute privacy for customers. The most difficult part of an audit is normally to verify that the exchange is not under-reporting the number and balances of account holders. With this approach each account holder can verify that they were considered in the audit.
Trust in this type of audit still requires trust in the auditor. For now, this will rest on my shoulders, but Bitfinex have expressed interest in doing regular audits with different auditors each time. This serves to renew the audit and also to increase the confidence in the audit process and the validity of the result.
Claims
======
Claim 1: Bitfinex controls a certain amount of Bitcoins.
Proof: Bitfinex provided a JSON file with a list of their Bitcoin addresses and balances. I used the `cryptoshi audit` command in libcoin to verify the JSON file against a copy of the block chain.
The version of libcoin used was commit e913a46fd481236f573001abbc879d89595d5fef.
Here is the audit code used:
https://github.com/libcoin/libcoin/blob/e913a46fd481236f573001abbc879d89595d5fef/applications/cryptoshi/cryptoshi.cpp#L638-692Claim 2: The amount from claim 1 is greater than the amount contained in the root hash of balances.
Proof: Bitfinex provided a JSON file containing a set of anonymized user balances. I used my own tool "easy-audit" to calculate the reserve ratio and root hash.
The version of easy-audit used was commit 8dc5882c1d40f5ab9bbea14778cd1abadce6e459
Available at:
https://github.com/justmoon/easy-auditHere is the audit code used:
https://github.com/justmoon/easy-audit/blob/8dc5882c1d40f5ab9bbea14778cd1abadce6e459/proof.js#L21-45The tool's output was:
ASSET OWNER: bitfinex.com
BLOCK HEIGHT: 294378
ROOT HASH: 37c49d606c61aab140726265099992c3dd0fba30e1ce1a8a04f0e56cec6dc19f
RESERVE RATIO: 102.82%
The actual holdings were slightly (< 3%) above the required holdings, meaning Bitfinex had greater than 100% reserves at the audit block height.
// Stefan Thomas
=====END AUDIT REPORT=====
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
iQIcBAEBAgAGBQJTQsC9AAoJEMlHNwCksIvzTqYP/AoNwhCWI0EYcUm0mulbZT5T
DfeXUI3/VdiYMkVz21LNjwzb62DCkKLlA2T042z2zj2PZQy4hFSV6a4DZWYzbgv8
9Uh5v1GCGCBkUGzkDSRZHw8ZCngZBpwYjAzVpTAgpYCpdfHxlbv60ojgWv42qO3e
oTAXslu52jPFSYH7xI3wPL0Ry5BZEa1yB1rBjGzNEkqtLr+Iqz9RXy++Cln8Fx/H
qNQuSfD1XBEUEhddNgscU9dpCFhRdtRZFkk2m7ey6iDzmuAIfVRLL9H0fYeb78Yv
IJm9ugkzNNUS4vkjOvQtEbGZKXCoR/M77xkQ184Q7hd6ewy8bfvgs9364dvt3b2Z
c89Ru/83GKDDG0kB+UWP7zLYuBs0Z7INpCZmAeFSI0K9EOa+6Vll/6NPJZUZGa4W
/nIxxRs2O9IgYxrWQ5F8q9zj+vgP83ZMBUvsBm51wa2SIWRoAzedBjNK/Qvj3dJZ
5JqWaTTXTFP4DYX8dxKeKn9u2+YZ87Rpg8n4zhbzoGvITDmOkUxtYJnBRHbS1yjY
TfoYgaHtfv2DQzu5QpgEkXYQ4dGIhVd2HgMt9mPysJ+DxGYR1AJIFLt5PiMrZJqf
bDA9/MI9k3iCJ6Cl8CCxBedkdzRo09WlNj57TQsuTnWi2UyjuiH6u3y/n1TFUX6p
BL668CgmPco71YrdM1uN
=jCJM
-----END PGP SIGNATURE-----