
Electrum Server
Electrum is a lightweight Bitcoin wallet.
Electrum’s focus is speed, with low resource usage and simplifying Bitcoin. Startup times are instant because it operates in conjunction with Electrum Servers that handle the most complicated parts of the Bitcoin system.
Electrum Servers are run by volunteers around the Internet.
This document describes how to setup an Electrum Server who will be reachable over IPv4, IPv6 and as Hidden Service over the Tor network.
Prerequisites
Storage Space
The Electrum database needs another 17 GB of storage, additionally to the ~ 40 GB of a Bitcoin Node.
To check the available free space of the disk who will hold the Electrum database:
$ df -h /var/lib
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/server--vg-root 456G 102G 331G 24% /
Bitcoin Full Node
The Electrum Server relies on a installed and running Bitcoin Full Node. The bitcoin node should have processed all blocks and caught up to the current height of the network.
The Electrum server needs to be able to communicate with the Bitcoin node trough RPC.
Additionally the Bitcoin Node needs to maintain a full index of historical transaction IDs, a feature which is not enabled by default.
To enabled this, the following line needs to be added to the Bitcoin
configuration file /etc/bitcoin/bitcoin.conf
:
# Maintain a full index of historical transaction IDs
# Required for Electrum Server
txindex=1
Don’t forget to re-adjust the file ownership if it was edited by the root user:
$ sudo chown -R bitcoin:bitcoin /etc/bitcoin
If this was not the case before on a running Bitcoin Node, the blockchain index needs to be rebuilt. Which means, shut down the Bitcoin service and start a full re-index. Since this can take again several hours or even days to complete its strongly recommended to run this in a screen session:
$ sudo stop bitcoind
$ sudo -u bitcoin \
bitcoind -conf=/etc/bitcoin/bitcoin.conf \
-datadir=/var/lib/bitcoind \
-daemon -server -disablewallet \
–reindex
IP Addresses & DNS Records
We use the same IP addresses and hostname as our Bitcoin node:
2001:db8::39 as global public IPv6 address;
192.0.2.39 as private local IPv4 address (port forwarded from the public IPv4 address);
198.51.100.240 as the ISP provided dynamic public Internet address;
Name |
Type |
Content |
Priority |
TTL |
---|---|---|---|---|
btc |
A |
198.51.100.240 |
300 |
|
btc |
AAAA |
2001:db8::39 |
Firewall Rules
Electrum Server listens on TCP ports 50001 and 50002 for incoming connections. Port 50001 is for plain unencrypted connections and port 50002 is TLS encrypted. We allow only secured connections on IPv4 and IPv6.
IPv4 NAT port forwarding:
Protocol |
Port No. |
Forward To |
Description |
---|---|---|---|
TCP |
50002 |
192.0.2.39 |
Electrum Server TLS Connections |
Allowed IPv6 connections:
Protocol |
Port No. |
Destination |
Description |
---|---|---|---|
TCP |
50002 |
2001:db8::39 |
Electrum Server TLS Connections |
Electrum Server User
For security reasons its best to run the server with its own unprivileged user profile. Create this user on the server system with the following command:
$ sudo adduser --system --group --home /var/lib/electrum electrum
Software Installation
Software Dependencies
Electrum Server is a Python program and depends on various Python libraries:
$ sudo apt-get install python-setuptools python-openssl python-leveldb libleveldb-dev
$ sudo easy_install jsonrpclib irc plyvel
Download
The Electrum Server software is not available as installable software package. They don’t seem to release versions either. Instead the software is installed directly from the source code repository on GitHub:
$ cd /var/lib/electrum
$ sudo -Hu electrum git clone https://github.com/spesmilo/electrum-server.git
Install
You can see from the output below, that the next step takes several hours too. Because of the 13 GB database download.
$ cd electrum-server
$ sudo ./configure
Creating config file
username for running daemon (default: electrum)
Path for database (default: /var/electrum-server) /var/lib/electrum/electrum-db
Database not found in /var/lib/electrum/electrum-db.
Do you want to download it from the Electrum foundry to /var/lib/electrum/electrum-db ? y
-2015-04-27 20:09- http://foundry.electrum.org/leveldb-dump/electrum-fulltree-100-latest.tar.gz
Resolving foundry.electrum.org (foundry.electrum.org)... 78.46.103.75
Connecting to foundry.electrum.org (foundry.electrum.org)|78.46.103.75|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14266991234 (13G) [application/x-gzip]
Saving to: ‘STDOUT’
100%[=====================================================>] 14'266'991'234 947KB/s in 2h 3m
2015-04-27 22:12:25 (1.84 MB/s) - written to stdout [14'266'991'234/14'266'991'234]
rpcuser (from your bitcoin.conf file):
rpcpassword (from your bitcoin.conf file): ********
Configuration written to /etc/electrum.conf.
Please edit this file to finish the configuration.
If you have not done so, please run 'python setup.py install'
Then, run 'electrum-server' to start the daemon
The Python installation script, will build and install the electrum-server
executable in /usr/local/bin/electrum-server
:
$ sudo python setup.py install
Configuration
The installation script created a configuration file
/etc/electrum.conf
and filled parts of
it for us, but it still needs a little bit of work:
[server]
# username for running the daemon
username = electrum
# hostname. set it to a FQDN in order to be reached from outside
host = localhost
# ports
electrum_rpc_port = 8000
stratum_tcp_port = 50001
stratum_tcp_ssl_port = 50002
report_host = btc.example.net
#report_stratum_tcp_port = 50001
#report_stratum_tcp_ssl_port = 50002
banner = Welcome to Electrum!
banner_file = /etc/electrum.banner
#irc = no
#irc_nick = <yournickname>
ssl_certfile = /etc/ssl/certs/example.net.chained.cert.pem
ssl_keyfile = /etc/ssl/example.net.key.pem
logfile = /var/log/electrum.log
donation_address =
[leveldb]
# path to your database
path = /var/lib/electrum/electrum-db
# for each address, history will be pruned if it is longer than this limit
pruning_limit = 100
[bitcoind]
bitcoind_host = localhost
bitcoind_port = 8332
# user and password from bitcoin.conf
bitcoind_user = bitcoinrpc
bitcoind_password = ********
The following steps are done as the electrum user in his home directory
/var/lib/electrum
on the server:
$ sudo -u electrum -Hs
$ cd ~