ChangeLog

Version 2.0.0 (03 July 2026)

TL;DR:

  • new DB schema, so you need to rebuild from scratch. No more “DB::flush_count overflow”.

  • Bitcoin Core >=31 is now required, with txospenderindex=1

  • added support for Electrum Protocol 1.7

  • running with free-threaded CPython is now (experimentally) supported, and is much faster


  • Breaking changes to on-disk database. Server operators need to manually delete old DB, no migration path. New DB will be rebuilt while rescanning again from genesis.

    • in return, no more manual “history compaction” and unexpected downtimes every year: no more “DB::flush_count overflow” (spesmilo/electrumx#88)

    • the size of the new DB is comparable to the old one, however:

  • We now require Bitcoin Core to have txospenderindex=1 (added in Bitcoin Core 31) in addition to txindex=1. This is needed to serve the blockchain.outpoint.subscribe RPC added in Electrum Protocol 1.7.

    For reference, on Bitcoin mainnet around height=950k,

    • the ElectrumX db uses around 122 GiB (using LevelDB, roughly same for both of e-x 1.x and 2.0),
      • note: using RocksDB 9, it is a bit smaller, around 106 GiB

    • .bitcoin/blocks/ uses 788 GiB,

    • .bitcoin/chainstate/ uses 12 GiB,

    • .bitcoin/indexes/txindex/ uses 66 GiB,

    • .bitcoin/indexes/txospenderindex/ uses 88 GiB (new!)

    • This also means that we now require Bitcoin Core 31.0 or newer (for COIN=Bitcoin).

  • env: the previously optional envvar DB_ENGINE, is now mandatory.

    • choose either leveldb or rocksdb

    • in ElectrumX 1.x versions, the default was leveldb.

    You need to install the appropriate dependencies for your engine, see the [leveldb] and [rocksdb] pip extras and the “Database Engine” section of the HOWTO.

    Previously RocksDB was difficult to use as the python bindings for it have been unmaintained for years. By the super-slop-powers of LLMs, we revived the python bindings as rocksdb-ng and made it compatible with modern cpython, cython, and rocksdb. The changes are reviewable and not really slop. (see spesmilo/electrumx#347) rocksdb-ng (starting with version 2.3) is also compatible with free-threaded python, see “performance” section.

    LevelDB was written with HDDs in mind. RocksDB is more modern and on an SSD takes around ~25% less time than LevelDB to sync from genesis. Given that this release contains breaking DB changes and a resync is needed anyway, maybe try out RocksDB :)

  • performance:

    • the BlockProcessor is now massively multi-threaded, both inside a single block and across a span of blocks. This can mainly only be taken advantage of if the GIL (Global Interpreter Lock) is disabled, that is, when using a free-threaded python interpreter: e.g. cpython 3.14t, compiled with --disable-gil. On a decent modern machine with a multi-core CPU, this has been measured to cut initial sync time from genesis to a bit less than half. OTOH, much more RAM is required for the parallel processing (example: approx 2 GB when syncing with GIL, 8 GB when syncing without GIL).

    • processing a single block at the tip, when already caught up, is expected to take around half the time, regardless of the GIL. Still, without the GIL, it is even faster.

    • for more details, see spesmilo/electrumx#369

    • the (block)Prefetcher and the Mempool code are now partially event-based (but still also polling): e.g. a mempool update is triggered as soon as processing a new block begins (and part of the work is done concurrently)

    • json (de)serialization can now optionally use the Rust-based orjson library (via the orjson pip extra), replacing the previous ujson and rapidjson extras.

  • Dockerfiles: the existing Dockerfile was updated and cleaned up a bit, and it serves as a simple minimal example to show how to run ElectrumX. There is now also a second Dockerfile that sets up a free-threaded python for a beefy server to utilise the above-mentioned performance gains. See them in contrib/. (also see the new runtime logline “Python GIL enabled” to verify effect)

  • protocol:
    • new: implement electrum protocol version 1.7 (spesmilo/electrum-protocol#2). The min supported protocol version remains 1.4, the max is now 1.7.

  • LocalRPC: new command: “inspect_session” (spesmilo/electrumx#361).

Version 1.20.0 (03 June 2026)

Small fixes and general maintenance.

After this release, the master branch will move towards a 2.0 release, which will require a resync from genesis. So for a while, master might be less stable than usual.

(We also made some changes to make RocksDB practical and nicer to use, but if you currently use LevelDB, maybe consider waiting for 2.0 before you resync the DB)

Version 1.19.0 (11 Nov 2025)

  • protocol:
  • coins:
    • changed: for COIN=Bitcoin, there is now a min required bitcoind version: Bitcoin Core 28.0 (or Knots 28) (spesmilo/electrumx#316). This is due to protocol 1.6 requiring a bitcoind with working submitpackage RPC.

  • security:
    • fix DOS vector: if MAX_SESSIONS was reached, when using python 3.12+, the server stopped accepting new incoming sessions until full-restart (spesmilo/electrumx#312)

  • session:
    • changed: add warmup budget to PaddedRSTransport (spesmilo/electrumx#323): this is a small relaxation of the traffic analysis countermeasures added in 1.18, where the first 1024 bytes we send are now exempt from buffering (and hence delays)

    • fix ReplyAndDisconnect for PaddedRSTransport: flush message buffer (spesmilo/electrumx#322)

  • env:
    • rm DROP_CLIENT_UNKNOWN opt-in env var: this behaviour is now mandated by protocol 1.6 and we just always enforce it (~small breaking change, affected clients would have already been considered misbehaving)

  • misc:

Version 1.18.0 (14 June 2025)

  • protocol:
    • add basic countermeasures against traffic analysis by padding the jsonrpc payload with whitespaces to have ~uniform-size TCP packets, and by artificially delaying sending messages a bit. (spesmilo/electrumx#301)

  • dependencies:
    • bump required aiorpcx to >=0.25.0,<0.26

Version 1.17.0 (16 Apr 2025)

Long time no see!

  • coins:
  • dependencies:
    • bump required python to >=3.10

    • bump required aiorpcx to >=0.23.0,<0.25

    • rm “pylru” dep, instead bundle stripped-down “cachetools” (spesmilo/electrumx#248)

  • session: log IP address of excessive resusage sessions (spesmilo/electrumx#75)

  • robustness:
    • session: more robust session handling (25339328, 8198ab99)

    • daemon: catch RPC_PARSE_ERROR from bitcoind and simply retry (31489365)

  • env:
    • add MAX_RECV environment variable (a0d3053f)

    • increase default for MAX_SEND (2969ab11)

  • protocol: increase resolution of mempool.get_fee_histogram (265a5a87)

  • LocalRPC:
    • add –timeout arg (5f4dd2cd)

    • add commands to help debug memory leaks (f5582b29)

  • build/maintenance:
  • some internal refactors in preparation for future changes

Version 1.16.0 (10 Dec 2020)

Note: this is the first release since forking from kyuupichan/electrumx. kyuupichan has the electrumx name on PyPI, so we needed a new name there. We are using the e-x name on PyPI, so you can install this package via e.g. pip install e-x.

  • security: a vulnerability has been fixed that allowed a remote attacker to crash electrumx if peer discovery was enabled (#22)

  • fixed some peer-discovery-related bugs (e.g. #35)

  • ENV: when using Bitcoin, the COIN ENV var can now be set to Bitcoin. For compatibility, using BitcoinSegwit will also keep working. (#5)

  • session resource limits: made more useful in general. connection-time-based grouping has been removed (#70). Disconnects of over-limit sessions happen sooner (4b3f6510). Subnet sizes for IP-based grouping can now be configured (a61136c5).

  • protocol: mempool.get_fee_histogram now returns fee rates with 0.1 sat/byte resolution instead of 1 sat/byte, and the compact histogram is calculated differently. (#67)

  • performance: bitcoind is now queried less frequently as estimatefee, relayfee, and server.banner requests are now cached (#24)

  • performance: json ser/deser is now abstracted away and the ujson and rapidjson exras can be used for somewhat faster block processing. (#11)

  • multiple other small performance improvements

Version 1.15.0 (27 May 2020)

  • switch to 5-byte txnums to handle larger blockchains. Upgrade DBs during restart.

  • accurate clearing of stale caches

  • coin additions / updates: NavCoin + Hush + VersusCoin + Zero (cipig), DashRegtest (colmenero), Quebecoin (morinpa), Primecoin (Sunny King), multiple (Panagiotis David), RVN (standard-error), Sumcoin

  • other: Jeremy Rand, Jin Eguchi, ddude, Jonathan Cross, Carsen Klock, cipig

Version 1.14.0 (19 Jan 2020)

  • require Python 3.7

  • support for Bitcoin SV Genesis activation

  • DB upgrade to allow for larger transactions. Your DB will automatically upgrade when starting, the upgrade should take approximately 15 mintues.

  • fix server shutdown process

  • fix cache race condition (issue #909)

  • faster initial sync

  • coin additions / updates: Emercoin (yakimka), Feathercoin (wellenreiter01), Peercoin (peerchemist), Namecoin (JeremyRand), Zcoin (a-bezrukov), Simplicity, Mice (ComputerCraftr), Sibcoin testnet (TriKriSta), Odin (Manbearpixel),

  • other: h2o10, osagga, Sombernight, breign, pedr0-fr, wingsuit

Version 1.13.0 (26 Sep 2019)

  • daemon: use a single connection for all requests rather than a connection per request. Distinguish handling of JSON and HTTP errors

  • recognise OP_FALSE OP_RETURN scripts as unspendable

  • peers - attempt to bind to correct local IP address

  • improve name support (domob1812)

  • coin additions / updates: BitZeny (y-chan), ZCoin (a-bezrukov), Emercoin (yakimka), BSV (Roger Taylor), Bellcoin (streetcrypto7), Ritocoin (traysi), BTC (Sombernight), PIVX (mrcarlanthony), Monacoin (wakiyamap)), NamecoinRegtest (JeremyRand), Axe (ddude1), Xaya (domob1812), GZRO (MrNaif2018), Ravencoin (standard-error)

  • other: gits7r

Version 1.12.0 (13 May 2019)

  • require aiorpcX 0.18.1. This introduces websocket support. The environment variables changed accordingly; see SERVICES and REPORT_SERVICES.

  • work around bug in recent versions of uvloop

  • aiorpcX upgrade fixes from Shane M

  • coin additions / updates: BitcoinSV, Bolivarcoin (Jose Luis Estevez), BTC Testnet (ghost43), Odin (Pixxl)

Version 1.11.0 (18 Apr 2019)

  • require aiorpcX 0.15.x

  • require aiohttp 3.3 or higher; earlier versions had a problematic bug

  • add REQUEST_TIMEOUT and LOG_LEVEL environment variables

  • mark 4 old environment variables obsolete. ElectrumX won’t start until they are removed

  • getinfo local RPC cleaned up and shows more stats

  • miscellaneous fixes and improvements

  • more efficient handling of some RPC methods, particularly blockchain.transaction.get_merkle()

  • coin additions / updates: BitcoinSV scaling testnet (Roger Taylor), Dash (zebra lucky),

  • issues resolved: #566, #731, #795

Version 1.10.1 (13 Apr 2019)

  • introduce per-request costing. See environment variables documentation for new variables COST_SOFT_LIMIT, COST_HARD_LIMIT, REQUEST_SLEEP, INITIAL_CONCURRENT, BANDWIDTH_UNIT_COST. Sessions are placed in groups with which they share some of their costs. Prior cost is remembered across reconnects.

  • require aiorpcX 0.13.5 for better concurrency handling

  • require clients use protocol 1.4 or higher

  • handle transaction.get_merkle requests more efficiently (ghost43)

  • Windows support (sancoder)

  • peers improvements (ghost43)

  • report mempool and block sizes in logs

  • electrumx_rpc: timeout raised to 30s, fix session request counts

  • other tweaks and improvements by Bjorge Dijkstra, ghost43, peleion,

  • coin additions / updates: ECA (Jenova7), ECCoin (smogm), GXX (DEVCØN), BZX (2INFINITY), DeepOnion (Liam Alford), CivX / EXOS (turcol)

Version 1.10.0 (15 Mar 2019)

  • extra countermeasures to limit BTC phishing effectiveness (ghost43)

  • peers: mark blacklisted peers bad; force retry blacklisted peers (ghost43)

  • coin additions / updates: Monacoin (wakiyamap), Sparks (Mircea Rila), ColossusXT, Polis, MNPCoin, Zcoin, GINCoin (cronos), Grosetlcoin (gruve-p), Dash (konez2k), Bitsend (David), Ravencoin (standard-error), Onixcoin (Jose Estevez), SnowGem

  • coin removals: Gobyte, Moneci (cronos)

  • minor tweaks by d42

  • issues fixed #660 - unclean shutdowns during initial sync

Version 1.9.5 (08 Feb 2019)

  • server blacklist logic (ecdsa)

  • require aiorpcX 0.10.4

  • remove dead wallet code

  • fix #727 - not listing same peer twice

Version 1.9.4 (07 Feb 2019)

  • require aiorpcX 0.10.3

  • fix #713

Version 1.9.3 (05 Feb 2019)

  • ignore potential sybil peers

  • coin additions / updates: BitcoinCashABC (cculianu), Monacoin (wakiyamap)

Version 1.9.2 (03 Feb 2019)

  • restore protocol version 1.2 and send a warning for old BTC Electrum clients that they need to upgrade. This is an attempt to protect users of old versions of Electrum from the ongoing phishing attacks

  • increase default MAX_SEND for AuxPow Chains. Truncate AuxPow for block heights covered by a checkpoint. (jeremyrand)

  • coin additions / updates: NMC (jeremyrand), Dash (zebra-lucky), PeerCoin (peerchemist), BCH testnet (Mark Lundeberg), Unitus (ChekaZ)

  • tighter RPC param checking (ghost43)

Version 1.9.1 (11 Jan 2019)

Version 1.9.0 (10 Jan 2019)

  • minimum protocol version is now 1.4

  • coin additions / updates: BitcoinSV, SmartCash (rc125), NIX (phamels), Minexcoin (joesixpack), BitcoinABC (mblunderburg), Dash (zebra-lucky), BitcoinABCRegtest (ezegom), AXE (slowdive), NOR (flo071), BitcoinPlus (bushsolo), Myriadcoin (cryptapus), Trezarcoin (ChekaZ), Bitcoin Diamond (John Shine),

  • close #554, #653, #655

  • other minor tweaks (Michael Schmoock, Michael Taborsky)

Original author of ElectrumX:

Neil Booth kyuupichan@gmail.com https://github.com/kyuupichan

This fork maintained by:

Electrum developers electrumdev@gmail.com https://github.com/spesmilo