Electrum Server Implementations: Electrs, ElectrumX, and Fulcrum Compared
Comparing Bitcoin Electrum server implementations on performance, resource usage, and features for wallet infrastructure operators.
Every Bitcoin wallet that does not run its own full node depends on backend infrastructure to answer a simple question: what is the balance of this address? The Electrum server protocol solves this by sitting between a Bitcoin Core full node and lightweight wallet clients, indexing the entire blockchain by address so wallets can query balances, transaction history, and unspent outputs without downloading 600+ GB of block data themselves.
Three open-source implementations dominate this space: Electrs (Rust), ElectrumX (Python), and Fulcrum (C++). Each makes fundamentally different engineering tradeoffs around sync time, disk usage, memory consumption, and query latency. Choosing the right one depends on whether you are running a personal node on a Raspberry Pi or operating wallet infrastructure serving thousands of concurrent connections.
What Electrum Servers Actually Do
A standard Bitcoin full node validates every block and transaction but indexes data by transaction ID, not by address. If a wallet wants to know which transactions involve a specific address, it must scan the entire UTXO set or rely on Bitcoin Core's limited wallet RPCs. This is far too slow for production wallet backends.
Electrum servers solve this by building a secondary index: they connect to a Bitcoin Core node via JSON-RPC, process every block, and create a mapping from script hashes (derived from addresses) to transaction history. Wallet clients then connect to the Electrum server using a lightweight JSON-RPC protocol over TCP or TLS, typically on ports 50001 and 50002.
The Electrum Protocol
The Electrum protocol uses JSON-RPC messages delimited by newlines. A client's first message is always server.version(), which negotiates the protocol version between client and server. From there, the core operations are straightforward:
blockchain.scripthash.get_balance: returns confirmed and unconfirmed balance for an addressblockchain.scripthash.get_history: returns the full transaction history for an addressblockchain.scripthash.listunspent: returns unspent outputs for an addressblockchain.scripthash.subscribe: pushes notifications when an address's state changesblockchain.transaction.get: fetches a raw transaction by its IDblockchain.headers.subscribe: pushes new block headers as they arrive
Clients verify transactions using Merkle proofs against block headers, following the SPV model described in the Bitcoin whitepaper. This is trust-minimized: clients can connect to multiple servers simultaneously and detect inconsistencies, though they still rely on at least one honest server to relay correct data.
Script hashing: Since protocol version 1.1, the Electrum protocol indexes by the SHA-256 hash of the binary scriptPubKey (with byte-reversal for hex display), not by address string. This makes the protocol address-format-agnostic and future-proof across address types from P2PKH through P2TR.
Protocol Version History
The protocol has evolved significantly since its original specification. Version 1.1 introduced script hash methods, replacing the earlier address-based API. Version 1.2 added mempool fee histograms. Version 1.4 brought checkpoint Merkle proofs for faster header chain verification. The latest major version, 1.6, adds package relay support (requiring Bitcoin Core 28.0+), outpoint subscription methods, and traffic analysis countermeasures including message padding and timing obfuscation.
| Protocol Version | Key Additions |
|---|---|
| 1.1 | Script hash methods, server.features(), peer discovery |
| 1.2 | Batch header fetching, mempool.get_fee_histogram(), server.ping() |
| 1.4 | Checkpoint Merkle proofs, transaction.id_from_pos(), removed deserialized headers |
| 1.4.1 | Script hash unsubscribe, AuxPoW header truncation |
| 1.6 | Package broadcast, testmempoolaccept, outpoint subscriptions, scriptpubkey methods, traffic padding |
Electrs: Compact and Resource-Efficient
Electrs is written in Rust by Roman Zeyde. Its defining design choice is a compact indexing strategy: rather than precomputing every possible query result, Electrs stores a minimal index (roughly 10% of blockchain size) using RocksDB and reparses raw blocks on-the-fly to answer most queries. This dramatically reduces disk usage at the cost of higher query latency.
Architecture and Design
Electrs connects directly to Bitcoin Core via RPC and does not require txindex=1, unlike the other two implementations. It processes blocks in configurable batches (defaulting to 2,000 blocks per batch) and maintains separate RocksDB column families for headers, transaction IDs, funding outputs, and spending records.
The compact index approach means the database stores just enough information to locate relevant blocks for a given script hash. When a wallet queries its full transaction history, Electrs identifies which blocks contain relevant transactions, then reparses those blocks from Bitcoin Core to construct the response. This is slower per-query but results in an index that occupies around 35 to 45 GB versus 100+ GB for full-index implementations.
Forks and Variants
Two significant forks extend Electrs for different use cases. Blockstream's fork adds an HTTP REST API (Esplora) and supports Liquid/Elements sidechain indexing. It powers blockstream.info but consumes significantly more resources: around 800 GB of disk when fully indexed. The mempool fork powers the mempool.space block explorer and is optimized for high-volume public API usage.
Important distinction: When people reference "electrs" in benchmarks, they may mean the original romanz/electrs (compact index, ~35-45 GB) or the Blockstream/Esplora fork (full index, ~800 GB). These have radically different performance profiles. Always check which variant is being tested.
ElectrumX: The Original Reference Server
ElectrumX is the original Electrum server implementation, initially written by Neil Booth and now maintained by the Electrum wallet team (spesmilo). Written entirely in Python using asyncio, it builds a full address index and serves as the reference implementation for the Electrum protocol.
Architecture and Design
ElectrumX uses an async event-loop architecture with distinct components: a Daemon module communicating with Bitcoin Core via RPC, a Block Processor that maintains chain state and the UTXO/history index, a Prefetcher that queues blocks ahead of processing, and a Mempool tracker for unconfirmed transactions. Each client session runs as a separate ElectrumX instance coordinated by a central Controller.
It requires Bitcoin Core with txindex=1 enabled (full transaction index) and a non-pruned node. The database backend is configurable between LevelDB (default) and RocksDB, with comparable performance between the two. A default cache of 1,200 MB accelerates initial sync, with the recommendation not to exceed 60% of available system RAM.
Protocol Leadership
As the reference implementation, ElectrumX leads protocol development. Version 2.0.0 (released July 2026) introduced Electrum protocol 1.6 support, requiring Bitcoin Core 28.0+ for the submitpackage RPC. It also added traffic analysis countermeasures: padded message lengths, buffered flushes at 1 KB or 1 second intervals, and dummy server.ping messages to obscure real traffic patterns.
After a quiet period between late 2020 and early 2025, development resumed aggressively with four releases spanning 2025 and 2026. The session management system now supports configurable resource limits, subnet-based connection grouping, and soft/hard cost limits for request throttling: useful for operators running public-facing servers.
Fulcrum: Maximum Query Performance
Fulcrum is written in modern C++20 by Calin Culianu, originally developed for the Bitcoin Cash ecosystem and now fully supporting Bitcoin mainnet. Its architecture prioritizes query speed above all else: Fulcrum precomputes and stores everything needed to answer client requests, resulting in the largest disk footprint but the fastest response times.
Architecture and Design
Fulcrum is multi-threaded and asynchronous, built on Qt Core and Qt Networking libraries. Unlike ElectrumX's single-threaded Python event loop, Fulcrum can saturate multiple CPU cores during both initial sync and query serving. It requires Bitcoin Core with txindex=1 and optionally uses ZeroMQ (zmqpubhashblock) for real-time block arrival notifications instead of polling.
Version 2.0.0 (September 2025) completely overhauled the database format to be crash-safe, eliminating the corruption issues that occasionally plagued the 1.x series on unexpected shutdowns. The database is also cross-platform portable: an index built on Linux can be copied to macOS or Windows without re-syncing.
Performance Characteristics
Fulcrum's full precomputation model pays off dramatically at query time. According to benchmarks published by Sparrow Wallet, initial wallet load times for a wallet with 3,000 addresses show a stark difference: 1.4 to 2.3 seconds on Fulcrum versus 41 to 54 seconds on ElectrumX and 322 to 428 seconds on Electrs. That is a 20x to 300x range depending on the comparison pair.
The tradeoff is storage: Fulcrum's index consumes roughly 100 to 135 GB on Bitcoin mainnet (as of mid-2026), compared to 70 to 80 GB for ElectrumX and 35 to 45 GB for Electrs. For operators with ample SSD capacity, this is a worthwhile exchange. For Raspberry Pi setups with limited storage, it constrains options.
Head-to-Head Comparison
The following comparison draws from benchmarks published by Sparrow Wallet (Raspberry Pi 4, 8 GB RAM, 1 TB USB SSD) and Casa (AWS EC2 c5.xlarge, 4 vCPU, 8 GB RAM). Index sizes grow over time as the blockchain expands, so treat absolute numbers as relative benchmarks.
| Metric | Electrs | ElectrumX | Fulcrum |
|---|---|---|---|
| Language | Rust | Python (asyncio) | C++20 (multi-threaded) |
| License | MIT | MIT | GPLv3 |
| Index strategy | Compact (reparse on query) | Full index | Full index (precomputed) |
| Database | RocksDB | LevelDB or RocksDB | Custom (crash-safe since 2.0) |
| Requires txindex | No | Yes | Yes |
| Index size (approx.) | 35-45 GB | 70-80 GB | 100-135 GB |
| Sync time (RPi 4) | 12-24 hours | 5-7 days | 2-3 days |
| Wallet load (3k addrs) | 322-428 seconds | 41-54 seconds | 1.4-2.3 seconds |
| Max protocol version | 1.4 | 1.6 | 1.6 |
| Altcoin support | Bitcoin only | Bitcoin + altcoins | BTC, BCH, LTC |
Choosing the Right Implementation
The right Electrum server depends entirely on the deployment context. There is no universally best option: each implementation optimizes for a different constraint.
Personal Node Operators
For a single user running a Bitcoin node at home on a Raspberry Pi or small NUC, Electrs is often the best starting point. It syncs fastest (12 to 24 hours on a Pi 4 with SSD), consumes the least disk space, and does not require txindex=1 on Bitcoin Core, simplifying the initial setup. Query latency is slower, but for a personal wallet checking balances a few times per day, the difference between 2 seconds and 400 seconds for initial wallet load is the main pain point, not per-query speed.
If you want faster wallet interactions and have the storage budget, Fulcrum on a Raspberry Pi 4 with 8 GB RAM and a 2 TB SSD delivers dramatically better query performance. The 2 to 3 day sync time is a one-time cost.
Wallet Companies and Infrastructure Providers
For production wallet backends serving hundreds or thousands of concurrent connections, Fulcrum's multi-threaded C++ architecture and precomputed indexes make it the strongest choice. Sub-second wallet loads matter when users expect instant balance updates, and the ability to saturate multiple CPU cores means a single Fulcrum instance handles far more concurrent clients than ElectrumX.
ElectrumX remains relevant for production deployments that need protocol 1.6 features (package relay, outpoint subscriptions) and its mature session management: configurable cost limits, subnet grouping, and DoS protections. For teams already running Python infrastructure, the operational familiarity is a practical advantage.
The Blockstream Esplora fork of Electrs is the go-to for teams that need both Electrum protocol support and an HTTP REST API for block explorer functionality, though at the cost of roughly 800 GB of index storage.
Node-in-a-Box Distributions
The major plug-and-play node distributions have made their own choices. Start9 uses Fulcrum exclusively, prioritizing query performance for their users. Umbrel and RaspiBolt default to Electrs for its lower resource requirements, though both offer Fulcrum as an alternative. These defaults reflect the typical hardware profile of their user base: often a Raspberry Pi with a 1 TB external drive where every gigabyte of index space competes with the blockchain itself.
Deployment Considerations
Hardware Requirements
All three implementations require a fully synced, non-pruned Bitcoin Core node (except Electrs, which supports pruned nodes). The total disk budget for a complete setup in mid-2026 looks roughly like this:
- Bitcoin Core blockchain data: approximately 650 GB (non-pruned with txindex)
- Electrs index: 35-45 GB additional
- ElectrumX index: 70-80 GB additional
- Fulcrum index: 100-135 GB additional
A 1 TB drive accommodates Electrs comfortably but leaves Fulcrum with thin margins. A 2 TB SSD is recommended for Fulcrum deployments with room to grow.
Monitoring and Operations
Fulcrum includes a dedicated admin interface (FulcrumAdmin, a Python script) for runtime monitoring and management. ElectrumX exposes a local RPC interface for administrative commands. Electrs logs sync progress and query activity to stdout but has no built-in admin tooling: operators typically wrap it with systemd and external monitoring.
For all three, monitoring the gap between the Electrum server's indexed block height and Bitcoin Core's current tip is the single most important operational metric. A growing gap indicates the indexer is falling behind, whether due to resource constraints, a stuck process, or a Bitcoin Core connectivity issue.
Security Model
Electrum servers are part of the SPV trust model. A malicious server can withhold transactions (making a balance appear lower than it is) or serve incorrect fee estimates, but it cannot forge transactions or steal funds. Clients can mitigate withholding attacks by connecting to multiple independent servers.
For private deployments, running your own Electrum server over Tor or a VPN eliminates the privacy leak of sending your addresses to a third-party server. This is one of the primary motivations for personal node setups: not trust minimization (since you trust your own server) but privacy.
Implications for L2 Wallet Infrastructure
Layer 2 wallet backends need reliable access to Bitcoin L1 data: monitoring on-chain transactions, verifying deposit confirmations, tracking UTXO state for exit transactions, and estimating fees for settlement. The choice of Electrum server implementation directly affects the responsiveness and reliability of these operations.
Wallet SDKs in the Spark ecosystem, for example, rely on backend indexing infrastructure to resolve on-chain state for deposits, withdrawals, and unilateral exits. A Fulcrum instance serving sub-second address lookups enables responsive deposit confirmation UX, while an Electrs instance's multi-second latency might require additional caching layers to maintain the same user experience. For developers building on the Spark SDK, understanding these infrastructure tradeoffs informs architecture decisions around indexing backends, caching strategies, and failover configurations.
Teams operating Lightning channels or watchtower services face similar considerations: the indexer must keep pace with new blocks to detect on-chain events (channel closes, breach attempts) within a single block confirmation window. Fulcrum's ZeroMQ integration and multi-threaded block processing reduce the lag between a new block arriving and the indexer updating its state, which matters for time-sensitive L2 monitoring.
Operational reality: Most production wallet companies run multiple Electrum server instances behind a load balancer, often mixing implementations. A common pattern uses Fulcrum for latency-sensitive wallet queries and Electrs (or its Esplora variant) for block explorer API endpoints that benefit from different query patterns.
The Road Ahead
Protocol development continues to be driven primarily by ElectrumX as the reference implementation. Protocol version 1.6's package relay support aligns with Bitcoin Core's own package relay and v3 transaction work, reflecting the protocol's evolution from a simple address-lookup tool toward a richer interface for fee bumping and transaction management.
Compact block filters (BIP 157/158) offer an alternative approach to lightweight wallet queries without relying on a trusted server at all. However, compact block filters trade bandwidth for privacy: clients download filters for every block and scan locally, which is practical for desktop wallets but expensive on mobile connections. Electrum servers remain the pragmatic choice for mobile wallet backends where bandwidth efficiency matters more than eliminating server trust entirely.
For wallet infrastructure operators evaluating their stack, the decision framework is straightforward: start with Electrs if resources are constrained, move to Fulcrum when query performance becomes the bottleneck, and consider ElectrumX when you need the latest protocol features or its mature session management for public-facing deployments.
This article is for educational purposes only. It does not constitute financial or investment advice. Bitcoin and Layer 2 protocols involve technical and financial risk. Always do your own research and understand the tradeoffs before using any protocol.

