Bridgewalker server component
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
doc
html_client
log
snaplets/heist/templates
src
static
.ghci
.gitignore
LICENSE
README.md
bridgewalker.cabal
devel-server

README.md

This is the server component of Bridgewalker ( https://www.bridgewalkerapp.com/ ).

To give a very rough overview: The server is a Haskell application to which clients ( for example the Android client - see https://github.com/javgh/Bridgewalker-Android ) can connect to via a websocket connection. See doc/api.md for a description of the server API. The server maintains user accounts and other state in a PostgreSQL database and uses a locally running Bitcoin daemon and an exchange account at Mt.Gox to offer functionality to the clients. All user deposits are kept in euros, but the server requires a small bitcoin "buffer" both locally as well as on the exchange side to be able to quickly send out Bitcoin transactions as well as push exchange orders through. It will periodically rebalance these buffers should an imbalance arise.

To get an idea of how everything is supposed to play together, it is probably best to have a look at the Ansible script which deploys the production server. See: https://github.com/javgh/bridgewalker-deployment . That repository also contains a template for the Bridgewalker configuration file (expected at ~/.bridgewalker/config), which looks something like this:

mtgox_auth_key =
mtgox_auth_secret =
key_set = 2
rpcurl = http://127.0.0.1:8332
rpcuser = rpcuser
rpcpassword = localaccessonly
safety_margin_btc = 0.50
safety_margin_usd = 5.00
typical_tx_fee = 0.0001
maximum_order_btc = 4.00
mtgox_minimum_order_btc = 0.01
target_exchange_fee = 0.4
bitcoind_notify_file = /home/jan/.bitcoin/notify.pid
marker_addresses = [ ("1LNWw6yCxkUmkhArb2Nf2MPw6vG7u5WG7q", 10)
                   , ("14Z1mazY4HfysZyMaKudFr63EwHqQT2njz", 2)
                   , ("1MAbwuYp8CPChJ1ua25tnEKXkfXTVqEoyg", 10)
                   ]
stdout_logging = false

The first three lines configure API access to the Mt.Gox account. This is not quite as straightforward, as it might appear at first, as the keys listed here will first be combined with hardcoded keys inside the server binary to arrive at the final keys. This was done to add some extra "security by obscurity". While security by obscurity is not a valid security concept on its own, it certainly does not hurt to have it in addition. The thinking was, that should an attacker gain access to the server's configuration file, that he would still need to figure out this scheme and then extract the harcoded part of the key from the binary. This would hopefully slow down or maybe even prevent some less skilled attackers from escalating access to the exchange account. Now that the source code is open source, some of that "security by obscurity" is negated of course, but the mechanism it still active. To bring Mt.Gox API credentials in the necessary format, use the function scrambleText in src/ScrambleCredentials.hs . For example:

ghci ScrambleCredentials.hs
> scrambleText "asdf1234"
("asdf0000",[42,84,126,168])

Then put the first part (asdf0000) inside the configuration file and set the second part ([42,84,126,168]) as one of the hardcoded keys in ScrambleCredentials.hs . The constants hardcodedKeyA and hardcodedKeyB are used to unscramble mtgox_auth_key and mtgox_auth_secret respectively if key_set is set to 1. If it is set to 2, the constants hardcodedKeyC and hardcodedKeyD are used. This can be used to have two differents sets of credentials for the staging and production environment.

Lines 3 to 6 specify on how to access the local Bitcoin daemon.

The parameters safety_margin_btc and safety_margin_usd specify the minimum balance that should always be maintained for the local bitcoin balance as well as the exchange bitcoin and fiat balance. This is to ensure that an action does not fail with "insufficient funds" just because an estimation was off by a few cents. Please note, that Bridgewalker is currently hardcoded to work on the BTC/EUR pair for Mt.Gox only. This was done in a very hackish way, which is why many of the function names still contain USD, because BTC/USD was the previously used pair. I apologize for this terrible source of confusion. I had planned to clean this up, but you know how priorities change around sometimes. So in this case the parameter safety_margin_usd actually specifies an euro amount.

The parameter typical_tx_fee specifies the transaction fee (in BTC) that should be assumed for all outgoing Bitcoin transactions and deducted accordingly from user balances. The parameter maximum_order_btc sets the maximum size of an outgoing Bitcoin transaction and mtgox_minimum_order_btc specifies the smallest possible order that can be executed on Mt.Gox (currently 0.01 BTC). The parameter target_exchange_fee is used to decide what the minimum fee per transaction should be in percent. The actual fee the user will have to pay is always along the lines of max(exchange_fee, target_exchange_fee), so only if the fee paid to the exchange is lower than this target fee will Bridgewalker create any revenue.

The parameter bitcoind_notify_file is passed on to the Haskell Bitcoin RPC library ( see here for documentation: http://hackage.haskell.org/package/bitcoin-rpc ).

The parameter marker_addresses lists a number of marker addresses (also called green addresses) that are trusted to not double spend. Transactions from these addresses are treated as confirmed instantaneously. Each address is accompanied by a limit, which specifies the total amount of BTC that can be in "pending" state (unconfirmed transactions) at any time from this address. If transactions from this address exceed this limit, they are treated as standard transactions. You can read more about green addresses here: https://en.bitcoin.it/wiki/Green_address .

The parameter stdout_logging activates logging to STDOUT. Regardless of this setting, additional logs will always be written to the subdirectory log/.

Finally an additional configuration file called workingfund (also in ~/.bridgewalker) should list a single number, which is the size of the Bitcoin buffer (in BTC) which will be maintained both locally as well as on the exchange side. This number needs to be at least as large as maximum_order_btc so that the server is able to send out the largest possible transaction using only the buffer.