Electrs is an efficient re-implementation of Electrum Server in Rust, inspired by ElectrumX, Electrum Personal Server, and bitcoincore-indexd.
{% hint style="warning" %}
Difficulty: Medium

-> Make sure that you have followed the Activate mempool & reduce 'dbcache' after a full sync section.
admin, update the packages and upgrade to keep up to date with the OSsudo apt update && sudo apt full-upgrade
sudo apt install libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev clang llvm-dev libclang-dev make g++ cmake build-essential
librocksdb v7.8.3 from the source code. Go to the temporary foldercd /tmp
rocksdb foldergit clone -b v9.10.0 --depth 1 https://github.com/facebook/rocksdb && cd rocksdb
make shared_lib -j $(nproc)
$DEBUG_LEVEL is 0
$DEBUG_LEVEL is 0
CC cache/cache.o
CC cache/cache_entry_roles.o
CC cache/cache_key.o
CC cache/cache_reservation_manager.o
CC cache/charged_cache.o
CC cache/clock_cache.o
CC cache/fast_lru_cache.o
CC cache/lru_cache.o
CC cache/compressed_secondary_cache.o
CC cache/sharded_cache.o
CC db/arena_wrapped_db_iter.o
CC db/blob/blob_contents.o
CC db/blob/blob_fetcher.o
CC db/blob/blob_file_addition.o
CC db/blob/blob_file_builder.o
CC db/blob/blob_file_cache.o
CC db/blob/blob_file_garbage.o
[...]
{% hint style="info" %}
This process can take several minutes, 10-15 minutes, or more, depending on the performance of your device. Please be patient until the prompt shows again
sudo make install-shared
$DEBUG_LEVEL is 0
echo 'prefix=/usr/local' > rocksdb.pc
echo 'exec_prefix=${prefix}' >> rocksdb.pc
echo 'includedir=${prefix}/include' >> rocksdb.pc
echo 'libdir=/usr/local/lib' >> rocksdb.pc
echo '' >> rocksdb.pc
echo 'Name: rocksdb' >> rocksdb.pc
echo 'Description: An embeddable persistent key-value store for fast storage' >> rocksdb.pc
echo Version: 7.8.3 >> rocksdb.pc
echo 'Libs: -L${libdir} -ldl -Wl,-rpath -Wl,'$ORIGIN' -lrocksdb' >> rocksdb.pc
echo 'Libs.private: -lpthread -lrt -ldl -lsnappy -lgflags -lz -lbz2 -llz4 -lzstd ' >> rocksdb.pc
echo 'Cflags: -I${includedir} -std=c++17 -faligned-new -DHAVE_ALIGNED_NEW -DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX -DOS_LINUX -fno-builtin-memcmp -DROCKSDB_FALLOCATE_PRESENT -DSNAPPY -DGFLAGS=1 -DZLIB -DBZIP2 -DLZ4 -DZSTD -DROCKSDB_MALLOC_USABLE_SIZE -DROCKSDB_PTHREAD_ADAPTIVE_MUTEX -DROCKSDB_BACKTRACE -DROCKSDB_RANGESYNC_PRESENT -DROCKSDB_SCHED_GETCPU_PRESENT -DROCKSDB_AUXV_GETAUXVAL_PRESENT -DHAVE_UINT128_EXTENSION -isystem third-party/gtest-1.8.1/fused-src' >> rocksdb.pc
echo 'Requires: ' >> rocksdb.pc
install -d /usr/local/lib
install -d /usr/local/lib/pkgconfig
for header_dir in `find "include/rocksdb" -type d`; do \
install -d //usr/local/$header_dir; \
done
for header in `find "include/rocksdb" -type f -name *.h`; do \
install -C -m 644 $header //usr/local/$header; \
done
for header in ; do \
install -d //usr/local/include/rocksdb/`dirname $header`; \
install -C -m 644 $header //usr/local/include/rocksdb/$header; \
done
install -C -m 644 rocksdb.pc /usr/local/lib/pkgconfig/rocksdb.pc
install -d /usr/local/lib
install -C -m 755 librocksdb.so.7.8.3 /usr/local/lib
ln -fs librocksdb.so.7.8.3 /usr/local/lib/librocksdb.so.7.8
ln -fs librocksdb.so.7.8.3 /usr/local/lib/librocksdb.so.7
ln -fs librocksdb.so.7.8.3 /usr/local/lib/librocksdb.so
sudo ldconfig
/tmp foldercd ..
rocksdb foldersudo rm -r rocksdb
Rustc installedrustc --version
Expected output:
rustc 1.71.0 (8ede3aae2 2023-07-12)
cargo -V
Expected output:
cargo 1.71.0 (cfd3bbd8f 2023-06-08)
{% hint style="warning" %}
If you obtain "command not found" outputs, you need to follow the Rustup + Cargo bonus section to install it, and then come back to continue with the guide
In the Security section, we already set up Nginx as a reverse proxy. Now we can add the Electrs configuration.
admin, create the reverse proxy configurationsudo nano /etc/nginx/streams-available/electrs-reverse-proxy.conf
upstream electrs {
server 127.0.0.1:50021;
}
server {
listen 50022 ssl;
proxy_pass electrs;
}
streams-enabledsudo ln -s /etc/nginx/streams-available/electrs-reverse-proxy.conf /etc/nginx/streams-enabled/
sudo nginx -t
Expected output:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl reload nginx
sudo ufw allow 50022/tcp comment 'allow Electrs SSL from anywhere'
sudo ufw allow 50021/tcp comment 'allow Electrs TCP from anywhere'
There are no precompiled binaries available for Electrs, so we should compile the application ourselves.
admin, go to the temporary foldercd /tmp
VERSION=0.11.0
electrs foldergit clone --branch v$VERSION https://github.com/romanz/electrs.git && cd electrs
curl https://romanzey.de/pgp.txt | gpg --import
Expected output:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1255 100 1255 0 0 3562 0 --:--:-- --:--:-- --:--:-- 3555
gpg: key 87CAE5FA46917CBB: public key "Roman Zeyde <me@romanzey.de>" imported
gpg: Total number processed: 1
gpg: imported: 1
git verify-tag v$VERSION
Expected output:
gpg: Signature made Thu 03 Nov 2022 03:37:23 PM UTC
gpg: using ECDSA key 15C8C3574AE4F1E25F3F35C587CAE5FA46917CBB
gpg: issuer "me@romanzey.de"
gpg: Good signature from "Roman Zeyde <me@romanzey.de>" [unknown]
gpg: aka "Roman Zeyde <roman.zeyde@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 15C8 C357 4AE4 F1E2 5F3F 35C5 87CA E5FA 4691 7CBB
ROCKSDB_INCLUDE_DIR=/usr/local/include ROCKSDB_LIB_DIR=/usr/local/lib cargo build --locked --release
info: syncing channel updates for '1.63.0-x86_64-unknown-linux-gnu'
info: latest update on 2022-08-11, rust version 1.63.0 (4b91a6ea7 2022-08-08)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
info: installing component 'rust-std'
info: installing component 'rustc'
info: installing component 'rustfmt'
Updating crates.io index
Downloaded hex_lit v0.1.1
Downloaded humantime v2.1.0
Downloaded bitflags v1.3.2
Downloaded getrandom v0.2.10
Downloaded rand_chacha v0.3.1
Downloaded is-terminal v0.4.7
Downloaded lock_api v0.4.10
Downloaded libloading v0.7.4
Downloaded jsonrpc v0.14.1
Downloaded jobserver v0.1.26
Downloaded thiserror-impl v1.0.40
Downloaded autocfg v1.1.0
Downloaded dirs-sys-next v0.1.2
Downloaded dirs-next v2.0.0
Downloaded httpdate v1.0.2
Downloaded configure_me v0.4.0
Downloaded lazycell v1.3.0
Downloaded num_cpus v1.16.0
[...]
{% hint style="info" %}
This process can take quite a long time, 10-15 minutes or more, depending on the performance of your device. Please be patient until the prompt shows again
sudo install -m 0755 -o root -g root -t /usr/local/bin ./target/release/electrs
electrs --version
Example of expected output:
v0.10.0
electrs foldersudo rm -r /tmp/electrs
cd
{% hint style="success" %}
If you come to update, this is the final step
electrs usersudo adduser --disabled-password --gecos "" electrs
electrs user a member of the "bitcoin" groupsudo adduser electrs bitcoin
sudo mkdir /data/electrs
electrs usersudo chown electrs:electrs /data/electrs
electrs usersudo su - electrs
nano /data/electrs/electrs.conf
# MiniBolt: electrs configuration
# /data/electrs/electrs.conf
# Bitcoin Core settings
network = "bitcoin"
cookie_file= "/data/bitcoin/.cookie"
# Electrs settings
electrum_rpc_addr = "0.0.0.0:50021"
db_dir = "/data/electrs/db"
server_banner = "Welcome to electrs (Electrum Rust Server) running on a MiniBolt node!"
skip_block_download_wait = true
# Allow concurrent DB background operations. i.e. for 4 threads max use.
# Customise with your available threads.
db_parallelism=4
# Logging
log_filters = "INFO"
electrs user session to return to the admin user sessionexit
admin, create the Electrs systemd unitsudo nano /etc/systemd/system/electrs.service
# MiniBolt: systemd unit for electrs
# /etc/systemd/system/electrs.service
[Unit]
Description=Electrs
Requires=bitcoind.service
After=bitcoind.service
[Service]
ExecStart=/usr/local/bin/electrs --conf /data/electrs/electrs.conf --skip-default-conf-files
# Process management
####################
Type=simple
TimeoutSec=300
KillMode=process
# Directory creation and permissions
####################################
RuntimeDirectory=electrs
RuntimeDirectoryMode=0710
User=electrs
Group=electrs
# Hardening Measures
####################
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
PrivateDevices=true
MemoryDenyWriteExecute=true
[Install]
WantedBy=multi-user.target
sudo systemctl enable electrs
Ctrl-Cjournalctl -fu electrs
To keep an eye on the software movements, start your SSH program (eg, PuTTY) a second time, connect to the MiniBolt node, and log in as admin
sudo systemctl start electrs
journalctl -fu electrs ⬇️Starting electrs 0.10.0 on x86_64 linux with Config { network: Bitcoin, db_path: "/data/electrs/db/bitcoin", daemon_dir: "/data/bitcoin", daemon_auth: CookieFile("/data/bitcoin/.cookie"), daemon_rpc_addr: 127.0.0.1:8332, daemon_p2p_addr: 127.0.0.1:8333, electrum_rpc_addr: 0.0.0.0:50021, monitoring_addr: 127.0.0.1:4224, wait_duration: 10s, jsonrpc_timeout: 15s, index_batch_size: 10, index_lookup_limit: None, reindex_last_blocks: 0, auto_reindex: true, ignore_mempool: false, sync_once: false, disable_electrum_rpc: false, server_banner: "Welcome to electrs (Electrum Rust Server) running on a MiniBolt node!", args: [] }
[2021-11-09T07:09:42.744Z INFO electrs::metrics::metrics_impl] serving Prometheus metrics on 127.0.0.1:4224
[2021-11-09T07:09:42.744Z INFO electrs::server] serving Electrum RPC on 0.0.0.0:50021
[2021-11-09T07:09:42.812Z INFO electrs::db] "/data/electrs/db/bitcoin": 0 SST files, 0 GB, 0 Grows
[2021-11-09T07:09:43.174Z INFO electrs::index] indexing 2000 blocks: [1..2000]
[2021-11-09T07:09:44.665Z INFO electrs::chain] chain updated: tip=00000000dfd5d65c9d8561b4b8f60a63018fe3933ecb131fb37f905f87da951a, height=2000
[2021-11-09T07:09:44.986Z INFO electrs::index] indexing 2000 blocks: [2001..4000]
[2021-11-09T07:09:46.191Z INFO electrs::chain] chain updated: tip=00000000922e2aa9e84a474350a3555f49f06061fd49df50a9352f156692a842, height=4000
[2021-11-09T07:09:46.481Z INFO electrs::index] indexing 2000 blocks: [4001..6000]
[2021-11-09T07:09:47.581Z INFO electrs::chain] chain updated: tip=00000000dbbb79792303bdd1c6c4d7ab9c21bba0667213c2eca955e11230c5a5, height=6000
[2021-11-09T07:09:46.481Z INFO electrs::index] indexing 2000 blocks: [6001..8000]
[2021-11-09T07:09:47.581Z INFO electrs::chain] chain updated: tip=00000000dbbb79792303bdd1c6c4d7ab9c21bba0667213c2eca955e11230c5a6, height=8000
[2021-11-09T07:09:46.481Z INFO electrs::index] indexing 2000 blocks: [8001..10000]
[2021-11-09T07:09:47.581Z INFO electrs::chain] chain updated: tip=00000000dbbb79792303bdd1c6c4d7ab9c21bba0667213c2eca955e11230c5a7, height=10000
[...]
[2021-11-09T07:09:46.481Z INFO electrs::index] indexing 65 blocks: [756001..756065]
[2021-11-09T07:09:47.581Z INFO electrs::chain] chain updated: tip=00000000dbbb79792303bdd1c6c4d7ab9c21bba0667213c2eca955e11230c510, height=756065
[2021-11-09T07:09:47.581Z INFO electrs::db] starting config compaction
[2021-11-09T07:09:47.581Z INFO electrs::db] starting headers compaction
[2021-11-09T07:09:47.581Z INFO electrs::db] starting txid compaction
[2021-11-09T07:09:47.581Z INFO electrs::db] starting funding compaction
[2021-11-09T07:09:47.581Z INFO electrs::db] starting spending compaction
[...]
{% hint style="success" %}
Congrats! Now you have a self-hosted Electrum Server on your node. Now you can process installing the Blockchain Explorer: BTC RPC Explorer, or connect your Desktop signing app: Sparrow Wallet or Electrum Wallet Desktop
50021 port and the monitoring 14224 port (not used on MiniBolt)sudo ss -tulpn | grep electrs
Expected output:
tcp LISTEN 0 128 0.0.0.0:50021 0.0.0.0:* users:(("electrs",pid=54749,fd=4))
tcp LISTEN 0 128 127.0.0.1:14224 0.0.0.0:* users:(("electrs",pid=54749,fd=3))
50022 portsudo ss -tulpn | grep 50022
Expected output:
tcp LISTEN 0 511 0.0.0.0:50022 0.0.0.0:* users:(("nginx",pid=719,fd=5),("nginx",pid=718,fd=5),("nginx",pid=717,fd=5),("nginx",pid=716,fd=5),("nginx",pid=715,fd=5))
{% hint style="info" %}
Electrs must first fully index the blockchain and compact its database before you can connect to it with your wallets. This can take a few hours. Only proceed with the next section once Electrs is ready
To use your Electrum server when you're on the go, you can easily create a Tor hidden service. This way, you can connect the BitBoxApp or Electrum wallet remotely, or even share the connection details with friends and family. Note that the remote device needs to have Tor installed as well.
admin, edit the torrc filesudo nano +63 /etc/tor/torrc --linenumbers
## This section is just for location-hidden services ##" in the torrc file. Save and exit# Hidden Service Electrs TCP & SSL
HiddenServiceDir /var/lib/tor/hidden_service_electrs_tcp_ssl/
HiddenServiceEnableIntroDoSDefense 1
HiddenServicePoWDefensesEnabled 1
HiddenServicePort 50021 127.0.0.1:50021
HiddenServicePort 50022 127.0.0.1:50022
sudo systemctl reload tor
sudo cat /var/lib/tor/hidden_service_electrs_tcp_ssl/hostname
Expected output:
abcdefg..............xyz.onion
{% hint style="info" %}
You should now be able to connect to your Electrs server remotely via Tor using your hostname and port 50022 (SSL) , or 50021 (TCP)
To get address balances, either an Electrum server or an external service is necessary. Your local Electrs server can provide address transaction lists, balances, and more.
admin, open the btcrpcexplorer servicesudo nano /etc/systemd/system/btcrpcexplorer.service
fulcrum.service with the electrs.service. Save and exitRequires=bitcoind.service electrs.service
After=bitcoind.service electrs.service
sudo systemctl restart btcrpcexplorer
sudo systemctl restart electrs
journalctl -fu electrs
Starting electrs 0.10.0 on x86_64 linux with Config { network: Bitcoin, db_path: "/data/electrs/db/bitcoin", daemon_dir: "/data/bitcoin", daemon_auth: CookieFile("/data/bitcoin/.cookie"), daemon_rpc_addr: 127.0.0.1:8332, daemon_p2p_addr: 127.0.0.1:8333, electrum_rpc_addr: 0.0.0.0:50021, monitoring_addr: 127.0.0.1:4224, wait_duration: 10s, jsonrpc_timeout: 15s, index_batch_size: 10, index_lookup_limit: None, reindex_last_blocks: 0, auto_reindex: true, ignore_mempool: false, sync_once: false, disable_electrum_rpc: false, server_banner: "Welcome to electrs (Electrum Rust Server) running on a MiniBolt node!", args: [] }
[2021-11-09T07:09:42.744Z INFO electrs::metrics::metrics_impl] serving Prometheus metrics on 127.0.0.1:4224
[2021-11-09T07:09:42.744Z INFO electrs::server] serving Electrum RPC on 0.0.0.0:50021
[2021-11-09T07:09:42.812Z INFO electrs::db] "/data/electrs/db/bitcoin": 0 SST files, 0 GB, 0 Grows
[2021-11-09T07:09:43.174Z INFO electrs::index] indexing 2000 blocks: [1..2000]
[2021-11-09T07:09:44.665Z INFO electrs::chain] chain updated: tip=00000000dfd5d65c9d8561b4b8f60a63018fe3933ecb131fb37f905f87da951a, height=2000
[2021-11-09T07:09:44.986Z INFO electrs::index] indexing 2000 blocks: [2001..4000]
[2021-11-09T07:09:46.191Z INFO electrs::chain] chain updated: tip=00000000922e2aa9e84a474350a3555f49f06061fd49df50a9352f156692a842, height=4000
[2021-11-09T07:09:46.481Z INFO electrs::index] indexing 2000 blocks: [4001..6000]
[2021-11-09T07:09:47.581Z INFO electrs::chain] chain updated: tip=00000000dbbb79792303bdd1c6c4d7ab9c21bba0667213c2eca955e11230c5a5, height=6000
[2021-11-09T07:09:46.481Z INFO electrs::index] indexing 2000 blocks: [6001..8000]
[2021-11-09T07:09:47.581Z INFO electrs::chain] chain updated: tip=00000000dbbb79792303bdd1c6c4d7ab9c21bba0667213c2eca955e11230c5a6, height=8000
[2021-11-09T07:09:46.481Z INFO electrs::index] indexing 2000 blocks: [8001..10000]
[2021-11-09T07:09:47.581Z INFO electrs::chain] chain updated: tip=00000000dbbb79792303bdd1c6c4d7ab9c21bba0667213c2eca955e11230c5a7, height=10000
[...]
[2021-11-09T07:09:46.481Z INFO electrs::index] indexing 65 blocks: [756001..756065]
[2021-11-09T07:09:47.581Z INFO electrs::chain] chain updated: tip=00000000dbbb79792303bdd1c6c4d7ab9c21bba0667213c2eca955e11230c510, height=756065
[2021-11-09T07:09:47.581Z INFO electrs::db] starting config compaction
[2021-11-09T07:09:47.581Z INFO electrs::db] starting headers compaction
[2021-11-09T07:09:47.581Z INFO electrs::db] starting txid compaction
[2021-11-09T07:09:47.581Z INFO electrs::db] starting funding compaction
[2021-11-09T07:09:47.581Z INFO electrs::db] starting spending compaction
[...]
admin, stop electrssudo systemctl stop electrs
sudo systemctl disable electrs
sudo rm /etc/systemd/system/electrs.service
admin. Delete the electrs user.userdel: electrs mail spool (/var/mail/electrs) not found output, the uninstall has been successfulsudo userdel -rf electrs
sudo rm -rf /data/electrs
admin , edit the torrc config filesudo nano +63 /etc/tor/torrc --linenumbers
## This section is just for location-hidden services ##" in the torrc file. Save and exit# Hidden Service Electrs TCP & SSL
#HiddenServiceDir /var/lib/tor/hidden_service_electrs_tcp_ssl/
#HiddenServiceEnableIntroDoSDefense 1
#HiddenServicePoWDefensesEnabled 1
#HiddenServicePort 50021 127.0.0.1:50021
#HiddenServicePort 50022 127.0.0.1:50022
sudo systemctl reload tor
admin, delete the reverse proxy config filesudo rm /etc/nginx/sites-available/electrs-reverse-proxy.conf
sudo rm /etc/nginx/sites-enabled/electrs-reverse-proxy.conf
sudo nginx -t
Expected output:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl reload nginx
sudo ufw status numbered
Expected output:
[Y] 50021 ALLOW IN Anywhere # allow Electrs TCP from anywhere
[X] 50022 ALLOW IN Anywhere # allow Electrs SSL from anywhere
yes" and entersudo ufw delete X
| Port | Protocol | Use |
|---|---|---|
| 50021 | TCP | Default port |
| 50022 | SSL | Encrypted port |