Impressions From Running a Full Bitcoin Node

A while back I wrote an article about running a full bitcoin node. Since that time I’ve actually set up the node and run some experiments with it, so I wanted to report back on my experience.

Running Bitcoin Core

Getting Bitcoin installed on Ubuntu is really easy; it’s just a matter of enabling the Bitcoin PPA. This is likely a matter of running the following command on your machine:

sudo apt-add-repository ppa:bitcoin/bitcoin

As I noted in my previous article, compiling bitcoin from the source is another possibility if you’re not on Ubuntu but is a bit more work. The main thing you’ll run into is building Berkeley DB 4.8 from scratch (if you want the portable wallet feature) and possibly memory issues if you have a system with less than 1 GB of memory. I successfully built Bitcoin Core from source on both Debian and Fedora so it’s definitely possible, I just ended up going with Ubuntu and the PPA approach because of the ease of keeping Bitcoin Core up to date that way.

Syncing the blockchain still takes a long time. About a year ago a “headers-first” synchronization option was added to Bitcoin 0.10.0 which is supposed to dramatically reduce the time it takes to initially sync the blockchain; there are some release notes describing the feature here. The way it works is your bitcoind process fetches all of the “headers” for the blockchain blocks, and the headers contain cryptographic hashes of the blocks. Afterwards your client can download the blocks in parallel from other nodes in the network, sort of similar to BitTorrent. In practice, I found that while my bitcoind process did indeed fetch all of the blocks from the network very quickly, the CPU time it takes to actually verify all of the blocks ends up being the limiting factor in syncing the blockchain. The node I’m running has a particularly anemic CPU so I’d imagine that if you had a desktop computer this would be less of an issue. Still, it took several days for me to sync the blockchain.

Sending and receiving money securely is easy. To receive money:

bitcoin-cli getnewaddress

This will generate a new (unique) wallet address for you to receive money. If you use this command every time you want to receive money it will help anonymize your transactions.

To send money:

bitcoin-cli sendtoaddress <destination-address> <number-of-btc>

There are a bunch of other RPCs that are useful, but these should be enough to get started. I was pleasantly surprised to see that on my system there is bash completion for bitcoin-cli, which makes exploring the RPCs a bit easier.

Setting up Bitcoin Core to use Tor is also really easy. You just need to add a proxy line to ~/.bitcoin/bitcoin.conf which points to your Tor SOCKS proxy (which by default will be 127.0.0.1:9050). There are more detailed instructions here.

JoinMarket

The last thing I tried was setting up JoinMarket which is an open source CoinJoin implementation written in Python. Setting it up is easy, the instructions in the README should be enough to get you started.

Once you have JoinMarket installed you can transfer bitcoin into the “zero mixing depth”. Subsequent operations will send bitcoin to deeper mixing depths. Unfortunately, I wasn’t able to actually get this working. When I ran the tumbler.py script it was able to send some bitcoin into the deeper mixing depths, but it never got close to the bottom depth. The tumbler would give me an estimate like “10 hours” and I waited up to 2+ days and never got things close to the bottom mixing depth. I also tried sending coins with the sendpayment.py script and got errors.

While I was testing JoinMarket I only put about 0.2 BTC into my JoinMarket wallets (currently worth about $60 USD) while I tested it. I suspect that my transactions are failing for two reasons: there aren’t enough users on JoinMarket, and my transaction amounts are too small to get picked up by other users. That said, I’m not really interested in transferring more BTC into my JoinMarket wallets until I am able to definitely diagnose this as the problem. I also want to take a minute to figure out how to get coins out if things go awry. Superficially it appears easy since you can easily list the wallet addresses for all of the coins, but I need to spend a bit more time experimenting with this.

I’ve seen Chris Belcher (the author of JoinMarket) in the #bitcoin room in Freenode and I also saw that JoinMarket has its own Freenode channel. One of these days when I feel sufficiently motivated I’ll see if I can track someone down on Freenode who can help me with my problems. In the meantime, I am using conventional tumblers, which I really hate doing. I’d love to be able to report good things about JoinMarket in the future.