Initial commit: snapshot of spesmilo/electrumx 2.0.0
Unmodified source tree of upstream commit 280cb339aa158e099eb936033eecd15719770651
("Merge pull request #389 from SomberNight/202607_release_2_0",
https://github.com/spesmilo/electrumx, release 2.0.0, 3 July 2026).
All Palladium-specific changes are in the commits that follow.
This commit is contained in:
commit
384d907c65
271 files changed
+27905
No files matched your search
@@ -0,0 +1,59 @@
|
||||
Features
|
||||
========
|
||||
|
||||
- Efficient, lightweight reimplementation of electrum-server
|
||||
- Fast synchronization of bitcoin mainnet from Genesis. Recent
|
||||
hardware should synchronize in well under 24 hours. The fastest
|
||||
time to height 448k (mid January 2017) reported is under 4h 30m. On
|
||||
the same hardware JElectrum would take around 4 days and
|
||||
electrum-server probably around 1 month.
|
||||
- Various configurable means of controlling resource consumption and
|
||||
handling bad clients and denial of service attacks. These include
|
||||
maximum connection counts, subscription limits per-connection and
|
||||
across all connections, maximum response size, per-session bandwidth
|
||||
limits, and session timeouts.
|
||||
- Minimal resource usage once caught up and serving clients; tracking the
|
||||
transaction mempool appears to be the most expensive part.
|
||||
- Mostly asynchronous processing of new blocks, mempool updates, and
|
||||
client requests. Busy clients should not noticeably impede other
|
||||
clients' requests and notifications, nor the processing of incoming
|
||||
blocks and mempool updates.
|
||||
- Daemon failover. More than one daemon can be specified, and
|
||||
ElectrumX will failover round-robin style if the current one fails
|
||||
for any reason.
|
||||
- Peer discovery protocol removes need for IRC
|
||||
- Coin abstraction makes compatible altcoin and testnet support easy.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
ElectrumX does not do any pruning or throwing away of history. I want
|
||||
to retain this property for as long as it is feasible, and it appears
|
||||
efficiently achievable for the foreseeable future with plain Python.
|
||||
|
||||
The following all play a part in making it efficient as a Python
|
||||
blockchain indexer:
|
||||
|
||||
- aggressive caching and batching of DB writes
|
||||
- more compact and efficient representation of UTXOs, address index,
|
||||
and history. Electrum Server stores full transaction hash and
|
||||
height for each UTXO, and does the same in its pruned history. In
|
||||
contrast ElectrumX just stores the transaction number in the linear
|
||||
history of transactions. ElectrumX can determine block
|
||||
height from a simple binary search of tx counts stored on disk.
|
||||
ElectrumX stores historical transaction hashes in a linear array on
|
||||
disk.
|
||||
- placing static append-only metadata indexable by position on disk
|
||||
rather than in levelDB. It would be nice to do this for histories
|
||||
but I cannot think of a way.
|
||||
- avoiding unnecessary or redundant computations, such as converting
|
||||
address hashes to human-readable ASCII strings with expensive bignum
|
||||
arithmetic, and then back again.
|
||||
- better choice of Python data structures giving lower memory usage as
|
||||
well as faster traversal
|
||||
- leveraging asyncio for asynchronous prefetch of blocks to mostly
|
||||
eliminate CPU idling. As a Python program ElectrumX is unavoidably
|
||||
single-threaded in its essence; we must keep that CPU core busy.
|
||||
|
||||
Python's :mod:`asyncio` means ElectrumX has no (direct) use for threads
|
||||
and associated complications.
|
||||
Reference in new issue
Block a user