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
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:
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
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
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
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
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.