Go to file
2018-06-16 11:42:43 +03:00
examples Move benchmark tool to examples/ 2018-06-14 15:22:47 +03:00
src Remove confusing fee rate metrics 2018-06-16 11:38:33 +03:00
tools Remove 0MQ Python client 2018-05-24 20:45:54 +03:00
.gitignore Ignore other DB directories 2018-06-12 00:01:20 +03:00
.travis.yml Don't build on nightly Rust 2018-05-17 12:28:40 +03:00
Cargo.toml Remove progress bar (to be replaced by Prometheus monitoring) 2018-06-13 10:10:06 +03:00
LICENSE Add MIT license and small README 2018-04-08 23:54:29 +03:00
README.md Add links to README 2018-06-16 11:42:43 +03:00
TODO.md Update README and switch to markdown 2018-06-16 10:41:59 +03:00

Electrum Server in Rust

Build Status

An efficient re-implementation of Electrum Server, inspired by ElectrumX and Electrum Personal Server.

Features

  • Supports Electrum protocol v1.2
  • Maintains an index over transaction inputs and outputs, allowing fast balance queries
  • Fast synchronization of the Bitcoin blockchain (~5 hours for ~184GB @ June 2018) on modest hardware (without SSD)
  • Low index storage overhead (~20%), relying on a local full node for actual transaction retrieval
  • Efficient mempool tracker (allowing better fee estimation)
  • Low CPU & memory usage after initial indexing is over
  • txindex is not required for the Bitcoin node
  • Using a single RocksDB database, for better consistency and crash recovery

Usage

Install latest Rust (1.26+) and latest Bitcoin Core (0.16+).

$ sudo apt update
$ sudo apt install clang

# Allow Bitcoin daemon to sync before starting Electrum server
$ bitcoind -server=1 -daemon=0 -txindex=0 -prune=0

# First build should take ~20 minutes
$ cargo build --release
$ cargo run --release -- -v -l debug.log
Config { log_file: "debug.log", log_level: Debug, network_type: Mainnet, db_path: "./db/mainnet", rpc_addr: V4(127.0.0.1:50001), monitoring_addr: V4(127.0.0.1:42024) }
BlockchainInfo { chain: "main", blocks: 527673, headers: 527677, bestblockhash: "0000000000000000001134b741f53f4e49e9f8073e41af6d8aaad3b849ebeee4", size_on_disk: 196048138442, pruned: false }
opening ./db/mainnet with StoreOptions { bulk_import: true }
applying 0 new headers from height 0
best=0000000000000000001134b741f53f4e49e9f8073e41af6d8aaad3b849ebeee4 height=527673 @ 2018-06-16T04:03:53Z (527674 left to index)
# <initial indexing takes a few hours>
applying 527674 new headers from height 0
closing ./db/mainnet
opening ./db/mainnet with StoreOptions { bulk_import: false }
RPC server running on 127.0.0.1:50001

# The index database is stored here:
$ du db/
36G db/mainnet/

# Connect only to the local server, for better privacy
$ electrum  --oneserver --server=127.0.0.1:50001:t

Monitoring

Indexing and serving metrics are exported via Prometheus:

$ sudo apt install prometheus
$ echo "
scrape_configs:
  - job_name: electrs
    static_configs:
    - targets: ['localhost:42024']
" | sudo tee -a /etc/prometheus/prometheus.yml
$ sudo systemctl restart prometheus
$ firefox 'http://localhost:9090/graph?g0.range_input=1h&g0.expr=index_height&g0.tab=0'