Setting up a Tor hidden service
If you use a Bitcoin full node over Tor, then usually it will only be able to make outgoing connections. Therefore, you will only get a maximum of 8 total connections. This is fine, and is not something you usually need to worry about, but if your computer is often online and you want to be a big help to the network, you can run a Tor hidden service in order to accept incoming connections over Tor.
Note that there is no need to forward port 8333 when using a Tor hidden service. The hidden service will cause most firewalls and NAT setups to be bypassed. For this reason, running a Tor hidden service is also a good idea if you want incoming connections but are for some reason unable to forward port 8333.
Prerequisites
These instructions are for Linux. It is possible to do on Windows, but the instructions would be rather different. (If you've done it on Windows, consider adding the instructions to this page.)
You need Tor (at least version 0.2.7.1). Figure out where your torrc file is (/etc/tor/torrc is one possibility). This guide assumes default Tor settings. This guide assumes that Tor is running under the user and group tor, which will usually be the case if you install Tor using your distro's package manager.
You need Bitcoin Core (or similar). For method 1, you need at least version 0.12.0. Find bitcoin.conf in your data directory.
Method 1 (recommended)
This sets up an ephemeral hidden service. The hidden service address (xxxx.onion) will change every time Bitcoin Core is restarted.
Add these lines to your torrc:
ControlPort 9051 CookieAuthentication 1 CookieAuthFileGroupReadable 1
You need to figure out what user bitcoind or bitcoin-qt is running as. Run the following command while Bitcoin is running:
ps -eo user,group,comm |egrep 'bitcoind|bitcoin-qt' |awk '{print "Bitcoin user: " $1}'
Write down the reported user.
Run the following command as root, which adds your Bitcoin user to the tor group. Replace BITCOIN_USER with the actual user name found above:
usermod -a -G tor BITCOIN_USER
If you don't modify any other settings, Bitcoin Core will usually connect over the regular Internet, but will also allow connections to and from the hidden service. If you want Bitcoin Core to only connect via Tor (for anonymity), add these lines to bitcoin.conf:
proxy=127.0.0.1:9050 listen=1 bind=127.0.0.1
If you additionally want Bitcoin Core to only connect out to Tor hidden services, also add this line (not particularly recommended):
onlynet=onion
If you're only interested in running a hidden service in order to help the network, then there's no need to modify any bitcoin.conf settings at all. Bitcoin Core will automatically detect Tor and create the hidden service.
Now restart Tor, and then Bitcoin Core. You should eventually get incoming connections via the hidden service.
Method 2
This sets up a static hidden service. The hidden service address (xxxx.onion) will never change. This is probably even more helpful for the network, and you will probably get more incoming connections than method 1, but maybe it would be helpful to someone trying to track your transactions.
Add these lines to your torrc:
HiddenServiceDir /var/lib/tor/bitcoin-service/ HiddenServicePort 8333 127.0.0.1:8333
Restart Tor. As root, run cat /var/lib/tor/bitcoin-service/hostname. Your onion address will be reported. If it didn't work, then probably your distro's version of Tor doesn't actually use /var/lib/tor for this purpose. You should try to figure out the correct HiddenServiceDir location.
In the following steps, replace ONION_ADDR with the onion address reported above.
If you don't care about anonymity and are only looking to help the network, add the following lines to bitcoin.conf:
onion=127.0.0.1:9050 listen=1 externalip=ONION_ADDR discover=1
This will allow you to accept connections both via your onion address and your IP address (if you have port 8333 forwarded), and Tor will only be used for connections to and from Tor hidden services.
If you care about anonymity, instead of the above, add the following lines to bitcoin.conf to use Tor for everything:
proxy=127.0.0.1:9050 listen=1 bind=127.0.0.1 externalip=ONION_ADDR
If you additionally want Bitcoin Core to only connect out to Tor hidden services, also add this line (not particularly recommended):
onlynet=onion
Now restart Bitcoin Core. You should eventually get incoming connections via your hidden service.