├── tests ├── __init__.py ├── lib │ ├── __init__.py │ ├── test_script.py │ ├── test_env_base.py │ ├── test_tx.py │ └── test_hash.py ├── server │ ├── __init__.py │ ├── test_notifications.py │ └── test_storage.py ├── blocks │ ├── koto_testnet_10000.json │ ├── dash_testnet_2999.json │ ├── machinecoin_mainnet_500000.json │ ├── unitus_mainnet_88888.json │ ├── uniformfiscalobject_mainnet_1300154.json │ ├── feathercoin_mainnet_2001000.json │ ├── xuez_mainnet_1.json │ ├── denarius_mainnet_10000.json │ ├── gamecredits_mainnet_500000.json │ ├── gravitycoin_mainnet_100000.json │ ├── axe_mainnet_30237.json │ ├── noir_mainnet_370000.json │ ├── pivx_mainnet_10000.json │ ├── polis_mainnet_100000.json │ ├── dash_mainnet_844898.json │ ├── koto_mainnet_60000.json │ ├── xuez_mainnet_15000.json │ ├── newyorkcoin_mainnet_3956926.json │ ├── pac_testnet_16275.json │ ├── monacoin_testnet_56969.json │ ├── quebecoin_mainnet_472979.json │ ├── bitsend_mainnet_571000.json │ ├── bellcoin_mainnet_412394.json │ ├── bitcoinzero_mainnet_50000.json │ ├── defcoin_mainnet_1000.json │ ├── onixcoin_mainnet_300000.json │ ├── aryacoin_mainnet_1000.json │ ├── monacoin_mainnet_1145140.json │ ├── myriadcoin_mainnet_2587044.json │ ├── simplicity_mainnet_400000.json │ ├── europecoin_mainnet_1000.json │ ├── axe_testnet_30.json │ ├── chips_mainnet_200000.json │ ├── nix_mainnet_50000.json │ ├── lynx_mainnet_1000.json │ ├── cannacoin_mainnet_1000.json │ ├── flashcoin_mainnet_1000.json │ ├── zcoin_mainnet_100000.json │ ├── axe_testnet_30237.json │ ├── groestlcoin_testnet_600000.json │ ├── gravitycoin_mainnet_400000.json │ ├── ixcoin_mainnet_1000.json │ ├── smileycoin_mainnet_1000.json │ ├── decred_mainnet_100.json │ ├── digitalcoin_mainnet_1000.json │ ├── primecoin_mainnet_3117396.json │ ├── linx_mainnet_1000.json │ ├── nix_testnet_200.json │ ├── unobtanium_mainnet_1000.json │ ├── pivx_testnet_10000.json │ ├── bitcore_mainnet_100000.json │ ├── egulden_mainnet_1000.json │ ├── litecoincash_mainnet_1000.json │ ├── bitcoingreen_mainnet_285000.json │ ├── navcoin_mainnet_3700000.json │ ├── mnpcoin_mainnet_50000.json │ ├── primecointestnet_testnet_530680.json │ ├── colossusxt_mainnet_100000.json │ ├── pivx_testnet_1000.json │ ├── reddcoin_mainnet_1200000.json │ ├── ritocoin_mainnet_250000.json │ ├── deeponion_mainnet_50000.json │ ├── emercoin_mainnet_80312.json │ ├── bitcoingreen_mainnet_10000.json │ ├── pivx_mainnet_1000000.json │ ├── bitcoinplus_mainnet_749740.json │ ├── bitcoingold_mainnet_80000.json │ ├── bitcoinatom_mainnet_586900.json │ ├── namecoin_mainnet_19204.json │ ├── exos_testnet_60000.json │ ├── iop_mainnet_1000.json │ ├── donu_mainnet_1000.json │ ├── bolivarcoin_mainnet_500000.json │ ├── bitcoinatom_mainnet_586956.json │ ├── pac_mainnet_27676.json │ ├── exos_mainnet_50000.json │ ├── emercoin_mainnet_357826.json │ ├── ravencoin_testnet_100000.json │ ├── myce_mainnet_710000.json │ ├── groestlcoin_mainnet_2000000.json │ ├── myce_mainnet_341500.json │ ├── electra_mainnet_200000.json │ ├── simplicity_mainnet_1040000.json │ ├── ravencoin_testnet_250000.json │ ├── gravityzerocoin_mainnet_400000.json │ ├── namecoin_mainnet_19200.json │ ├── odin_mainnet_1337.json │ ├── odin_mainnet_17000.json │ ├── peercoin_mainnet_400000.json │ ├── peercointestnet_testnet_1337.json │ ├── peercointestnet_testnet_310000.json │ ├── gravityzerocoin_mainnet_42000.json │ ├── eccoin_mainnet_200000.json │ ├── smartcash_mainnet_200000.json │ ├── trezarcoin_mainnet_612581.json │ ├── zero_mainnet_800000.json │ ├── eccoin_mainnet_120000.json │ ├── tokenpay_mainnet_20000.json │ ├── adcoin_mainnet_1000.json │ ├── bata_mainnet_1000.json │ ├── electra_mainnet_120000.json │ ├── xaya_mainnet_neoscrypt_400021.json │ ├── bitcoinsv_mainnet_100000.json │ ├── emercoin_mainnet_255544.json │ └── litecoin_mainnet_900000.json ├── test_blocks.py ├── transactions │ ├── xaya_mainnet_namereg_a32f38.json │ ├── namecoin_mainnet_0c6867.json │ └── emercoin_mainnet_35ea64.json └── test_transactions.py ├── electrumx ├── lib │ ├── __init__.py │ ├── enum.py │ └── env_base.py ├── server │ └── __init__.py └── __init__.py ├── contrib ├── daemontools │ ├── env │ │ ├── COIN │ │ ├── NET │ │ ├── USERNAME │ │ ├── DB_DIRECTORY │ │ ├── ELECTRUMX │ │ └── DAEMON_URL │ ├── log │ │ └── run │ └── run ├── systemd │ ├── electrumx.service │ └── electrumx.conf ├── raspberrypi3 │ ├── install_electrumx.sh │ └── run_electrumx.sh └── Dockerfile ├── .gitignore ├── docs ├── authors.rst ├── protocol.rst ├── Makefile ├── make.bat ├── ACKNOWLEDGEMENTS ├── PERFORMANCE-NOTES ├── index.rst └── architecture.rst ├── LICENCE ├── README.rst ├── electrumx_server ├── .travis.yml ├── setup.py └── electrumx_compact_history /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/lib/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /electrumx/lib/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /electrumx/server/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/server/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /contrib/daemontools/env/COIN: -------------------------------------------------------------------------------- 1 | Bitcoin 2 | -------------------------------------------------------------------------------- /contrib/daemontools/env/NET: -------------------------------------------------------------------------------- 1 | mainnet 2 | -------------------------------------------------------------------------------- /contrib/daemontools/env/USERNAME: -------------------------------------------------------------------------------- 1 | electrumx 2 | -------------------------------------------------------------------------------- /contrib/daemontools/env/DB_DIRECTORY: -------------------------------------------------------------------------------- 1 | /path/to/db/directory 2 | -------------------------------------------------------------------------------- /contrib/daemontools/env/ELECTRUMX: -------------------------------------------------------------------------------- 1 | /path/to/electrumx_server 2 | -------------------------------------------------------------------------------- /contrib/daemontools/env/DAEMON_URL: -------------------------------------------------------------------------------- 1 | http://username:password@host:port/ 2 | -------------------------------------------------------------------------------- /contrib/daemontools/log/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | exec multilog s500000 n10 /path/to/log/dir 3 | -------------------------------------------------------------------------------- /electrumx/__init__.py: -------------------------------------------------------------------------------- 1 | version = 'ElectrumX 1.15.0' 2 | version_short = version.split()[-1] 3 | 4 | from electrumx.server.controller import Controller 5 | from electrumx.server.env import Env 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/__pycache__/ 2 | .cache/ 3 | .pytest_cache/ 4 | */*~ 5 | *.#* 6 | *# 7 | *~ 8 | docs/_build 9 | /build 10 | /dist 11 | /electrumx.egg-info 12 | .vscode/ 13 | .mypy_cache/ 14 | .idea/ 15 | -------------------------------------------------------------------------------- /contrib/daemontools/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "Launching ElectrumX server..." 3 | USERNAME=$(envdir ./env printenv USERNAME) 4 | ELECTRUMX=$(envdir ./env printenv ELECTRUMX) 5 | ulimit -n 4000 && exec 2>&1 envdir ./env envuidgid $USERNAME python3 $ELECTRUMX 6 | -------------------------------------------------------------------------------- /docs/authors.rst: -------------------------------------------------------------------------------- 1 | .. _Authors: 2 | 3 | Authors 4 | ======= 5 | 6 | * Neil Booth 7 | 8 | Creator and maintainer. 9 | 10 | * Johann Bauer 11 | 12 | Backend DB abstraction. 13 | 14 | * John Jegutanis 15 | 16 | Alt-chain integrations. 17 | -------------------------------------------------------------------------------- /docs/protocol.rst: -------------------------------------------------------------------------------- 1 | Electrum Protocol 2 | ================= 3 | 4 | This is intended to be a reference for client and server authors 5 | alike. 6 | 7 | .. toctree:: 8 | :maxdepth: 1 9 | 10 | protocol-basics 11 | protocol-methods 12 | protocol-changes 13 | protocol-removed 14 | protocol-ideas 15 | -------------------------------------------------------------------------------- /contrib/systemd/electrumx.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Electrumx 3 | After=network.target 4 | 5 | [Service] 6 | EnvironmentFile=/etc/electrumx.conf 7 | ExecStart=/usr/local/bin/electrumx_server 8 | User=electrumx 9 | LimitNOFILE=8192 10 | TimeoutStopSec=30min 11 | 12 | [Install] 13 | WantedBy=multi-user.target 14 | -------------------------------------------------------------------------------- /contrib/systemd/electrumx.conf: -------------------------------------------------------------------------------- 1 | # default /etc/electrumx.conf for systemd 2 | 3 | # REQUIRED 4 | DB_DIRECTORY = /db 5 | # Bitcoin Node RPC Credentials 6 | DAEMON_URL = http://username:password@hostname:port/ 7 | 8 | # COIN = Bitcoin 9 | 10 | # See http://electrumx.readthedocs.io/en/latest/environment.html for 11 | # information about other configuration settings you probably want to consider. 12 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = -W 6 | SPHINXBUILD = sphinx-build 7 | SPHINXPROJ = ElectrumX 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /tests/blocks/koto_testnet_10000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "a9b4154878118387b4494ba0ee9c68c46572442a10613dfe8150fa5810fa70fd", 3 | "size": 170, 4 | "height": 10000, 5 | "merkleroot": "9ebd0c89c919e18eb5c353dbd1faad4e322cde50a814ce36cf0d33ce7a925d56", 6 | "tx": [ 7 | "9ebd0c89c919e18eb5c353dbd1faad4e322cde50a814ce36cf0d33ce7a925d56" 8 | ], 9 | "time": 1521741949, 10 | "nonce": 1023934464, 11 | "bits": "1f052641", 12 | "previousblockhash": "84fdcc6d547b652aa86ce52ca593887c8d126dc81d840addb8f8dc55f6282e29", 13 | "block": "04000000292e28f655dcf8b8dd0a841dc86d128d7c8893a52ce56ca82a657b546dccfd84565d927ace330dcf36ce14a850de2c324eadfad1db53c3b58ee119c9890cbd9e7df0b35a4126051f0000083d0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0402102700ffffffff019032f989000000001976a9145754343f9da87f8ede9461d41407de4e0f76879688ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/dash_testnet_2999.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000024bc3f4f4cb30d29827c13d921ad77d2c6072e586c7f60d83c2722cdcc5", 3 | "size": 181, 4 | "height": 2999, 5 | "merkleroot": "657705283f2be7f2983ea63ebee1376b914e841678682581208bc9f5b717d29e", 6 | "tx": [ 7 | "657705283f2be7f2983ea63ebee1376b914e841678682581208bc9f5b717d29e" 8 | ], 9 | "time": 1462856598, 10 | "nonce": 653001, 11 | "bits": "1e03ffff", 12 | "previousblockhash": "0000022773abcf0506910b387c2a762dd214c1f24731e969cacfb106cc2841c6", 13 | "block": "04000000c64128cc06b1cfca69e93147f2c114d22d762a7c380b910605cfab73270200009ed217b7f5c98b208125687816844e916b37e1be3ea63e98f2e72b3f28057765966b3157ffff031ec9f609000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0502b70b0101ffffffff0100743ba40b000000232103c03100ab47041b06d4070af2febed0cadc811a88e690c8624149b1726b8c86b7ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/machinecoin_mainnet_500000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "f267ec4251f4f11ec098c948d4281bd08ebe968e738cccab42dacbba14598b1e ", 3 | "size": 190, 4 | "height": 500000, 5 | "merkleroot": "683c2d6e6529b56319a1fb2b59b2317df43aece7d3510b1ad1789fd1ad4f7b48", 6 | "tx": [ 7 | "683c2d6e6529b56319a1fb2b59b2317df43aece7d3510b1ad1789fd1ad4f7b48" 8 | ], 9 | "time": 1524437549, 10 | "nonce": 3571221702, 11 | "bits": "1c0100a1", 12 | "previousblockhash": "b258692389e49fb3bfdbd52478928ddcbd538382a219b3c0997705cead54214d", 13 | "block": "000000204d2154adce057799c0b319a2828353bddc8d927824d5dbbfb39fe489236958b2487b4fadd19f78d11a0b51d3e7ec3af47d31b2592bfba11963b529656e2d3c682d12dd5aa100011cc684dcd40102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff180320a107042d12dd5a088100066b000000007969696d7000000000000100f90295000000001976a9142ec52d32af98d2122510718927975d72bad91ed688ac00000000" 14 | } -------------------------------------------------------------------------------- /tests/blocks/unitus_mainnet_88888.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "d10fb9c30342acd0af365faee684f39c7ea08387732ad4f5569a56cd5ec06b1d", 3 | "size": 475, 4 | "height": 88888, 5 | "merkleroot": "bd91e953702e9ee14b231a4d5ba3b8ce4c492a27815c8ea372f3e477623bca43", 6 | "tx": [ 7 | "bd91e953702e9ee14b231a4d5ba3b8ce4c492a27815c8ea372f3e477623bca43" 8 | ], 9 | "time": 1426508828, 10 | "nonce": 0, 11 | "bits": "1b352f80", 12 | "previousblockhash": "109a8dcbf8688bf36dba6f78019ddc1969298116020e87f816a823107b91095d", 13 | "block": "02099b005d09917b1023a816f8870e021681296919dc9d01786fba6df38b68f8cb8d9a1043ca3b6277e4f372a38e5c81272a494cceb8a35b4d1a234be19e2e7053e991bd1ccc0655802f351b000000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0d03385b010101062f503253482fffffffff01a0aaff250200000023210267c1c03b12eee9de742d97828388e867a9b9eea60ca53c05f573ded072846206ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/uniformfiscalobject_mainnet_1300154.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "7a7718d3216cca1668580889a4b5d062b92cf600e03efd3da7d9475d3a423aa6", 3 | "size": 190, 4 | "height": 1300154, 5 | "merkleroot": "a6c1a3a5a88da852654129da3bc197a194caa27ac2ffa462eff6c704706bf74c", 6 | "tx": [ 7 | "a6c1a3a5a88da852654129da3bc197a194caa27ac2ffa462eff6c704706bf74c" 8 | ], 9 | "time": 1525248967, 10 | "nonce": 4213322752, 11 | "bits": "1c44f70d", 12 | "previousblockhash": "01ec767c07f9252646976fa269e884dc43947e5443e29f953b721cca49d313c9", 13 | "block": "02000020c913d349ca1c723b959fe243547e9443dc84e869a26f97462625f9077c76ec014cf76b7004c7f6ef62a4ffc27aa2ca94a197c13bda29416552a88da8a5a3c1a6c773e95a0df7441c003422fb0102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1803bad61304c773e95a08810001f87f0100007969696d7000000000000100514a8d0e0000001976a914e955fc10495d539323ddd522424fa8df0912390088ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/feathercoin_mainnet_2001000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "98b3e5827a174ee71c5922cfa4c7e290af86f5efa800cba972b5f147ab9dd2bc", 3 | "size": 197, 4 | "height": 2001000, 5 | "merkleroot": "34f83ad3d320ffca8cac9bd41fdff03c9339c6277081071f35b5902dc7efcc84", 6 | "tx": [ 7 | "34f83ad3d320ffca8cac9bd41fdff03c9339c6277081071f35b5902dc7efcc84" 8 | ], 9 | "time": 1513018962, 10 | "nonce": 2937419649, 11 | "bits": "1c05b5e8", 12 | "previousblockhash": "4cc309aa872da071f9c96b95382c2cc8d72e72b95407de6d7d23298b1da3bcca", 13 | "block": "02000000cabca31d8b29237d6dde0754b9722ed7c82c2c38956bc9f971a02d87aa09c34c84ccefc72d90b5351f07817027c639933cf0df1fd49bac8ccaff20d3d33af83452d62e5ae8b5051c817715af0102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1f0368881e062f503253482f0452d62e5a0881025d640c0000007969696d7000000000000100286bee000000001976a9141881bf27015e39946380a9d609a769e91548c8a488ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/xuez_mainnet_1.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000010180d0d872e32af5bbefe8c3567c6ad89c90244ccfc5155555ad8dd22c", 3 | "size": 212, 4 | "height": 1, 5 | "merkleroot": "7c48ceee00495329ab8ee4028a577dfb5f0da80ee6197b4e4f787306e0650351", 6 | "tx": [ 7 | "7c48ceee00495329ab8ee4028a577dfb5f0da80ee6197b4e4f787306e0650351" 8 | ], 9 | "time": 1523055115, 10 | "nonce": 98, 11 | "bits": "1e0fffff", 12 | "previousblockhash": "000000e1febc39965b055e8e0117179a4d18e24e7aaa0c69864c4054b4f29445", 13 | "block": "040000004594f2b454404c86690caa7a4ee2184d9a1717018e5e055b9639bcfee1000000510365e00673784f4e7b19e60ea80d5ffb7d578a02e48eab29534900eece487c0bfac75affff0f1e6200000000000000000000000000000000000000000000000000000000000000000000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff045102d500ffffffff01402fd7863f1600002321024fcb2f96969e70381f4dc01e38a8df3a04297478a36b50d55cce8ba20242bacfac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/denarius_mainnet_10000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "00000000058989f94843c6047bdf72b3f37f62055354c5ff859e28bb0b5282b9", 3 | "size": 204, 4 | "height": 10000, 5 | "merkleroot": "65841bbf5c89ed2def56d4ef505ee1f680fd66028613e372ae7355f09b646a58", 6 | "tx": [ 7 | "65841bbf5c89ed2def56d4ef505ee1f680fd66028613e372ae7355f09b646a58" 8 | ], 9 | "time" : 1497949464, 10 | "nonce" : 1484027400, 11 | "bits" : "1c073cc2", 12 | "previousblockhash": "0000000003db0426bcd14ad568df783dceaa1ad5def62d347fe6ef8d77c40a44", 13 | "block": "06000000440ac4778defe67f342df6ded51aaace3d78df68d54ad1bc2604db0300000000586a649bf05573ae72e313860266fd80f6e15e50efd456ef2ded895cbf1b846518e54859c23c071c08767458010200000018e54859010000000000000000000000000000000000000000000000000000000000000000ffffffff170210270418e54859088100000a000000007969696d7000000000000100a3e11100000000232102ae784442221c0d8cc1db36d90ed2051bb08cb984575e8de3e57ddc209ef8b0a5ac0000000000" 14 | } -------------------------------------------------------------------------------- /tests/blocks/gamecredits_mainnet_500000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "b3741ab09950a6727f50ea0bbcd5eb3ed945c971de8e974d851bb099b9d62e8c", 3 | "size": 205, 4 | "height": 500000, 5 | "merkleroot": "1c4ce21535ac5f7eb7759c29d5b2f727fbb1ccbab2489d6f4e359d76d880e573", 6 | "tx": [ 7 | "1c4ce21535ac5f7eb7759c29d5b2f727fbb1ccbab2489d6f4e359d76d880e573" 8 | ], 9 | "time": 1410010012, 10 | "nonce": 2386493697, 11 | "bits": "1d63e030", 12 | "previousblockhash": "e993981120c5eb8b70fcd4026ff5f0b7a15bf11e13626d0363747815fa7e5101", 13 | "block": "0200000001517efa15787463036d62131ef15ba1b7f0f56f02d4fc708bebc520119893e973e580d8769d354e6f9d48b2baccb1fb27f7b2d5299c75b77e5fac3515e24c1c9c0b0b5430e0631d01013f8e0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff270320a107062f503253482f046c0b0b5408f80003b0000000020d2f7374726174756d506f6f6c2f000000000100f2052a010000001976a91458b26002e61f18ce494dba97715820490fc81bce88ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/gravitycoin_mainnet_100000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "2b1844e65e398d76f686caf43da644cb060f35db7b4142f25ad28cb400a0b99c", 3 | "size": 205, 4 | "height": 100000, 5 | "merkleroot": "f204afdd7fac0522b02565a7adeff019c8f7feeb977e95a0b10da276cd3ce57a", 6 | "tx": [ 7 | "f204afdd7fac0522b02565a7adeff019c8f7feeb977e95a0b10da276cd3ce57a" 8 | ], 9 | "time": 1501400120, 10 | "nonce": 3071148160, 11 | "bits": "1e01a4c6", 12 | "previousblockhash": "3c15e085c951d49230f06ba01f29db01d6fa8b65fce5b412cff39b06852288ba", 13 | "block": "02000000ba882285069bf3cf12b4e5fc658bfad601db291fa06bf03092d451c985e0153c7ae53ccd76a20db1a0957e97ebfef7c819f0efada76525b02205ac7fddaf04f2388c7d59c6a4011e80000eb70101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2703a08601062f503253482f04388c7d59080ffffff9000000000d2f6e6f64655374726174756d2f000000000100e1f505000000001976a91447e1988902e3f0bff643c4a2a17262dbf06c81cd88ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | set SPHINXPROJ=ElectrumX 13 | 14 | if "%1" == "" goto help 15 | 16 | %SPHINXBUILD% >NUL 2>NUL 17 | if errorlevel 9009 ( 18 | echo. 19 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 20 | echo.installed, then set the SPHINXBUILD environment variable to point 21 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 22 | echo.may add the Sphinx directory to PATH. 23 | echo. 24 | echo.If you don't have Sphinx installed, grab it from 25 | echo.http://sphinx-doc.org/ 26 | exit /b 1 27 | ) 28 | 29 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 30 | goto end 31 | 32 | :help 33 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 34 | 35 | :end 36 | popd 37 | -------------------------------------------------------------------------------- /tests/blocks/axe_mainnet_30237.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000000000013ae459f3755ac98e6dd01ad8364849cd1bcb1ca4a40f81a7ead75", 3 | "size": 223, 4 | "height": 30237, 5 | "merkleroot": "de4266afc54356d351c11050a01165adc0e6b339268efdf1c578374b4212a266", 6 | "tx": [ 7 | "de4266afc54356d351c11050a01165adc0e6b339268efdf1c578374b4212a266" 8 | ], 9 | "time": 1521830841, 10 | "nonce": 1653639604, 11 | "bits": "1b29c9b1", 12 | "previousblockhash": "000000000014fce86cc81f0ad3135fb139764183a645d08b582a251b023f62e9", 13 | "block": "00000020e9623f021b252a588bd045a683417639b15f13d30a1fc86ce8fc14000000000066a212424b3778c5f1fd8e2639b3e6c0ad6511a05010c151d35643c5af6642deb94bb55ab1c9291bb48990620101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff17021d7604b94bb55a0881000001140000007969696d7000000000000200c2eb0b000000001976a914b4237f3423d7fadad0a5a4a8fd6f6bae250d59dd88ac0008af2f000000001976a914f8bc2102e0917b9537babbbaa6e15fe57307062488ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/lib/test_script.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from electrumx.lib.script import OpCodes, is_unspendable_legacy, is_unspendable_genesis 4 | 5 | 6 | @pytest.mark.parametrize("script, iug", ( 7 | (bytes([OpCodes.OP_RETURN]), False), 8 | (bytes([OpCodes.OP_RETURN]) + bytes([2, 28, 50]), False), 9 | (bytes([OpCodes.OP_0, OpCodes.OP_RETURN]), True), 10 | (bytes([OpCodes.OP_0, OpCodes.OP_RETURN]) + bytes([2, 28, 50]), True) 11 | )) 12 | def test_op_return_legacy(script, iug): 13 | assert is_unspendable_legacy(script) 14 | assert is_unspendable_genesis(script) is iug 15 | 16 | 17 | @pytest.mark.parametrize("script", ( 18 | bytes([]), 19 | bytes([OpCodes.OP_1, OpCodes.OP_RETURN]) + bytes([2, 28, 50]), 20 | bytes([OpCodes.OP_0]), 21 | bytes([OpCodes.OP_0, OpCodes.OP_1]), 22 | bytes([OpCodes.OP_HASH160]), 23 | )) 24 | def test_not_op_return(script): 25 | assert not is_unspendable_legacy(script) 26 | assert not is_unspendable_genesis(script) 27 | -------------------------------------------------------------------------------- /tests/blocks/noir_mainnet_370000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "572d8a5897cad3f3a75811258513d321e8971c27ed210bb24eba4cd59697dc6d", 3 | "size": 230, 4 | "height": 370000, 5 | "merkleroot": "21000ff185207fc1b208ab1c03de33acb678d6ef542731426da5bfb08627d0b0", 6 | "tx": [ 7 | "21000ff185207fc1b208ab1c03de33acb678d6ef542731426da5bfb08627d0b0" 8 | ], 9 | "time": 1542089008, 10 | "nonce": 1713111040, 11 | "bits": "1d05e718", 12 | "previousblockhash": "cb9b3ff2a750f644e9389f50c508e9a4e217df2f07c5bc6a89a2e7fc82e2cdfe", 13 | "block": "00000020fecde282fce7a2896abcc5072fdf17e2a4e908c5509f38e944f650a7f23f9bcbb0d02786b0bfa56d42312754efd678b6ac33de031cab08b2c17f2085f10f00213069ea5b18e7051d00001c660101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1e0350a505043069ea5b083fff6fd4000000000b2f47666c6172652e696f2f000000000260b8131a000000001976a914122466aaa347290e3b3b7858f2ba041af97d1b4388ac20c46d30000000001976a914a26f5f0cf1b72ae0a5ab533f1e5f420876b3bf6988ac00000000" 14 | } -------------------------------------------------------------------------------- /tests/blocks/pivx_mainnet_10000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "00000000003ce77135d15257a57f7508b8c5021372de2eae554f3142b60944cc", 3 | "size": 231, 4 | "height": 10000, 5 | "merkleroot": "bd27e18a8abbd501b775d32fc6402a1a474a0517c1c8b04b9d487b0203f6b0f0", 6 | "tx": [ 7 | "bd27e18a8abbd501b775d32fc6402a1a474a0517c1c8b04b9d487b0203f6b0f0" 8 | ], 9 | "time": 1454814715, 10 | "nonce": 14876727, 11 | "bits": "1c06b486", 12 | "previousblockhash": "00000000023fecac81bc148c7ab26a0190dbabeac2e8e260f62dff5205596f02", 13 | "block": "03000000026f590552ff2df660e2e8c2eaabdb90016ab27a8c14bc81acec3f0200000000f0b0f603027b489d4bb0c8c117054a471a2a40c62fd375b701d5bb8a8ae127bdfbb5b65686b4061c3700e3000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1f02102704fbb5b65608380001169c6108000d2f6e6f64655374726174756d2f000000000200c817a8040000001976a91493d5f8ec14e203ef275ebfe942bc6a1e2784f95088ac00f2052a010000001976a914d6716d39693e034596a1e8546b4d65e4a06159cc88ac00000000" 14 | } -------------------------------------------------------------------------------- /tests/blocks/polis_mainnet_100000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000000000000818820ee2aecc291c7b6076984cf7c0c152869de128cf30262f", 3 | "size": 232, 4 | "height": 100000, 5 | "merkleroot": "6dbd34dd6a62b589e6f17a18ae65461c45e8c7a278b893e0c5cffd64d5cf47f1", 6 | "tx": [ 7 | "6dbd34dd6a62b589e6f17a18ae65461c45e8c7a278b893e0c5cffd64d5cf47f1" 8 | ], 9 | "time": 1526522937, 10 | "nonce": 2510244892, 11 | "bits": "1a0c92e1", 12 | "previousblockhash": "0000000000000eae3336c7a181ef9eaa70ddb0a59975207e64081e2eff39f1cf", 13 | "block": "04000020cff139ff2e1e08647e207599a5b0dd70aa9eef81a1c73633ae0e000000000000f147cfd564fdcfc5e093b878a2c7e8451c4665ae187af1e689b5626add34bd6d39e4fc5ae1920c1a1c4c9f950101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2003a086010439e4fc5a085ffda1ce4d0700000d2f6e6f64655374726174756d2f0000000002002a7515000000001976a9146629c9b161656be9637e0dd83153d7600084047b88ac00a8d455000000001976a914f1564b5fe337aaf93e963c9c236473a25a61f41788ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /contrib/raspberrypi3/install_electrumx.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | ################### 3 | # install electrumx 4 | ################### 5 | 6 | # Remove "raspi-copies-and-fills" as it breaks the upgrade process 7 | sudo apt-get purge raspi-copies-and-fills 8 | 9 | # upgrade raspbian to 'stretch' distribution 10 | sudo echo 'deb http://mirrordirector.raspbian.org/raspbian/ testing main contrib non-free rpi' > /etc/apt/sources.list.d/stretch.list 11 | sudo apt-get update 12 | sudo apt-get dist-upgrade 13 | sudo apt-get autoremove 14 | 15 | # install electrumx dependencies 16 | sudo apt-get install python3-pip 17 | sudo apt-get install build-essential libc6-dev 18 | sudo apt-get install libncurses5-dev libncursesw5-dev 19 | sudo apt install libreadline6-dev/stable libreadline6/stable 20 | sudo apt-get install libleveldb-dev 21 | sudo apt-get install git 22 | sudo pip3 install plyvel 23 | 24 | # install electrumx 25 | git clone https://github.com/spesmilo/electrumx.git 26 | cd electrumx 27 | sudo python3 setup.py install 28 | -------------------------------------------------------------------------------- /tests/blocks/dash_mainnet_844898.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000000000000001a5952db6d8dc23a66c5b1ec5f6f0aa7fd6502d166aaa51043", 3 | "size": 240, 4 | "height": 844898, 5 | "merkleroot": "5d402f5522b68787ee725cd1ebf2d541a7c6714219c43f25c829928a4fc5f67c", 6 | "tx": [ 7 | "5d402f5522b68787ee725cd1ebf2d541a7c6714219c43f25c829928a4fc5f67c" 8 | ], 9 | "time": 1522372979, 10 | "nonce": 3726976657, 11 | "bits": "193f7323", 12 | "previousblockhash": "0000000000000028b3f68bcdfca0ce5fbc475c209438e6451e3424258f3ddcc4", 13 | "block": "00000020c4dc3d8f2524341e45e63894205c47bc5fcea0fccd8bf6b328000000000000007cf6c54f8a9229c8253fc4194271c6a741d5f2ebd15c72ee8787b622552f405d7391bd5a23733f19912625de0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff280362e40c174d696e656420627920416e74506f6f6c342e205abd9173e15500000000000001000000ffffffff022a7df809000000001976a914db75d18a2635ce7e4aa3bf533ba3e259f8a065d488ac237df809000000001976a9140b927640ec1f18218d956f16f776f2cd9534fe9e88ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/koto_mainnet_60000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "09553d8cb7eabfa0a18b255d3342f171677602ace60b9be194dc562fbfa1ec32", 3 | "size": 232, 4 | "height": 60000, 5 | "merkleroot": "7305c96169dc67141657d167541c50c253259d6b1150b468cbbd1a9f636e09db", 6 | "tx": [ 7 | "7305c96169dc67141657d167541c50c253259d6b1150b468cbbd1a9f636e09db" 8 | ], 9 | "time": 1516755328, 10 | "nonce": 2806579424, 11 | "bits": "1d0fe10c", 12 | "previousblockhash": "66e4d540023f71e52e7e2fb68e1a2757ca6eeccb9d1b69ed5e8689d425a2b2eb", 13 | "block": "04000000ebb2a225d489865eed691b9dcbec6eca57271a8eb62f7e2ee5713f0240d5e466db096e639f1abdcb68b450116b9d2553c2501c5467d157161467dc6961c9057380d9675a0ce10f1de00049a70101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff200360ea000480d9675a087ffffe52000000000d2f6e6f64655374726174756d2fffffffff020003164e020000001976a914a4e47780f16cb0f4617946417edaa60a0077857388ac00e1f505000000001976a91452d162b995a7da28fc9c3512857f80d82e9a3b3488ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/xuez_mainnet_15000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000000038b6eda3d00e28c4ccbcebb0ca9cdf1bf2c7cbd9366735590d5c8c9bb", 3 | "size": 247, 4 | "height": 15000, 5 | "merkleroot": "bca5b726d932fd7e9c31dcbe12bc17c6da81c1cb625024ae7cf0bca47668d49b", 6 | "tx": [ 7 | "bca5b726d932fd7e9c31dcbe12bc17c6da81c1cb625024ae7cf0bca47668d49b" 8 | ], 9 | "time": 1524030719, 10 | "nonce": 136866, 11 | "bits": "1d049c81", 12 | "previousblockhash": "00000001c2117eb8d8a0ab30145ee7a360440eddfc4a621caca03a40a89d7040", 13 | "block": "0400000040709da8403aa0ac1c624afcdd0e4460a3e75e1430aba0d8b87e11c2010000009bd46876a4bcf07cae245062cbc181dac617bc12bedc319c7efd32d926b7a5bcffdcd65a819c041da216020000000000000000000000000000000000000000000000000000000000000000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0502983a0139ffffffff0200e1f5050000000023210202e8f286f69013d9fb4f824e39e6b62bc129228e64522cbeb240e9bc007129e8ac80d1f008000000001976a914d83e3413ae0d667813f2c78ec67990460573675a88ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/newyorkcoin_mainnet_3956926.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "f08d59f8114a4e9143bcce1615f75720ccd65fd86d8c4f0e454ad41157e81a59", 3 | "size": 248, 4 | "height": 3956926, 5 | "merkleroot": "0300b2fe16c049641ec63f9eb435b9d773c847bc0185c927d5b8d87cd1ad3095", 6 | "tx": [ 7 | "0300b2fe16c049641ec63f9eb435b9d773c847bc0185c927d5b8d87cd1ad3095" 8 | ], 9 | "time": 1515308763, 10 | "nonce": 1570457681, 11 | "bits": "1b172a4e", 12 | "previousblockhash": "10c91aefd6698f03a2820b8aa462738a5c1c21f4f975786a8eb1ba25e4b33af3", 13 | "block": "01000000f33ab3e425bab18e6a7875f9f4211c5c8a7362a48a0b82a2038f69d6ef1ac9109530add17cd8b8d527c98501bc47c873d7b935b49e3fc61e6449c016feb20003dbc6515a4e2a171b51489b5d0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5203be603c062f503253482f04dfc6515afabe6d6dce67985c41a5f1ba5d526614e1744010b5e6a34d33c50ece5d420d75da15454e100000000000000008b8000274020000000c2f30324d515156434c59582f00000000010010a5d4e80000001976a914f0a150ec5709fae1d1814227b69cd1f0baf528c588ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/pac_testnet_16275.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000003527433edc9fdf28d848c5fa3279ff8a016afc67d47a080534461871aa2", 3 | "size": 215, 4 | "height": 16275, 5 | "merkleroot": "699bda4bad8fc13eff818ffa1a2aa1d19a992d8436ec67e86dd8ce038130e6e5", 6 | "tx": [ 7 | "699bda4bad8fc13eff818ffa1a2aa1d19a992d8436ec67e86dd8ce038130e6e5" 8 | ], 9 | "time": 1525276230, 10 | "nonce": 2816146, 11 | "bits": "1e042d0c", 12 | "previousblockhash": "000002bc2882394ca3852cda708311e500c8a9df717255a1336cc350b07550f0", 13 | "nextblockhash": "000003eec7b324a19edbfc0aa539549dc02bd24e3de9d31e8c85fd3da68f1962", 14 | "block": "00000020f05075b050c36c33a1557271dfa9c800e5118370da2c85a34c398228bc020000e5e6308103ced86de867ec36842d999ad1a12a1afa8f81ff3ec18fad4bda9b6946dee95a0c2d041e92f82a000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0502933f0101ffffffff020072b8101000000023210336524995b3bb2c2f300b3dd45e920f27f1cfc3c4f2e5a84e65af0fddc3bab00eac00aecefaf00000001976a914c2f707ddbb9c3ca5b2c3458cabc0d24baab66b8b88ac00000000" 15 | } -------------------------------------------------------------------------------- /tests/blocks/monacoin_testnet_56969.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "097b834b366e89219ed321486a7273c68f5aad582f0fb8f9848c170bf69dd275", 3 | "size": 265, 4 | "height": 56969, 5 | "merkleroot": "2d354ce7a28edc536532a4ac69d15d125158785ae9657e01e2f0d43a9af6ddd7", 6 | "tx": [ 7 | "2d354ce7a28edc536532a4ac69d15d125158785ae9657e01e2f0d43a9af6ddd7" 8 | ], 9 | "time": 1506864020, 10 | "nonce": 47425, 11 | "bits": "1e04a7b3", 12 | "previousblockhash": "66819140a23d7b43438f4a7c773b5d127cdf5a7111c1e7e1ca39190fcb7832b6", 13 | "block": "00000020b63278cb0f1939cae1e7c111715adf7c125d3b777c4a8f43437b3da240918166d7ddf69a3ad4f0e2017e65e95a785851125dd169aca4326553dc8ea2e74c352d94ebd059b3a7041e41b9000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff060389de000103ffffffff0200f2052a01000000232102d8bc481d5ecf460111dbe6d3aed5ed1969d0eac778529482d9d7f7b1beb4fcffac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000" 14 | } 15 | -------------------------------------------------------------------------------- /contrib/raspberrypi3/run_electrumx.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | ############### 3 | # run_electrumx 4 | ############### 5 | 6 | # configure electrumx 7 | export COIN=Bitcoin 8 | export DAEMON_URL=http://rpcuser:rpcpassword@127.0.0.1 9 | export NET=mainnet 10 | export CACHE_MB=400 11 | export DB_DIRECTORY=/home/username/.electrumx/db 12 | export SSL_CERTFILE=/home/username/.electrumx/certfile.crt 13 | export SSL_KEYFILE=/home/username/.electrumx/keyfile.key 14 | export BANNER_FILE=/home/username/.electrumx/banner 15 | export DONATION_ADDRESS=your-donation-address 16 | 17 | # connectivity 18 | export HOST= 19 | export TCP_PORT=50001 20 | export SSL_PORT=50002 21 | 22 | # visibility 23 | export REPORT_HOST=hostname.com 24 | export RPC_PORT=8000 25 | 26 | # run electrumx 27 | ulimit -n 10000 28 | /usr/local/bin/electrumx_server 2>> /home/username/.electrumx/electrumx.log >> /home/username/.electrumx/electrumx.log & 29 | 30 | ###################### 31 | # auto-start electrumx 32 | ###################### 33 | 34 | # add this line to crontab -e 35 | # @reboot /path/to/run_electrumx.sh 36 | -------------------------------------------------------------------------------- /tests/blocks/quebecoin_mainnet_472979.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "d591d7931d813ede4dad236ac02328e18089ee41328c29c97fe0a5c15425efc7", 3 | "size": 266, 4 | "height": 472979, 5 | "merkleroot": "fe9ab946b7699f42d6ae7b649a132db0d35116fa43e3368a856f3be6a4236a3f", 6 | "tx": [ 7 | "fe9ab946b7699f42d6ae7b649a132db0d35116fa43e3368a856f3be6a4236a3f" 8 | ], 9 | "time": 1586045460, 10 | "nonce": 262815792, 11 | "bits": "1d0453b9", 12 | "previousblockhash": "d92a49acbfa7f9cd0e0c660842dec1811efa62299aff45500c3dc23aa1f6aa23", 13 | "block":"00026c2023aaf6a13ac23d0c5045ff9a2962fa1e81c1de4208660c0ecdf9a7bfac492ad93f6a23a4e63b6f858a36e343fa1651d3b02d139a647baed6429f69b746b99afe1422895eb953041d3040aa0f0102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4403933707041422895e0881001bfe010000007969696d7000fabe6d6d44693c77bafea92e0697f30f291a1ca8f124a9881a9bb322856a75dde39a48280200000000000000000000000220bcbe000000000017a91425be1773fab39d39cd4b0c7ecfe59e7f0ea30f1b8720bcbe00000000001976a914d85c9e8bdcce3d3c03b0967efe92f33b1fc9c18888ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/bitsend_mainnet_571000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000000001b4c0cb741826a3236dfec65bafa6c901017ec2fe2b2662c6ec61cd", 3 | "size": 271, 4 | "height": 571000, 5 | "merkleroot": "06fd61c7db6ba8d545b2c526c97f12d38474c9d5af8db804628c6c85c187a7b1", 6 | "tx": [ 7 | "06fd61c7db6ba8d545b2c526c97f12d38474c9d5af8db804628c6c85c187a7b1" 8 | ], 9 | "time": 1545267703, 10 | "nonce": 679226306, 11 | "bits": "1c028ff3", 12 | "previousblockhash": "0000000002342e7f451c92b854ca068e1ea74d63405c01474ba05f80f0339078", 13 | "block": "00000020789033f0805fa04b47015c40634da71e8e06ca54b8921c457f2e340200000000b1a787c1856c8c6204b88dafd5c97484d3127fc926c5b245d5a86bdbc761fd06f7e91a5cf38f021cc22b7c280101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff470378b60804f7e91a5c088101a570000000007a706f6f6c2e636100fabe6d6dfc11ced4e4a37b1706f30fea53f48c8baca01352a779873de984f74878b0b56a0100000000000000000000000200943577000000001976a9144364f5d8286d24d39df19bc6a5249a556b44730f88ac0065cd1d000000001976a9143a08893f724a005fe395db90e9572189e7ce4a2588ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/bellcoin_mainnet_412394.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000004585973c0ce2c9f4c8be13983f901e712e808b1603ddc84c5fc1d630fe4", 3 | "size": 281, 4 | "height": 412394, 5 | "merkleroot": "22d70bbc624844f38343efc35e551d5ce5110d7fddd450bf4a535c830a8a7b3b", 6 | "tx": [ 7 | "22d70bbc624844f38343efc35e551d5ce5110d7fddd450bf4a535c830a8a7b3b" 8 | ], 9 | "time": 1561546385, 10 | "nonce": 1896874112, 11 | "bits": "1e0745c4", 12 | "previousblockhash": "000001301d2ac66c89ebf7bed1bfaf9398efaea6c3fc2aa5da80efadab7eac40", 13 | "block": "0000002040ac7eabadef80daa52afcc3a6aeef9893afbfd1bef7eb896cc62a1d300100003b7b8a0a835c534abf50d4dd7f0d11e55c1d555ec3ef4383f3444862bc0bd722914e135dc445071e8000107101010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff2003ea4a0604924e135d085ffffdb3000000000d2f6e6f64655374726174756d2f00000000020000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900ca9a3b000000001976a9144570c3c687ebf8ef5af7f6efae9b810055305c3088ac0120000000000000000000000000000000000000000000000000000000000000000000000000" 14 | } 15 | -------------------------------------------------------------------------------- /docs/ACKNOWLEDGEMENTS: -------------------------------------------------------------------------------- 1 | Thanks to Thomas Voegtlin for creating the Electrum software and 2 | infrastructure and for maintaining it so diligently. Electrum is 3 | probably the best desktop Bitcoin wallet solution for most users. My 4 | faith in it is such that I use Electrum software to store most of my 5 | Bitcoins. 6 | 7 | Whilst the vast majority of the code here is my own original work and 8 | includes some new ideas, it is very clear that the general structure 9 | and concept are those of Electrum. Some parts of the code and ideas 10 | of Electrum, some of which it itself took from other projects such as 11 | Abe and pywallet, remain. Thanks to the authors of all the software 12 | this is derived from. 13 | 14 | I'd like to thank bauerj, hsmiths and JWU42 of #electrum for their 15 | help and support in testing the versions of ElectrumX prior to 1.0. 16 | 17 | Thanks to Daniel Bernstein for daemontools and other software, and to 18 | Matthew Dillon for DragonFlyBSD. They are both deeply inspirational 19 | people. 20 | 21 | And of course, thanks to Satoshi for the wonderful creation that is 22 | Bitcoin. -------------------------------------------------------------------------------- /tests/blocks/bitcoinzero_mainnet_50000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "8baa0a0c95d5c3d968d3223c507951337d4431bf61786cb051512842e9a5f18a", 3 | "size": 295, 4 | "height": 50000, 5 | "merkleroot": "75a2bf3a5f1464116b3edca2bc53c3074245eb872048b2baa2684c5ac15ad903", 6 | "tx": [ 7 | "75a2bf3a5f1464116b3edca2bc53c3074245eb872048b2baa2684c5ac15ad903" 8 | ], 9 | "time": 1551713199, 10 | "nonce": 3508846327, 11 | "bits": "1c00b776", 12 | "previousblockhash": "5a49a0944a9a799c11b31aacf2e9ff85da6a308f28a4cb6d6e4b2cf9a7bdb332", 13 | "block": "0000002032b3bda7f92c4b6e6dcba4288f306ada85ffe9f2ac1ab3119c799a4a94a0495a03d95ac15a4c68a2bab2482087eb454207c353bca2dc3e6b1164145f3abfa275af437d5c76b7001cf7be24d10102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1b0350c30004af437d5c08810006596f0100004e4c506f6f6c2e4e4c000000000480ba953e000000001976a9140a35b7717be43b406868a94ca9b7317a3cf5910b88ac80ba953e000000001976a914616a70b9473e81d38f624b0cb765d3b1b35f202288ac8017b42c000000001976a914d3e505575aaa0174c1801fcb78f47bb312be24d788ac80d1f008000000001976a9148b6f6866e5081ea5ba5b5793dd2c24f7e254a05a88ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/defcoin_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1e0fffff", 3 | "confirmations": 1233719, 4 | "difficulty": 0.00024414, 5 | "hash": "df3e11a5ab20a9a798f3aa1ac0f2b96ee109963d1734bee10c768ba5ad1361db", 6 | "height": 1000, 7 | "merkleroot": "34af5896772b3c8734eebaaa8f678c5349621663d14fdb0de93d1da2f6ff8ec3", 8 | "nextblockhash": "ed6435f3ab6e481baa3deb9e5dcbf619de332ecb43f1ee4820f71f6f75a0ab65", 9 | "nonce": 7544, 10 | "previousblockhash": "13a7e716b55d74222eda864c50d06171e3d7d5679533b636b602806081cd2ac7", 11 | "size": 188, 12 | "time": 1394269354, 13 | "tx": [ 14 | "34af5896772b3c8734eebaaa8f678c5349621663d14fdb0de93d1da2f6ff8ec3" 15 | ], 16 | "version": 2, 17 | "block": "02000000c72acd81608002b636b6339567d5d7e37161d0504c86da2e22745db516e7a713c38efff6a21d3de90ddb4fd163166249538c678faabaee34873c2b779658af34aadc1a53ffff0f1e781d00000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0c02e8030101062f503253482fffffffff0100f2052a010000002321027ca0ad174e55e01e8623f61318c56744140231af8c3d057864f0c091d3bb15d1ac00000000" 18 | } -------------------------------------------------------------------------------- /tests/blocks/onixcoin_mainnet_300000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "00000000000502760fe120b5be6f315513af417cd7942ce4f760399d7fe37707", 3 | "confirmations": 17763, 4 | "size": 212, 5 | "height": 300000, 6 | "version": 2, 7 | "merkleroot": "83587626c5485313158092719facfa72ae1c2a65d9666ad1ab31b2545d496d10", 8 | "tx": [ 9 | "83587626c5485313158092719facfa72ae1c2a65d9666ad1ab31b2545d496d10" 10 | ], 11 | "time": 1547896171, 12 | "nonce": 1025707132, 13 | "bits": "1b057450", 14 | "difficulty": 12015.1900094, 15 | "previousblockhash": "000000000003f3b11ace3464840836fc361ac91bad3ef9395024cf4c846cad2d", 16 | "nextblockhash": "0000000000045d9259a114088079b005518bb23a72a2f2802348ddb382726459", 17 | "block": "020000002dad6c844ccf245039f93ead1bc91a36fc3608846434ce1ab1f3030000000000106d495d54b231abd16a66d9652a1cae72faac9f71928015135348c5267658836b05435c5074051b7c0c233d0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2e03e09304062f503253482f049805435c08581eb2a333010000142f70726f68617368696e672e636f6d5a0307002f000000000100bca065010000001976a9149f7932e1c8fcef3251869121da7351921e7671dc88ac00000000" 18 | } 19 | -------------------------------------------------------------------------------- /tests/blocks/aryacoin_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1e0fffff", 3 | "confirmations": 273456, 4 | "difficulty": 0.00024414, 5 | "hash": "bbcddffb1c4682adb326f231c88d35d82767c994c2dfa2883aa21eaced2e3178", 6 | "height": 1000, 7 | "merkleroot": "00b8324dad56164fd02fde4a5887488ec674e9c2e834852717ad85cc26e9e31c", 8 | "nextblockhash": "29151d174aec0c9275dc43c16d7d6812e4072d184657849f7fbd9178900e215d", 9 | "nonce": 72613, 10 | "previousblockhash": "f754a281a009e4741ee2215accd1d13f675207bba31d53a4125cd50155f31c6e", 11 | "size": 188, 12 | "time": 1551036197, 13 | "tx": [ 14 | "00b8324dad56164fd02fde4a5887488ec674e9c2e834852717ad85cc26e9e31c" 15 | ], 16 | "version": 2, 17 | "block": "020000006e1cf35501d55c12a4531da3bb0752673fd1d1cc5a21e21e74e409a081a254f71ce3e926cc85ad17278534e8c2e974c68e4887584ade2fd04f1656ad4d32b80025ef725cffff0f1ea51b01000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0c02e8030101062f503253482fffffffff0180d1f0080000000023210396b64d45b24986f2092f54f5c19a5dbe2800f3363efe44c13c018a8e74e614dcac00000000" 18 | } 19 | -------------------------------------------------------------------------------- /tests/blocks/monacoin_mainnet_1145140.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "567e2c241496c5d88f1dc373c7ec32e70e41676d97aea7801a106b856598a0b5", 3 | "size": 315, 4 | "height": 1145140, 5 | "merkleroot": "64c5bd3c10181ac439959ba29e37d0acfbb6bd91c93fbe0e6d2c7a31dd8da6cc", 6 | "tx": [ 7 | "64c5bd3c10181ac439959ba29e37d0acfbb6bd91c93fbe0e6d2c7a31dd8da6cc" 8 | ], 9 | "time": 1509103230, 10 | "nonce": 3389602057, 11 | "bits": "1b028153", 12 | "previousblockhash": "0ed372d6d303893cc2bd74d5e86a6f5903cb201f24510dbfb6a2f7f2ab29c7e0", 13 | "block": "00000020e0c729abf2f7a2b6bf0d51241f20cb03596f6ae8d574bdc23c8903d3d672d30ecca68ddd317a2c6d0ebe3fc991bdb6fbacd0379ea29b9539c41a18103cbdc5647e16f3595381021b093909ca01010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff2003347911047e16f3590840179325000000000d2f6e6f64655374726174756d2f00000000030000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900f90295000000001976a9143a4616efd134b1576d0f97906cff2b65ad600ea688ac00000000000000001976a91422851477d63a085dbc2398c8430af1c09e7343f688ac0120000000000000000000000000000000000000000000000000000000000000000000000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/myriadcoin_mainnet_2587044.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "09a2344ca39c422a473ab2ac0a93c0de5eef7bbc63c59ea36bf8a126ae2fbc26", 3 | "size": 326, 4 | "height": 2587044, 5 | "merkleroot": "0373487200798a478a9b5330fddcc092cb08f9b517c62eacbfbe733b8e8d3680", 6 | "tx": [ 7 | "0373487200798a478a9b5330fddcc092cb08f9b517c62eacbfbe733b8e8d3680" 8 | ], 9 | "time": 1540383063, 10 | "nonce": 1758391936, 11 | "bits": "1b013fb1", 12 | "previousblockhash": "6bebe78892419acf8f47fa34ac08417036c244a244d209dbb5113edfda7ae480", 13 | "block": "00065a2080e47adadf3e11b5db09d244a244c236704108ac34fa478fcf9a419288e7eb6b80368d8e3b73bebfac2ec617b5f908cb92c0dcfd30539b8a478a7900724873035761d05bb13f011b80eece6801010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff4d03a47927045761d05b08fabe6d6db5b8ddd39dc3e80a8930480db7f9dd41acc305fe5f41f5c953ae73e980a534b9020000000000000000005275250000000e2f6d696e696e672d64757463682f00000000020000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900ba1dd2050000001976a9140c6de8cbb3e5fc90476c696881dc28bb9b4989e088ac0120000000000000000000000000000000000000000000000000000000000000000000000000" 14 | } 15 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016-2017, Neil Booth 2 | 3 | All rights reserved. 4 | 5 | The MIT License (MIT) 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining 8 | a copy of this software and associated documentation files (the 9 | "Software"), to deal in the Software without restriction, including 10 | without limitation the rights to use, copy, modify, merge, publish, 11 | distribute, sublicense, and/or sell copies of the Software, and to 12 | permit persons to whom the Software is furnished to do so, subject to 13 | the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be 16 | included in all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 | -------------------------------------------------------------------------------- /tests/blocks/simplicity_mainnet_400000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "02709ff59f09b08684bdab6000b7ad134f1d54ac4079202c94173378fabc44e7", 3 | "size": 204, 4 | "height": 400000, 5 | "version": 7, 6 | "merkleroot": "500065fdf911655da912e4da08bcd364d30e28f28806a05fb6719f0189611e85", 7 | "tx": [ 8 | "500065fdf911655da912e4da08bcd364d30e28f28806a05fb6719f0189611e85" 9 | ], 10 | "time": 1535894357, 11 | "nonce": 165549067, 12 | "bits": "1c11baaf", 13 | "difficulty": 14.43920878076741, 14 | "chainwork": "00000000000000000000000000000000000000000000092b98eeae51bff1a231", 15 | "previousblockhash": "d36ab89ca028f18f7847ebdb6e5fbe9adbcccb2cadbd4cdb0eb3586f1ea1ca2f", 16 | "nextblockhash": "b3a08ffcb11a7b5a7c1226c1a4a291a1fe49e39e75a0646aeb6d67146e059e4a", 17 | "block": "070000002fcaa11e6f58b30edb4cbdad2ccbccdb9abe5f6edbeb47788ff128a09cb86ad3851e6189019f71b65fa00688f2280ed364d3bc08dae412a95d6511f9fd65005055e38b5bafba111c0b14de09010200000055e38b5b010000000000000000000000000000000000000000000000000000000000000000ffffffff1803801a060455e38b5b08810000011e0000007969696d7000000000000100e40b54020000002321035bb9cfdf931fb739df296058de9e27596f8051ebc373422eae8c10fdbd68284eac00000000" 18 | } -------------------------------------------------------------------------------- /tests/blocks/europecoin_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1e467793", 3 | "chainwork": "000000000000000000000000000000000000000000000000000000000d6de431", 4 | "confirmations": 362177, 5 | "difficulty": 5.543e-05, 6 | "hash": "000011a9e0c53b824b77230f4e9ac2686aa22a0bf21ca39074294c53e015158b", 7 | "height": 1000, 8 | "merkleroot": "1d090791f3f269df18c17dceb4f851a3e3d8386e58183196a1b171c5ddd74e34", 9 | "nextblockhash": "00003285fb8262de5fdb782cdbf8cbc11dde3161164c9840ed9e5fd45cb9f4d3", 10 | "nonce": 6367, 11 | "previousblockhash": "000022f7c24c4f418b99d671787d8a35ad8c368c825aabafa09c6615fe7f9708", 12 | "size": 179, 13 | "time": 1468355039, 14 | "tx": [ 15 | "1d090791f3f269df18c17dceb4f851a3e3d8386e58183196a1b171c5ddd74e34" 16 | ], 17 | "version": 4, 18 | "block": "0400000008977ffe15669ca0afab5a828c368cad358a7d7871d6998b414f4cc2f7220000344ed7ddc571b1a1963118586e38d8e3a351f8b4ce7dc118df69f2f39107091ddf5185579377461edf180000060e0100535fafef0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0502e8030101ffffffff0100e1f505000000001976a91414d53d05759cd17b711a815fe6a37e65f2910a6288ac00000000" 19 | } 20 | -------------------------------------------------------------------------------- /tests/blocks/axe_testnet_30.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000028293f2766564553f51157be0e4a26beeca3dca90788138ed39e39ec887", 3 | "size": 344, 4 | "height": 30, 5 | "merkleroot": "76fd8de5ba442a656f74198b2318fed22c5710f4ead482b5b3350890c1a036f6", 6 | "tx": [ 7 | "76fd8de5ba442a656f74198b2318fed22c5710f4ead482b5b3350890c1a036f6" 8 | ], 9 | "time": 1580757343, 10 | "nonce": 1105135104, 11 | "bits": "1e0ffff0", 12 | "previousblockhash": "0000066f56529ae503c85ce9692185465af4b400182e35403f7b82b040e948f1", 13 | "block": "00000020f148e940b0827b3f40352e1800b4f45a46852169e95cc803e59a52566f060000f636a0c1900835b3b582d4eaf410572cd2fe18238b19746f652a44bae58dfd765f71385ef0ff0f1e0006df410101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff11011e0e2f5032506f6f6c2d74415845332fffffffff04e783be5c010000001976a914b717ea41435ecd3522222e0b3afbfb8ea37a0abe88acd41f4c2a0a0000001976a914f91c9cd14b776c3a8e0fd0b12deca6d1976ed36588ac45d0301d000000004341047559d13c3f81b1fadbd8dd03e4b5a1c73b05e2b980e00d467aa9440b29c7de23664dde6428d75cafed22ae4f0d302e26c5c5a5dd4d3e1b796d7281bdc9430f35ac00000000000000002a6a28cf5e77ea4cb19c4fbcba0207de9f2107f560cbd9e56e8fb1da7a59f180ac398b000000000000000000000000" 14 | } 15 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | .. image:: https://travis-ci.org/spesmilo/electrumx.svg?branch=master 2 | :target: https://travis-ci.org/spesmilo/electrumx 3 | .. image:: https://coveralls.io/repos/github/spesmilo/electrumx/badge.svg 4 | :target: https://coveralls.io/github/spesmilo/electrumx 5 | 6 | =============================================== 7 | ElectrumX - Reimplementation of electrum-server 8 | =============================================== 9 | 10 | :Licence: MIT 11 | :Language: Python (>= 3.7) 12 | :Original Author: Neil Booth 13 | 14 | This project is a fork of `kyuupichan/electrumx `_. 15 | The original author dropped support for Bitcoin, which we intend to keep. 16 | 17 | ElectrumX allows users to run their own Electrum server. It connects to your 18 | full node and indexes the blockchain, allowing efficient querying of history of 19 | arbitrary addresses. The server can be exposed publicly, and joined to the public network 20 | of servers via peer discovery. As of May 2020, a significant chunk of the public 21 | Electrum server network runs ElectrumX. 22 | 23 | Documentation 24 | ============= 25 | 26 | See `readthedocs `_. 27 | 28 | -------------------------------------------------------------------------------- /tests/blocks/chips_mainnet_200000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "00000000000000c614b8cdab56a19c6fb20d24dd9afb39ddfa6ce57c2b3d8c00", 3 | "size": 359, 4 | "height": 200000, 5 | "merkleroot": "45a10df9b785291aa949e0c2dd85842d2a2107b14eea5462563082f467a32ff4", 6 | "tx": [ 7 | "45a10df9b785291aa949e0c2dd85842d2a2107b14eea5462563082f467a32ff4" 8 | ], 9 | "time": 1504943782, 10 | "nonce": 2534816454, 11 | "bits": "1a013db6", 12 | "previousblockhash": "000000000000001bb40105cad927e92187c0c02890fde9f9952a228dd9c115ad", 13 | "block": "00000020ad15c1d98d222a95f9e9fd9028c0c08721e927d9ca0501b41b00000000000000f42fa367f48230566254ea4eb107212a2d8485ddc2e049a91a2985b7f90da145a69eb359b63d011ac63a169701010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff4c03400d0304a69eb35908fabe6d6d3c4f2c6b9fc1681d0382dac70bbb0050005a934adc5a2002b45bdf0d01d634cc010000000000000018000116dd47b5000d2f6e6f64655374726174756d2f00000000030000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf9c0989222010000001976a9149fee63c60611f6dafa8fe9ae88eb2ce4282ac32388ac40597307000000001976a914a8338406253f06c7bd128e41429c17815da8d7ac88ac0120000000000000000000000000000000000000000000000000000000000000000000000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/nix_mainnet_50000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "b9fa17b5469c68aeddea48666f12c8ae5cdc3e8521b4b5637e10099cda8728fd", 3 | "size": 377, 4 | "height": 50000, 5 | "merkleroot": "2ee565d865d766a9861d77f1d3c34b364261a105fd0b10c15e9cb07dc61b1493", 6 | "tx": [ 7 | "2ee565d865d766a9861d77f1d3c34b364261a105fd0b10c15e9cb07dc61b1493" 8 | ], 9 | "time": 1536401916, 10 | "nonce": 1610805540, 11 | "bits": "1b0551f5", 12 | "previousblockhash": "acec77ce8845f34d2a854dc7da66151338c2f42f1c7f51782bd7732017f13c31", 13 | "block": "00000020313cf1172073d72b78517f1c2ff4c238131566dac74d852a4df34588ce77ecac93141bc67db09c5ec1100bfd05a16142364bc3d3f1771d86a966d765d865e52efca1935bf551051b24f1026001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff200350c30004fca1935b08180006a3510200000d2f6e6f64655374726174756d2f00000000050000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90090f4f70000000017a914e48c970e4a4faa6222688ec6333eb53c578e59f78700d012130000000017a9146a27966d76edfdfb3c53dc37dd5471bdeac7d46c870020a1070000000017a9147150055215791b779dddb1d112541a3fce71061b8700c0cf6a000000001976a91490f50a1fa5b280282de2a3ec15164a766fd48a0288ac0120000000000000000000000000000000000000000000000000000000000000000000000000" 14 | } 15 | -------------------------------------------------------------------------------- /contrib/Dockerfile: -------------------------------------------------------------------------------- 1 | # example of Dockerfile that builds release of electrumx-1.13.0 2 | # ENV variables can be overrided on the `docker run` command 3 | 4 | FROM ubuntu:20.04 5 | 6 | WORKDIR / 7 | ADD https://github.com/spesmilo/electrumx/archive/1.15.0.tar.gz / 8 | RUN tar zxvf *.tar.gz 9 | 10 | RUN apt-get update && \ 11 | apt-get -y install python3.8 python3-pip librocksdb-dev libsnappy-dev libbz2-dev libz-dev liblz4-dev 12 | 13 | RUN cd /electrumx* && pip3 install .[rocksdb] 14 | 15 | ENV SERVICES="tcp://:50001" 16 | ENV COIN=Bitcoin 17 | ENV DB_DIRECTORY=/db 18 | ENV DAEMON_URL="http://username:password@hostname:port/" 19 | ENV ALLOW_ROOT=true 20 | ENV DB_ENGINE=rocksdb 21 | ENV MAX_SEND=10000000 22 | ENV BANDWIDTH_UNIT_COST=50000 23 | ENV CACHE_MB=2000 24 | 25 | VOLUME /db 26 | 27 | RUN mkdir -p "$DB_DIRECTORY" && ulimit -n 1048576 28 | 29 | CMD ["/usr/bin/python3", "/usr/local/bin/electrumx_server"] 30 | 31 | # build it with eg.: `docker build -t electrumx .` 32 | # run it with eg.: 33 | # `docker run -d --net=host -v /home/electrumx/db/:/db -e DAEMON_URL="http://youruser:yourpass@localhost:8332" -e REPORT_SERVICES=tcp://example.com:50001 electrumx` 34 | # for a proper clean shutdown, send TERM signal to the running container eg.: `docker kill --signal="TERM" CONTAINER_ID` 35 | -------------------------------------------------------------------------------- /tests/blocks/lynx_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1d1ff185", 3 | "confirmations": 1366325, 4 | "difficulty": 0.03130486, 5 | "hash": "d120afa12e4ab50b041a0b1eb1ac81601f8c533ca27ff61a33657ea79c5d3de0", 6 | "height": 1000, 7 | "merkleroot": "3f93868aa1eb9b6135d05d1994a54320ab401f4450ebb14d40cd33f41f97983a", 8 | "nextblockhash": "d2d270313bbc8d6b739be99a35e1b2a7a9c2073db9ab65c9a7655546e5de864a", 9 | "nonce": 2707782758, 10 | "previousblockhash": "b171c17f5c0576371190dbb19d5d62939133e83512317177fcf5a99a24099353", 11 | "size": 282, 12 | "time": 1496282604, 13 | "tx": [ 14 | "3f93868aa1eb9b6135d05d1994a54320ab401f4450ebb14d40cd33f41f97983a" 15 | ], 16 | "version": 2, 17 | "block": "02000000539309249aa9f5fc7771311235e8339193625d9db1db90113776055c7fc171b13a98971ff433cd404db1eb50441f40ab2043a594195dd035619beba18a86933fec752f5985f11f1d667c65a10101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5202e803062f503253482f04ec752f5908fabe6d6d2aa3c9be8f9005e3a0d91ade5c8f1acdb2bba9440b7c2ae17f2fbd2d031696f0010000000000000057fffff72aaaaadd0d2f6e6f64655374726174756d2f000000000280010b27010000001976a91439dd78df702de87d474a3cf3746f5f9e2fd6b9d288ac80f0fa02000000001976a9147f1bb38ed00c013f4a5d1f73a92196a29708dad088ac00000000" 18 | } -------------------------------------------------------------------------------- /tests/lib/test_env_base.py: -------------------------------------------------------------------------------- 1 | # Tests of server/env.py 2 | 3 | import os 4 | 5 | import pytest 6 | 7 | from electrumx.lib.env_base import EnvBase 8 | 9 | 10 | os.environ.update({ 11 | 'int': '32', 12 | 'intspace': ' 32 ', 13 | 'true': 'x', 14 | 'false': '', 15 | 'space': ' ', 16 | }) 17 | 18 | def test_default(): 19 | e = EnvBase() 20 | assert e.default('int', '33') == '32' 21 | assert e.default('baz', 'z') == 'z' 22 | 23 | def test_boolean(): 24 | e = EnvBase() 25 | assert e.boolean('true', False) 26 | assert not e.boolean('false', True) 27 | assert not e.boolean('space', True) 28 | assert e.boolean('missing', True) 29 | assert not e.boolean('missing', False) 30 | 31 | def test_required(): 32 | e = EnvBase() 33 | assert e.required('true') == 'x' 34 | with pytest.raises(e.Error): 35 | e.required('missing') 36 | 37 | def test_integer(): 38 | e = EnvBase() 39 | assert e.integer('int', 33) == 32 40 | assert e.integer('missing', 33) == 33 41 | assert e.integer('intspace', 33) == 32 42 | assert e.integer('missing', None) is None 43 | with pytest.raises(e.Error): 44 | e.integer('true', 1) 45 | 46 | def test_obsolete(): 47 | e = EnvBase() 48 | with pytest.raises(e.Error): 49 | e.obsolete(['z', 'space']) 50 | -------------------------------------------------------------------------------- /tests/blocks/cannacoin_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1d00a328", 3 | "confirmations": 890083, 4 | "difficulty": 1.56902413, 5 | "flags": "proof-of-work", 6 | "hash": "2c2a5d44dc40e33a979d04a72b93a4245f2f5d29f22f97d8a59766b39cab9d03", 7 | "height": 1000, 8 | "merkleroot": "f1a03809cae92bd8727bf0c6a51b5ac39beb55a0fffd5a4ebc492ac64d6b87a4", 9 | "moneysupply": 12500.0, 10 | "nextblockhash": "68ecec3ad9a68df51a9649d32968539e6c03adceb515eb88b436fecc89f56c9d", 11 | "nonce": 1445150464, 12 | "previousblockhash": "6fdf1da2c73c207186a576d322f7525d94ad7a8dc4094393febc379e8585f132", 13 | "proofhash": "0000000000000000000000000000000000000000000000000000000000000000", 14 | "size": 204, 15 | "time": 1396019878, 16 | "tx": [ 17 | "f1a03809cae92bd8727bf0c6a51b5ac39beb55a0fffd5a4ebc492ac64d6b87a4" 18 | ], 19 | "version": 1, 20 | "block": "0100000032f185859e37bcfe934309c48d7aad945d52f722d376a58671203cc7a21ddf6fa4876b4dc62a49bc4e5afdffa055eb9bc35a1ba5c6f07b72d82be9ca0938a0f1a692355328a3001d003f23560101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2602e803062f503253482f04aa92355308f800001d0f0000000d2f7374726174756d506f6f6c2f0000000001807c814a000000001976a914d6dacaf08f8d62eef980ebc4acbd5d9dc488e9e388ac00000000" 21 | } 22 | -------------------------------------------------------------------------------- /tests/blocks/flashcoin_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "207fffff", 3 | "chainwork": "00000000000000000000000000000000000000000000000000000000001007e0", 4 | "confirmations": 1166556, 5 | "difficulty": 4.656542373906925e-10, 6 | "hash": "109b5dba825581a9a4e9d863046c8edbac32ac1ba9726df76f5f327b41b4ee56", 7 | "height": 1000, 8 | "mediantime": 1470397326, 9 | "merkleroot": "6a8f5bf3db01d2aa211b3023cfcb530ac981fc6fa68af73a1e4f0b878df8a79f", 10 | "nextblockhash": "6acd41ad60adcb5dfb3cfa6f9899c18e40efe4ae3bd0272e48163fc44a1a8c01", 11 | "nonce": 1, 12 | "previousblockhash": "5cee968ceb4cffb380dae3606b9558ac1fd6c5b7c2c047cf9fed1dd7e5ecf6d6", 13 | "size": 181, 14 | "strippedsize": 181, 15 | "time": 1470397327, 16 | "tx": [ 17 | "6a8f5bf3db01d2aa211b3023cfcb530ac981fc6fa68af73a1e4f0b878df8a79f" 18 | ], 19 | "version": 3, 20 | "versionHex": "00000003", 21 | "weight": 724, 22 | "block": "03000000d6f6ece5d71ded9fcf47c0c2b7c5d61fac58956b60e3da80b3ff4ceb8c96ee5c9fa7f88d870b4f1e3af78aa66ffc81c90a53cbcf23301b21aad201dbf35b8f6a8f7ba457ffff7f20010000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0502e8030101ffffffff010080c6a47e8d0300232103306015df2d2fb6436e6ed904f27af63c987683085b66133081ead2198be4e37aac00000000" 23 | } -------------------------------------------------------------------------------- /tests/blocks/zcoin_mainnet_100000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "fa192afbf7a43689502135e425df7279b13f450f5b49c1107746362c343a68f5", 3 | "size": 402, 4 | "height": 100000, 5 | "merkleroot": "019e31415109ca16f09e35cab38ac0a0624949c0539ce110fbbe4cf506e9b776", 6 | "tx": [ 7 | "019e31415109ca16f09e35cab38ac0a0624949c0539ce110fbbe4cf506e9b776" 8 | ], 9 | "time": 1533976567, 10 | "nonce": 1565590912, 11 | "bits": "1b02364f", 12 | "previousblockhash": "3523dfb821472a1f1472bc12eee06e4ff404b92d03dc51318ab589b2906c538f", 13 | "block": "000000208f536c90b289b58a3151dc032db904f44f6ee0ee12bc72141f2a4721b8df233576b7e906f54cbefb10e19c53c0494962a0c08ab3ca359ef016ca095141319e01f79f6e5b4f36021b8005515d0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2003a0860104f79f6e5b0877ffe6dd840000000d2f6e6f64655374726174756d2f0000000007009ce4a6000000001976a914dfa17720fa101e262a8fc1a378f25a275a26952288ac00e1f505000000001976a9147d9ed014fc4e603fca7c2e3f9097fb7d0fb487fc88ac00e1f505000000001976a914bc7e5a5234db3ab82d74c396ad2b2af419b7517488ac00e1f505000000001976a914ff71b0c9c2a90c6164a50a2fb523eb54a8a6b55088ac00a3e111000000001976a9140654dd9b856f2ece1d56cb4ee5043cd9398d962c88ac00e1f505000000001976a9140b4bfb256ef4bfa360e3b9e66e53a0bd84d196bc88ac002f6859000000001976a914dec7ddb718550686e8ea9b100354ef04f20167a988ac00000000" 14 | } 15 | 16 | -------------------------------------------------------------------------------- /tests/blocks/axe_testnet_30237.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000004d68dab78b9482b10d97c06df8838c3a4d4b127f4bfaff8944a1c7e2c4", 3 | "size": 416, 4 | "height": 30237, 5 | "merkleroot": "0297c882867576d7ea600c379a871451bf8b05233371f2162afed6d712b1fd37", 6 | "tx": [ 7 | "0297c882867576d7ea600c379a871451bf8b05233371f2162afed6d712b1fd37" 8 | ], 9 | "time": 1584597511, 10 | "nonce": 394664704, 11 | "bits": "1e0583a9", 12 | "previousblockhash": "000002efc4918c1e85e751310855925f9c0ce8c7c2ba85855d548dde547590ef", 13 | "block": "00000020ef907554de8d545d8585bac2c7e80c9c5f9255083151e7851e8c91c4ef02000037fdb112d7d6fe2a16f2713323058bbf5114879a370c60ead776758682c89702070a735ea983051e001b86170103000500010000000000000000000000000000000000000000000000000000000000000000ffffffff12021d760e2f5032506f6f6c2d74415845332fffffffff0440230e43000000001976a914398e641c57eeb9d85c7f11e4974a3acef8f0959988ac40230e43000000001976a914a20d1c04b065c2f6785345a660ba3d0b58be604688ac00000000000000004341047559d13c3f81b1fadbd8dd03e4b5a1c73b05e2b980e00d467aa9440b29c7de23664dde6428d75cafed22ae4f0d302e26c5c5a5dd4d3e1b796d7281bdc9430f35ac00000000000000002a6a28f5cb8e0314b650681d3f95240fc465630716b1bfd826e3ec20b25230d4e41d470000000000000000000000004602001d760000c6e1a2a7da17de253be30ba0bff759fb0b29df7af43ef1945687749aaa85e19b0000000000000000000000000000000000000000000000000000000000000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/groestlcoin_testnet_600000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000006f6fe0a699fa886b686478757001e835ac5d14d3564853564070eaec80", 3 | "size": 414, 4 | "height": 600000, 5 | "merkleroot": "8f319c349f022c55c2dee11c45a801fc4c3befff0da4716252da761ff1829ab8", 6 | "tx": [ 7 | "8f319c349f022c55c2dee11c45a801fc4c3befff0da4716252da761ff1829ab8" 8 | ], 9 | "time": 1527979101, 10 | "nonce": 1015101440, 11 | "bits": "1e00a292", 12 | "previousblockhash": "0000000793af7147bb657a0c664d353dacbeda0ea308284f121e57e52e94f64e", 13 | "block": "000000204ef6942ee5571e124f2808a30edabeac3d354d660c7a65bb4771af9307000000b89a82f11f76da526271a40dffef3b4cfc01a8451ce1dec2552c029f349c318f5d1c135b92a2001e0038813c01010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0403c02709ffffffff050000000000000000266a24aa21a9ed92ac07c7b9e008effde0e4753064f2328b1c8cd3d0b488f4bf1bba8cb9338c36f90f5a2f000000001976a914de5853461d170e13ccb55b557d380b2ba311df0588ace19f6730000000001976a914edd383678438905630480a97dac76645766c86c188ac0200000000000000434104c5e6c406b804c7ea1f7c756297ed327dd12f6466b699536bbb85641d9daf9a1222a5a6e18bd203b96132371c7932cb4c999fc7039171a28d76695c5c055f2f33ac00000000000000002a6a28fc8e81ddd6d7c466bcceee57eea76e56dbfd211afed8d9945b4b3cfe54ed62b9000000000000000001205b5032506f6f6c5d5b5032506f6f6c5d5b5032506f6f6c5d5b5032506f6f6c5d00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/gravitycoin_mainnet_400000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "80f2ff951df0dfd82cfb26c25699aa3b56700dd564e39744faf5bd5540631cb0", 3 | "size": 416, 4 | "height": 400000, 5 | "merkleroot": "85246549a084ff10cffbff02b2e977c8c0e84275ee2a012b4b9f49ceb021c33d", 6 | "tx": [ 7 | "85246549a084ff10cffbff02b2e977c8c0e84275ee2a012b4b9f49ceb021c33d" 8 | ], 9 | "time": 1546823803, 10 | "nonce": 1651216932, 11 | "bits": "1d122121", 12 | "previousblockhash": "388fce0759735e2a7eb5f437f302feb7c05ab07c7f3fafbccc5c25707738009c", 13 | "block": "000000209c00387770255cccbcaf3f7f7cb05ac0b7fe02f337f4b57e2a5e735907ce8f383dc321b0ce499f4b2b012aee7542e8c0c877e9b202fffbcf10ff84a0496524857ba8325c2121121d24926b620101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5003801a06047ba8325c08fabe6d6d000000000000000000000000000000000000000000000000000000000000000001000000000000002800faa900000000112f456173794d696e652e6f6e6c696e652f0000000006801d2c04000000001976a914dda8644ebb6959b161812fb10b42e2a5888b1c8f88ac801d2c04000000001976a914f2ff0ecbb0907837aeaa93a22b60c40eac244ab788ac80969800000000001976a9145342c2ddb553cee1b6144ca17d9670f7d05d72d588ac80969800000000001976a914b0ce6adc1e0713b4927aa6daa22488fac9ff259988ac80969800000000001976a914682ac36e06f6cb60f4135a60a578150b989b0b9688ac80c3c901000000001976a9141bea0e3994eb788cd6c597b7b456e0f0111e2de888ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/ixcoin_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1d00ffff", 3 | "chainwork": "000000000000000000000000000000000000000000000000000003e903e903e9", 4 | "confirmations": 568019, 5 | "difficulty": 1, 6 | "hash": "00000000be0e638f75c46f83e431d50847c00330e17adbca7836e994eaf5c32d", 7 | "height": 1000, 8 | "mediantime": 1305584428, 9 | "merkleroot": "0e11176ade0bd20e15b84d804449b7abd8311252391d104a7feb8e355b26aae3", 10 | "nextblockhash": "00000000b312e5fc2942e7af3410d8e14aa0fd2645c8335c7b8518969713effc", 11 | "nonce": 1570437396, 12 | "previousblockhash": "0000000029432e3fce8ec8d325edc3a7952ac791a5ba04d4fa477bab96d94924", 13 | "size": 215, 14 | "strippedsize": 215, 15 | "time": 1305587074, 16 | "tx": [ 17 | "0e11176ade0bd20e15b84d804449b7abd8311252391d104a7feb8e355b26aae3" 18 | ], 19 | "version": 1, 20 | "versionHex": "00000001", 21 | "weight": 860, 22 | "block": "010000002449d996ab7b47fad404baa591c72a95a7c3ed25d3c88ece3f2e432900000000e3aa265b358eeb7f4a101d39521231d8abb74944804db8150ed20bde6a17110e82add14dffff001d14f99a5d0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d013cffffffff010060343c02000000434104fa01e4ae895f34ecf95bed7b28e535d1913809ffd2396a5aa526936da6d43353567d98c7a6be2e75459047b6f2feaa98d08b6e75c2bf9a195da8a3a2477c1464ac00000000" 23 | } -------------------------------------------------------------------------------- /tests/blocks/smileycoin_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1e0ffff0", 3 | "chainwork": "000000000000000000000000000000000000000000000000000000003e903e90", 4 | "confirmations": 636939, 5 | "difficulty": 0.00024414, 6 | "hash": "169783de41a91893e5ea3e95cfc23627b54e75e2e8d9bb265f2f2d38dbf54b3a", 7 | "height": 1000, 8 | "merkleroot": "9675ee2e6cef381d4508b95b69a2e33a4d4f4df2eeb87a170f920a4d9bdbd491", 9 | "nextblockhash": "a7122eb59543fa545204925615c8faaee4b3d7086e9626d06678dfa91be1131d", 10 | "nonce": 4192797184, 11 | "pow_algo": "scrypt", 12 | "pow_algo_id": 1, 13 | "pow_hash": "00000f7b5324bbbff3472fd1fd059a3a88bf3d632a53a8d32a37aef7ed22a504", 14 | "previousblockhash": "71c13857b3c5a3206b5544c23393c21725dae16c053d8d781aa2e38b510f5213", 15 | "size": 188, 16 | "time": 1415892485, 17 | "tx": [ 18 | "9675ee2e6cef381d4508b95b69a2e33a4d4f4df2eeb87a170f920a4d9bdbd491" 19 | ], 20 | "version": 2, 21 | "block": "0200000013520f518be3a21a788d3d056ce1da2517c29333c244556b20a3c5b35738c17191d4db9b4d0a920f177ab8eef24d4f4d3ae3a2695bb908451d38ef6c2eee759605ce6454f0ff0f1e0002e9f90101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0c02e8030101062f503253482fffffffff010000768bc98608002321030ec3a62851c9112fb65ba5f9c0a7f38dc552fab82d6d05ab45ef088af55373a2ac00000000" 22 | } -------------------------------------------------------------------------------- /tests/blocks/decred_mainnet_100.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000000000017dd91008ec7c0ea63749b81d9a5188d9efc8d2d8cc0bdcff4d2a", 3 | "size": 382, 4 | "height": 100, 5 | "merkleroot": "5c49629cefa3d5eb640a3236f6e970386e0b0826a5d33d566de36aec534fa93d", 6 | "stakeroot": "0000000000000000000000000000000000000000000000000000000000000000", 7 | "tx": [ 8 | "c813acfcad624ccf19e6240358b95cbbb1b728ee94557556dc373cceae1a7e4b" 9 | ], 10 | "time": 1454961067, 11 | "nonce": 3396292691, 12 | "bits": "1b01ffff", 13 | "previousblockhash": "000000000000dcecdf2c1ae9bb3e2e3135e7765b1902938ff67e2be489ab8131", 14 | "block": "010000003181ab89e42b7ef68f9302195b76e735312e3ebbe91a2cdfecdc0000000000003da94f53ec6ae36d563dd3a526080b6e3870e9f636320a64ebd5a3ef9c62495c000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000ffff011b00c2eb0b00000000640000007e010000abf1b85653506fca9885f1c26941ecf1010000000000000000000000000000000000000000000000000000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff00ffffffff03fa1a981200000000000017a914f5916158e3e2c4551c1796708db8367207ed13bb8700000000000000000000266a2464000000000000000000000000000000000000000000000000000000733ea5b290c04d1fdea1906f0000000000001976a9145b98376242c78de2003e7940d7e44270c39b83eb88ac000000000000000001d8bc28820000000000000000ffffffff0800002f646372642f00" 15 | } 16 | -------------------------------------------------------------------------------- /tests/blocks/digitalcoin_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1e0ffff0", 3 | "chainwork": "000000000000000000000000000000000000000000000000000003df047f00a0", 4 | "confirmations": 4424129, 5 | "difficulty": 0.000244140625, 6 | "hash": "6970173f5fe0686a168e67e37d858c2fb090e67dfd26d9bf44c356aa2cda100c", 7 | "height": 1000, 8 | "mediantime": 1369044732, 9 | "merkleroot": "5d355b696d76f9753fe518ae80c032d1f788a0965898d4051c38f6feb6af9161", 10 | "nextblockhash": "843daca17134c07ed837a158bbe1a5ab2abb180e143b2756937527594e9feeba", 11 | "nonce": 1174732800, 12 | "pow_algo": "scrypt", 13 | "pow_algo_id": 1, 14 | "pow_hash": "00000377cbc0de416f961aac8694462b83ef74ffc7bb054dde5b486298e49d07", 15 | "previousblockhash": "3dfe9da7cd097bdba63b716368722fc724670358b88747a158409ceede672f0e", 16 | "size": 190, 17 | "time": 1369044733, 18 | "tx": [ 19 | "5d355b696d76f9753fe518ae80c032d1f788a0965898d4051c38f6feb6af9161" 20 | ], 21 | "version": 1, 22 | "block": "010000000e2f67deee9c4058a14787b858036724c72f726863713ba6db7b09cda79dfe3d6191afb6fef6381c05d4985896a088f7d132c080ae18e53f75f9766d695b355dfdf69951f0ff0f1e000005460101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e04fdf699510112062f503253482fffffffff0100c2eb0b000000002321031c59c7866c547fe6615b2874646bfe135f6eca46109c092c1708eaee6ec4e0b4ac00000000" 23 | } -------------------------------------------------------------------------------- /tests/blocks/primecoin_mainnet_3117396.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash" : "ad98148a64491553c3e0df9665635e6ec3e8a84bdc982c86967edac4136f59d3", 3 | "confirmations" : 505085, 4 | "size" : 202, 5 | "height" : 3117396, 6 | "version" : 2, 7 | "headerhash" : "b29038af4d7fc9c8aac6f3b4dd6838a5805846abe4af3def0ccfa4caafeba96a", 8 | "merkleroot" : "1ae7d4402b047226399f57b6e1b485bb6b3a86b3f45e473b2eb5e0275d9ee5f5", 9 | "time" : 1553982642, 10 | "nonce" : 1707532866, 11 | "bits" : "0b3cfe41", 12 | "difficulty" : 11.23825460672379, 13 | "primechain" : "TWN0e.7df271", 14 | "primeorigin" : "2107196499336304674682769806487252000898584808675035226683913465963762300297519874624898881132953600", 15 | "previousblockhash" : "e7081359d1c01a090aa5fe229b18e228df04b9d8341ee2b394dfcb20baac59b6", 16 | "nextblockhash" : "f928188ec77227a1ebcf4ac289d2d9da02f2d1365e398fa188fc3800033adb62", 17 | "tx" : [ 18 | "1ae7d4402b047226399f57b6e1b485bb6b3a86b3f45e473b2eb5e0275d9ee5f5" 19 | ], 20 | "block": "02000000b659acba20cbdf94b3e21e34d8b904df28e2189b22fea50a091ac0d1591308e7f5e59e5d27e0b52e3b475ef4b3863a6bbb85b4e1b6579f392672042b40d4e71ab2e49f5c41fe3c0b42e2c6650a000020fa25a7355786050101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0f0354912f02d60300062f503253482fffffffff018071162f00000000232102426c423c5e182df0391e64f50e5f11967f5eb5b6413ea076bc0ea90aff7220c4ac00000000" 21 | } 22 | -------------------------------------------------------------------------------- /tests/blocks/linx_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1d1ff185", 3 | "confirmations": 1363830, 4 | "difficulty": 0.03130486, 5 | "hash": "d120afa12e4ab50b041a0b1eb1ac81601f8c533ca27ff61a33657ea79c5d3de0", 6 | "height": 1000, 7 | "merkleroot": "3f93868aa1eb9b6135d05d1994a54320ab401f4450ebb14d40cd33f41f97983 a", 8 | "nextblockhash": "d2d270313bbc8d6b739be99a35e1b2a7a9c2073db9ab65c9a7655546e5de 864a", 9 | "nonce": 2707782758, 10 | "previousblockhash": "b171c17f5c0576371190dbb19d5d62939133e83512317177fcf5a99a 24099353", 11 | "size": 282, 12 | "time": 1496282604, 13 | "tx": [ 14 | "3f93868aa1eb9b6135d05d1994a54320ab401f4450ebb14d40cd33f41f97983a" 15 | ], 16 | "version": 2, 17 | "block": "02000000539309249aa9f5fc7771311235e8339193625d9db1db90113776055c7fc171b13a98971ff433cd404db1eb50441f40ab2043a594195dd035619beba18a86933fec752f5985f11f1d667c65a10101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5202e803062f503253482f04ec752f5908fabe6d6d2aa3c9be8f9005e3a0d91ade5c8f1acdb2bba9440b7c2ae17f2fbd2d031696f0010000000000000057fffff72aaaaadd0d2f6e6f64655374726174756d2f000000000280010b27010000001976a91439dd78df702de87d474a3cf3746f5f9e2fd6b9d288ac80f0fa02000000001976a9147f1bb38ed00c013f4a5d1f73a92196a29708dad088ac00000000" 18 | } -------------------------------------------------------------------------------- /tests/blocks/nix_testnet_200.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "9d5d8d308484a654cfc18fc6290734dca584bf0c02409429682a8b46715a0811", 3 | "size": 384, 4 | "height": 200, 5 | "merkleroot": "ee1377591fe82696a15f416476a28cf57a83af77e799bbfdff24909be06cc559", 6 | "tx": [ 7 | "ee1377591fe82696a15f416476a28cf57a83af77e799bbfdff24909be06cc559" 8 | ], 9 | "time": 1542147760, 10 | "nonce": 0, 11 | "bits": "1a2157b9", 12 | "previousblockhash": "1634ccd348860d24b5eabffc8782ae1aa1d6797477f0d4910cb25488a28cb372", 13 | "block": "0000002072b38ca28854b20c91d4f0777479d6a11aae8287fcbfeab5240d8648d3cc341659c56ce09b9024fffdbb99e777af837af58ca27664415fa19626e81f597713eeb04eeb5bb957211a00000000010203000001daf694ffcf73e2710b6148d89fc10b95cb55e255d804014c5141712168b9524c01000000171600147c5aad68a58a92630e3feab030fcaeb2cfff37feffffffff0530ecadf66b01000032b863a914f0c3b8f1fb7c1887a70c0108f729620c4c0901228767a914bdb5bb31196596f760ddaa49f7a82956e30b58de876830ecadf66b01000032b863a914f0c3b8f1fb7c1887a70c0108f729620c4c0901228767a914bdb5bb31196596f760ddaa49f7a82956e30b58de87680090d0030000000017a9147667be5313f1e3fb921a096b4b9b59c82b157ebe870090d0030000000017a914bf41e0caa3649bd8b9f4008103fb2a2757f3b8f3870000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000473045022100b517ff2a36aee842e4ff750723b1cea0e7cc0064677d69735e4775a01245224802206db5bf42c16d76e790e97f741a10f576628c38bcb5a7072d1df4be9c1cd874e4" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/unobtanium_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1c00a2c3", 3 | "chainwork": "0000000000000000000000000000000000000000000000000012f71a4eff9fd2 ", 4 | "confirmations": 1426785, 5 | "difficulty": 402.64381885, 6 | "hash": "00000000000f4f65907948a85a9d52cca2506de3917489563f58f0b02d1298dc", 7 | "height": 1000, 8 | "merkleroot": "1bca98242ebb4e70f5273bbc2db26f121294f2bdb47313b06f164b24c4fdff4 4", 9 | "nextblockhash": "000000000078132ced7ca47eee7b239bc72decf025e8a0ff62b32180fc0a 6394", 10 | "nonce": 2895311517, 11 | "previousblockhash": "000000000083da8744c628a37b3d30ba33249dd6f9dc241af0899d2f 09e30c58", 12 | "size": 204, 13 | "time": 1382139404, 14 | "tx": [ 15 | "1bca98242ebb4e70f5273bbc2db26f121294f2bdb47313b06f164b24c4fdff44" 16 | ], 17 | "version": 2, 18 | "block": "02000000580ce3092f9d89f01a24dcf9d69d2433ba303d7ba328c64487da83000000000044fffdc4244b166fb01373b4bdf29412126fb22dbc3b27f5704ebb2e2498ca1b0cc66152c3a2001c9df292ac0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2602e803062f503253482f0402c6615208f8000055b00000000d2f7374726174756d506f6f6c2f0000000001a0860100000000001976a914d33336c075f837ea596a6d8528c5a6d399a1d71688ac00000000" 19 | } 20 | -------------------------------------------------------------------------------- /electrumx_server: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # 3 | # Copyright (c) 2016-2018, Neil Booth 4 | # 5 | # All rights reserved. 6 | # 7 | # See the file "LICENCE" for information about the copyright 8 | # and warranty status of this software. 9 | 10 | '''Script to kick off the server.''' 11 | 12 | import asyncio 13 | import logging 14 | import sys 15 | 16 | from electrumx import Controller, Env 17 | from electrumx.lib.util import CompactFormatter, make_logger 18 | 19 | 20 | def main(): 21 | '''Set up logging and run the server.''' 22 | log_fmt = Env.default('LOG_FORMAT', '%(levelname)s:%(name)s:%(message)s') 23 | handler = logging.StreamHandler(sys.stdout) 24 | handler.setFormatter(CompactFormatter(log_fmt)) 25 | logger = make_logger('electrumx', handler=handler, level='INFO') 26 | 27 | logger.info('ElectrumX server starting') 28 | try: 29 | if sys.version_info < (3, 7): 30 | raise RuntimeError('ElectrumX requires Python 3.7 or greater') 31 | env = Env() 32 | logger.info(f'logging level: {env.log_level}') 33 | logger.setLevel(env.log_level) 34 | controller = Controller(env) 35 | asyncio.run(controller.run()) 36 | except Exception: 37 | logger.exception('ElectrumX server terminated abnormally') 38 | else: 39 | logger.info('ElectrumX server terminated normally') 40 | 41 | 42 | if __name__ == '__main__': 43 | main() 44 | -------------------------------------------------------------------------------- /tests/blocks/pivx_testnet_10000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "e5131e1610f037fe5b2ccce9e0c521d7811a0c46392238f0fadb06e5c25187e1", 3 | "size": 427, 4 | "height": 10000, 5 | "merkleroot": "1094dedef85d4be585ee2f07af0f3f8d42634413493f67a5beee5f98dbdfbe94", 6 | "tx": [ 7 | "705e9918f8cb302b9c498396b89f61ce111830512a2809ef2febc315797f777f", "2b255a6f234cfc1f82573bcff4158f9a08915c6cc78243a5c41c41f2e45b3561" 8 | ], 9 | "time": 1489600717, 10 | "nonce": 0, 11 | "bits": "1b00aafa", 12 | "previousblockhash": "1002a4f8555112786b9367fb77152bcf4c058ab756d2dde312f04fbbfd6de02a", 13 | "block": "030000002ae06dfdbb4ff012e3ddd256b78a054ccf2b1577fb67936b78125155f8a4021094bedfdb985feebea5673f49134463428d3f0faf072fee85e54b5df8dede9410cd80c958faaa001b000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff050210270101ffffffff01000000000000000000000000000100000001db86fae450b5cf86e783430b20d1ec5831971cc357ff0cb77458623495235a0b0100000048473044022048ac464dd1a72054a1df51982782a9d2bb8ab1922b8d24b9978ddce6cdbff6e30220497bc6951638b7d5dcae9645e8e2a687c6d736ff6a096debd70804c5139ef14101ffffffff0300000000000000000020c7f1052a010000232102624e3321ae66cfa542f1febe954b052cb560a8392c5ffd9a3d821cd17f47b682ac00f2052a010000001976a914fffc52dc6b3745407753734e8d4dbafa962b869b88ac0000000046304402206506b34c75aa787836034fcf5f01a0e051cd4eedbdd5d32fda015316c2e1951d02206db8085ec577ec6e2942d70c8c2879dfa69b6b53653c0b2c42601a1a47eea70c" 14 | } -------------------------------------------------------------------------------- /tests/blocks/bitcore_mainnet_100000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "99103dc00414fd4c90b03cd1a770626e2ac681baa10e5f7f7ce089a6d98f0dad", 3 | "size": 415, 4 | "height": 100000, 5 | "merkleroot": "59ea3a554c4cad8ae14ef7d8eed6c1e4d339bacb9ea91e308583c41645b8eafa", 6 | "tx": [ 7 | "57a9b42c52a0886ad9eddd9e52ccf25a1e11cce1a95b413fb58a307c09f1249b", 8 | "58e78239d2cfcd9d6d2da2e1f9d88b658919a74d2f1c298cc6421fd51f6256af" 9 | ], 10 | "time": 1513253979, 11 | "nonce": 3609159125, 12 | "bits": "1b135157", 13 | "previousblockhash": "19568daa07c7e0b6da2afac1b595f10ffe22abf8c8be1937a64c3e788064984f", 14 | "block": "000000204f986480783e4ca63719bec8f8ab22fe0ff195b5c1fa2adab6e0c707aa8d5619faeab84516c48385301ea99ecbba39d3e4c1d6eed8f74ee18aad4c4c553aea595b6c325a5751131bd5651fd70202000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1803a08601045b6c325a0881000067010000007969696d7000000000000139baa012000000001976a914f89644903c1a800b2906a86455138cf99ace9b7a88ac0000000002000000014293bea25fd7ba75b0a1bc7a771f1f5698dcd53c04d320f855357429d71f80b8000000006a473044022052496da791f8df38a36e2e7b1e54c41e13d8b2375d36930dbbdb4d08bf07d3e402206e6e87344d76205fff8f6852298f18ff1d10ade9df34c96b09a4c27b795be833012102c21bcdeb21fac4e71332063156d54bcedfed93a6eb30c131b083347ff05da5fcfeffffff02808d8aae000000001976a914347fd1a28f968648d0c4a75b0bb53eb4223a68c888ac65d9368c000000001976a914d00e25fe39beb4e38a4cb1a14b72c77040f096c888ac9f860100" 15 | } 16 | -------------------------------------------------------------------------------- /tests/blocks/egulden_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1e0ffff0", 3 | "certified": false, 4 | "chainwork": "000000000000000000000000000000000000000000000000000000003e903e90", 5 | "confirmations": 1574723, 6 | "difficulty": 0.000244140625, 7 | "hash": "99f4bacb2876ffcd74bcbaebfc9fdb5f6fabfc2e740b5d404f7f8935fef6506f", 8 | "height": 1000, 9 | "identified": false, 10 | "mediantime": 1395260482, 11 | "merkleroot": "e665cc3f6fe0abf603c4137a5177d99236b0fa6ea78a1a718d49c6a8e4a58297", 12 | "nextblockhash": "41164466777a8da56baeee3ab5522e7b64d53df6f32065abc6162ee1a1fc082d", 13 | "nonce": 108593152, 14 | "oeru_height": -1, 15 | "previousblockhash": "4b0ad0c3f83cde7ba92b229f1de84d512ff0d744c08632cfa2a47c3fc8926f62", 16 | "size": 188, 17 | "strippedsize": 188, 18 | "time": 1395260486, 19 | "tx": [ 20 | "e665cc3f6fe0abf603c4137a5177d99236b0fa6ea78a1a718d49c6a8e4a58297" 21 | ], 22 | "version": 2, 23 | "versionHex": "00000002", 24 | "weight": 752, 25 | "block": "02000000626f92c83f7ca4a2cf3286c044d7f02f514de81d9f222ba97bde3cf8c3d00a4b9782a5e4a8c6498d711a8aa76efab03692d977517a13c403f6abe06f3fcc65e646fc2953f0ff0f1e000079060101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0c02e8030151062f503253482fffffffff0100f90295000000002321023b98f0b6209f54dad83768a0e898c46a47bd60a8142581bc680430e37e2e025eac00000000" 26 | } -------------------------------------------------------------------------------- /tests/blocks/litecoincash_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1e0ffff0", 3 | "chainwork": "000000000000000000000000000000000000000000000000000000003e903e90", 4 | "confirmations": 1905921, 5 | "difficulty": 0.000244140625, 6 | "hash": "e081e3ab67a210d01dc67537eeae475ceea3dbaef6b0245d235c854f8cdadffc", 7 | "height": 1000, 8 | "hivedifficulty": 1, 9 | "mediantime": 1318477614, 10 | "merkleroot": "ff01bd36e9f68e83e212b34a025ab6c47e347041b93b39c5858aedf6b0d90abd", 11 | "nextblockhash": "5dc81c2ca4c6b4adcb23c527661e3ba070ef7778ae75fe5437133ce40819ec19", 12 | "nonce": 861, 13 | "previousblockhash": "6e94aed73152182d9d98e89d6cab225227f459065edc48f81f6f5d9acc95f03a", 14 | "size": 215, 15 | "strippedsize": 215, 16 | "time": 1318477627, 17 | "tx": [ 18 | "ff01bd36e9f68e83e212b34a025ab6c47e347041b93b39c5858aedf6b0d90abd" 19 | ], 20 | "type": "pow", 21 | "version": 1, 22 | "versionHex": "00000001", 23 | "weight": 860, 24 | "block": "010000003af095cc9a5d6f1ff848dc5e0659f4275222ab6c9de8989d2d185231d7ae946ebd0ad9b0f6ed8a85c5393bb94170347ec4b65a024ab312e2838ef6e936bd01ff3b5f964ef0ff0f1e5d0300000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07043b5f964e015effffffff0100f2052a01000000434104e9ac5c032ee6e9511d545df9a3c82de8a625361cf5ad8b7037c98e78dd2dc52ba8d671f0af75a1d46de316d07ab1a3525f29e0741dce84036b11ccbb9567a614ac00000000" 25 | } 26 | -------------------------------------------------------------------------------- /tests/blocks/bitcoingreen_mainnet_285000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "9b0276d83dff1883badf00a3d4cc2470cb8b5cb88fc8f7e506116d170ca13e25", 3 | "size": 429, 4 | "height": 285000, 5 | "merkleroot": "ceac2a8b68bcfb5670c5acbeeca791ddfc4ed03b01beefb9e5e2d0f50462c8cb", 6 | "tx": [ 7 | "5f381284dd7a496e1ebbabad5e870b28f108cc5bdc0ca8a93b54adb2611d16a3", "703b3f9a312c3eac763f7391905cfabba3faeea89f31b2952d287ab56c69965d" 8 | ], 9 | "time": 1534140284, 10 | "nonce": 0, 11 | "bits": "1b31a5bd", 12 | "previousblockhash": "51670aa1f4b4564258c318edb8f2b1f4e7945154a138ac4516ee2d14e6939fed", 13 | "block": "04000000ed9f93e6142dee1645ac38a1545194e7f4b1f2b8ed18c3584256b4f4a10a6751cbc86204f5d0e2e5b9efbe013bd04efcdd91a7ecbeacc57056fbbc688b2aacce7c1f715bbda5311b000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff06034859040101ffffffff01000000000000000000000000000100000001871709454e15ee7ee23d602808a8b24a8f46ffdd883c788124827f78afd2292e0100000049483045022100db102575ef2f04151d302fd69ea1b5e5a45eb58e330d3fd0a1b42b3a688187dc02204f8380379afb4dbb05e6961add378a027dff5d0252d948b3bd2b89a9dc09856301ffffffff03000000000000000000cb8488150c000000232102d8e7ecc69382c4f201d76356074d79ef1378368cdffa01aff2fa21693e1a4933ac80f8a932000000001976a914f82aff4e5ed1a6b8d310145284371421e921c1a288ac000000004630440220646d7ab39036a29ae9e27805aa00d9dfcf1640601225cdd23daf9f8232f3f5eb02207a7bf880ffad041240bf01c304dc660796de4719a1827c9c2eb8bc84c3c01c29" 14 | } -------------------------------------------------------------------------------- /tests/blocks/navcoin_mainnet_3700000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "898629efb169616e2123e10b7906d94e1f757069ef3474496c3f76ba0dba74fe", 3 | "size": 425, 4 | "height": 3700000, 5 | "merkleroot": "616471ce5bb016c45f9f5e9a695f8220757942f0b251a76d36b8c699297787d1", 6 | "tx": [ 7 | "906f40a0c6e6eb3f4eef45411dfa6f4990c4fe89d6891fed2ceaf2fe968b1104", 8 | "6f94109918ff709f38bc5bb48b90c37542c1033f54a575388fad4ddf5ca3548c" 9 | ], 10 | "time": 1575312624, 11 | "nonce": 0, 12 | "bits": "1a279571", 13 | "previousblockhash": "6285d97ba0cd9ce090c1d2a51ee00661e2cc5d345029166601ae3613d216051b", 14 | "block": "ffe135711b0516d21336ae0166162950345dcce26106e01ea5d2c190e09ccda07bd98562d187772999c6b8366da751b2f042797520825f699a5e9f5fc416b05bce716461f05ce55d7195271a000000000203000000f05ce55d010000000000000000000000000000000000000000000000000000000000000000ffffffff050320753800ffffffff0100000000000000000000000000025b5d03000000f05ce55d013ea81b0144d2d6af6c2adddc46116a940eeb26aaaaadb2652e067d16e7fc0e8501000000494830450221008ec46235f151aa40d4c518e0b1ce1aa47c646837589c63629b942acc7cf16d8202204d54b29672314bd184274ed7ef2980a7364c4ab2a6c89279c49ce48108b2457201ffffffff030000000000000000000889fa201b0000002321030bb30a99f11ef81d5a9966b3bbe9baac27ee9840166fc36144739ba390bddbc6ac00ba1dd205000000026ac100000000083b3430373031303046304402204ecf8a8133eafb4c5bef643b5d8897b5c92d390391397c2b2d0d231f36e691b002200cb405d3b93a611e750cb4192796aa5498866421b538687430d2f8868f70e04d" 15 | } 16 | -------------------------------------------------------------------------------- /tests/blocks/mnpcoin_mainnet_50000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "d79ad638259f3837ab25769130a518238ef9b6b20653d98df96e602fd1c8ee98", 3 | "size": 430, 4 | "height": 50000, 5 | "merkleroot": "c9361953258dc88686d1ca8136f16e84e3363bb4bf5fb5f008270b0994e74b9b", 6 | "tx": [ 7 | "367d5902ddb72eb8a8a943322501b225b1dd3fc3bddbc301b76ec54d653971a7", 8 | "299ef64c6891b4041c4b78159b419f32843ddd01e6a0bce643e8d9cb10075606" 9 | ], 10 | "time": 1536213079, 11 | "nonce": 0, 12 | "bits": "1b1d9628", 13 | "previousblockhash": "a8eaea0689418de02be93d1507a5a89a2fd8ab3b83aaadb548cd24303567b006", 14 | "block": "0300000006b067353024cd48b5adaa833babd82f9aa8a507153de92be08d418906eaeaa89b4be794090b2708f0b55fbfb43b36e3846ef13681cad18686c88d25531936c957c0905b28961d1b000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff060350c3000101ffffffff01000000000000000000000000000100000001dc1a9bcc0a7c5ae8b1241a6bcbe376fd83618763b9d03cabc3746f2344e9dcb40100000049483045022100f390507a07487a5c85ce6a77576b67eed72d86c60ad740dcd1ca418f46123bcf0220296358bc415152eb602849d613a3296a2013a4c645287d215d0a78355fd23ec901ffffffff0300000000000000000060dfa12224000000232102d0ab909607aec2711640fa6adb1665745e0e08b11ec5ad0336d2ec0106473837ac0046c323000000001976a914f605f5fd1c364d0ff189066bc991b83148e7460188ac00000000473045022100ca9a3654cfc3a4e5792d47e7726e29426737a599ea4077b80ec86b30782df49002206c07975a7ab2b393df45e33d40d913ccbecfc5958429e0158ac4ddadc1c460e0" 15 | } 16 | 17 | -------------------------------------------------------------------------------- /tests/blocks/primecointestnet_testnet_530680.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "b9a27ed7c3a74b6e633a5adf79c554a2c6a533f3cb4e773ab7a3a3430bdfb8b4", 3 | "confirmations" : 1772909, 4 | "size": 244, 5 | "height": 530680, 6 | "version": 2, 7 | "headerhash" : "963b91110e6db1f38221215f07be80918b02af752b1715aa5d57b292f1625174", 8 | "merkleroot": "60dec4be00b94a364582bc845024278373a59bfc07f69b1aaee9ef703da7f298", 9 | "time": 1405946691, 10 | "nonce": 7685071, 11 | "bits": "05e565eb", 12 | "difficulty": 5.896086394786835, 13 | "primechain" : "TWN0a.51df62", 14 | "primeorigin" : "601949573376308967673885761096209367147026247380723279812778691742263961519164696133687391171386800", 15 | "previousblockhash": "c484a7b9c90f738be83429e85e0f4cc78fe933096e0ba340a84c56d51f011884", 16 | "nextblockhash": "a20e6f9bdd237264fc71f0b2c510e5ec5dc02dfaf0aebb4f8267bffb5c5b6c3e", 17 | "tx": [ 18 | "60dec4be00b94a364582bc845024278373a59bfc07f69b1aaee9ef703da7f298" 19 | ], 20 | "block": "020000008418011fd5564ca840a30b6e0933e98fc74c0f5ee82934e88b730fc9b9a784c498f2a73d70efe9ae1a9bf607fc9ba5738327245084bc8245364ab900bec4de60430bcd53eb65e505cf4375000a5c2ee818b6f66937e0010101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2103f8180804241000000435978a020c6a685072696d656d696e65722f503253482fffffffff02a0a61e9a000000001976a9148a9c4fec018a27211891600f41c181c8d5a5b64888aca0d91f11000000001976a91432b0a6177e6d0d18a99e9d552eb006e75215b5e788ac00000000" 21 | } 22 | -------------------------------------------------------------------------------- /tests/blocks/colossusxt_mainnet_100000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash" : "a0b98bc9d1fa1212929fcdc0340e3a247841ddd9ca2c25341ad72b934a212298", 3 | "size" : 428, 4 | "height" : 100000, 5 | "merkleroot" : "b9ccc687ebcd7f9d64cfa19beb868266c074555b64c4b9dab0095c3f8e2c2618", 6 | "tx" : [ 7 | "7d2bc02e0e8fc48800bab3483c24fe43965b641e4c78264f8baf259348dbd99b", 8 | "eddfb4981949faa1ad910dfeb6fac03139f9962c28dfcf0263daa28621f7794c" 9 | ], 10 | "time" : 1512812610, 11 | "nonce" : 0, 12 | "bits" : "1b00a923", 13 | "previousblockhash" : "34fcd8993db57a21eaf2ca92de7f9f9cd4560540c93878d2813bc3e731c43936", 14 | "block": "030000003639c431e7c33b81d27838c9400556d49c9f7fde92caf2ea217ab53d99d8fc3418262c8e3f5c09b0dab9c4645b5574c0668286eb9ba1cf649d7fcdeb87c6ccb942b02b5a23a9001b000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0603a086010101ffffffff0100000000000000000000000000010000000192b6fdbfa57df70b8bd2d255c2fc3a85c381ceb31c448a7aecbb769bd143ca34010000004847304402205f275fb3121f8333a8bbe1c33e3adcf34cab29178935024d3d3019c97d9e08470220284c41203eb204161dc1a1972ac0a0c622e03d031289ae6a2e54609c01fac4b301ffffffff0300000000000000000002dcefd19500000023210200a8c63baa84e049c907519bf81cec60e66f1ca6b78c7eb94906bc2c726de079ac00f83c31210000001976a914222932b53e7c81174e7b97d097aa33056b3f15f488ac0000000046304402201573edcce491a50d7dbe23c56d601ea768d1009f4e17efbe92bd416c4469f5f502203d9e2c09345c3cfbbd210b77307db92aaf4694010c572a0198fea7e1d7c11c6f" 15 | } 16 | -------------------------------------------------------------------------------- /tests/blocks/pivx_testnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0923838e270b6c62e8ee957541793511c8aca8db2f6edea5209d3c6fd03b3bbb", 3 | "size": 461, 4 | "height": 10000, 5 | "merkleroot": "af2180392bc2a7d273f8da7c307a12e97ebc19271b7612d2b885079564fc86cc", 6 | "tx": ["df275d713fcf5e78e7e8369d640201d46736c0d2255e31ce45bd5aa0206f861f", "b68d2b93908869b5cf6ebe069aa21dd7ca3f6d5637cc098f3ec3f6f0406f6093"], 7 | "time": 1489054870, 8 | "nonce": 0, 9 | "bits": "1b0101e7", 10 | "previousblockhash": "17314f4629950d94c597f50434a7587af405e84aa5d825f35e09bbdc5cc969e0", 11 | "block": "03000000e069c95cdcbb095ef325d8a54ae805f47a58a73404f597c5940d9529464f3117cc86fc64950785b8d212761b2719bc7ee9127a307cdaf873d2a7c22b398021af962cc158e701011b000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0502e8030101ffffffff010000000000000000000000000001000000016d2ef9508a20c024b554567a1847b565f968b0926faa17a60c915c62f124343c1a0100006a473044022026966a060563b855e2dd95644d79af3713b81f65820a12e854dc40662034e9f702200ae2bee76842c5e21fbc9f17ea7303179e7c00447380ef3bd53a171541101451012102624e3321ae66cfa542f1febe954b052cb560a8392c5ffd9a3d821cd17f47b682ffffffff03000000000000000000f082fdc361000000232102624e3321ae66cfa542f1febe954b052cb560a8392c5ffd9a3d821cd17f47b682ac00f2052a010000001976a9144e22534048a03912670ffbc0714bb06678024d7588ac00000000463044022050067ba9a6b187114651909b16d67b367e1ced79eb2f8b8750c99da55ece848d0220237d89ec7a9cbfdf823ccd24842041cccc350ca518408bb284ed7a5b3e60de47" 12 | } -------------------------------------------------------------------------------- /tests/blocks/reddcoin_mainnet_1200000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "bea68724bfcdc5d35bf9bbf9cb6680e196e5661afe95b2a205e74a2fe175ac79", 3 | "size": 443, 4 | "height": 1200000, 5 | "merkleroot": "504b073c16d872d24f2c3de8a4c2c76d08df5056f3a4a8d0e32ff4220215a250", 6 | "tx": [ 7 | "6aaad9725ae7beb40d80dac9c5300a8e1cf8783adb0ea41da4988b3476bda9b8", 8 | "4a949402995c11b3306c0c91fd85edf0d3eb8dee4bf6bd07a241fa170156cd3c" 9 | ], 10 | "time": 1463612841, 11 | "nonce": 0, 12 | "bits": "1c0a4691", 13 | "previousblockhash": "438b564171da6fbbe6fd9d52c16ea2b1aa8c169951822225cf097d5da7cdba76", 14 | "block": "0300000076bacda75d7d09cf2522825199168caab1a26ec1529dfde6bb6fda7141568b4350a2150222f42fe3d0a8a4f35650df086dc7c2a4e83d2c4fd272d8163c074b50a9f53c5791460a1c000000000202000000010000000000000000000000000000000000000000000000000000000000000000ffffffff020000ffffffff0100000000000000000000000000a9f53c570200000001a40cad8a9afe2888f746d762cb36649b5afd4e8ce4468fd8d08fc296d26dc4840100000048473044022036392ee6eb58c5a9a2a681692cabdc2b00166c374cfb711055bc2c4d6c61a1d40220475728eed260bf972ef44909f0d6fa282f17e92b5e57ee383c7171e8a3baee1f01ffffffff030000000000000000000056b12a38720000232102bee8ce24a99260fbb6c10f0b904498fa71ec08e51b531878d3f6568ef09acb91ac0ad6b22a38720000232102bee8ce24a99260fbb6c10f0b904498fa71ec08e51b531878d3f6568ef09acb91ac00000000a9f53c57473045022100fe801bae06c9db3076fad2f72930f76dbe1cae29a162447b13d0df749e5913df02203621013f87da4dbca08702d8c7975f702bad9df40902038b93e622a0dd9c0896" 15 | } -------------------------------------------------------------------------------- /tests/blocks/ritocoin_mainnet_250000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000000000fa8ca8bbc8d2a5c43221bbbd23868d128fb6f942ea79f4fb8fb3f7", 3 | "confirmations": 1, 4 | "strippedsize": 279, 5 | "size": 315, 6 | "weight": 1152, 7 | "height": 296039, 8 | "version": 805306369, 9 | "versionHex": "30000001", 10 | "merkleroot": "e428c003c3d8660cabb891c1da141283a1a0045353786a7e7c809ef7fc5ff77b", 11 | "tx": [ 12 | "e428c003c3d8660cabb891c1da141283a1a0045353786a7e7c809ef7fc5ff77b" 13 | ], 14 | "time": 1561402552, 15 | "mediantime": 1561402193, 16 | "nonce": 3796686866, 17 | "bits": "1c022450", 18 | "difficulty": 119.5212584064744, 19 | "chainwork": "0000000000000000000000000000000000000000000000000842199d62c03de2", 20 | "previousblockhash": "00000000007dc528b4381ca868349627fd9e6d89f71607ab075f572448ed4a49", 21 | "nextblockhash": "0000000001875011ab354686523fe37786d417bf53efd7b09448bed928a74bd6", 22 | "block": "01000030494aed4824575f07ab0716f7896d9efd27963468a81c38b428c57d00000000007bf75ffcf79e807c7e6a78535304a0a1831214dac191b8ab0c66d8c303c028e4b81c115d5024021c12d84ce20101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff200367840404b81c115d08602a016b1cb500000d2f6e6f64655374726174756d2f00000000030000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf9001edc0c170000001976a914e6802e3c73096ca0baf6166e3b7ed2427984e8fd88ac8033023b000000001976a91464f64fb46815dbabaa57f61aca598eb93217ae7a88ac00000000" 23 | } 24 | -------------------------------------------------------------------------------- /tests/blocks/deeponion_mainnet_50000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "c6b3c170350aaaa3728df3d0b0e93d2bf52cfb848bbc28137639846e056713a6", 3 | "size": 445, 4 | "height": 50000, 5 | "merkleroot": "10c72de807fa5acdec02f2e6d1061489b27a71b4ef812310dcd315a2868f4d88", 6 | "tx": [ 7 | "e617d1b662f4eacd402dc2b2460f2f2d44f1d121a3f36d30fa20b53a1aa9d3b3", 8 | "aec49d1a1864f55cdb295d5c232b284b17d7c3e6a88829de854704a7e6af0784" 9 | ], 10 | "time": 1502958262, 11 | "nonce": 0, 12 | "bits": "1d0e11f1", 13 | "previousblockhash": "6bd4c3a7685f81957d7b4fc0227c39c675861489dbefc5e9268db0721280e0c8", 14 | "block": "06000000c8e0801272b08d26e9c5efdb89148675c6397c22c04f7b7d95815f68a7c3d46b884d8f86a215d3dc102381efb4717ab2891406d1e6f202eccd5afa07e82dc710b6529559f1110e1d000000000201000000b6529559010000000000000000000000000000000000000000000000000000000000000000ffffffff040350c300ffffffff010000000000000000000000000001000000b652955901bfcbd1d8bf080e0ba5491e45013563d54ef589f11fb3539c9995e958cb837ebb010000004847304402205561cf3dd6a7e5e39ffcc10bab0ae364c79b6b575e4d8a9d6ec3f6a9239b269f02200082f249ba415f1520367a006c4c3d9200dc49814f8620f2ef636d1e80b72f8d01ffffffff03000000000000000000c072acf51600000023210355073d2fdc1b90c3d6a58505a620062651d8236a08e5252f40fe872ecdf90cffac498fc1f51600000023210355073d2fdc1b90c3d6a58505a620062651d8236a08e5252f40fe872ecdf90cffac000000004730450221009410903e2848cba96b8b69cfd459560d3446050c778cd7cc4e881ac68b7c31c902201703743a7f8fe8b1371f0072a2bfda25e2ce68c68aa65434531c716511151eb6" 15 | } 16 | -------------------------------------------------------------------------------- /tests/blocks/emercoin_mainnet_80312.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "a43347ea24a5318f351c99344c5302f0362becc83c0741a4952f16af99d1d1a1", 3 | "size": 455, 4 | "height": 80312, 5 | "merkleroot": "4f3cd539639fcdae1746962e59c69472f276915cc8372ce4b66995aa66edaeea", 6 | "tx": [ 7 | "73bb705dd47369cfdacc28277f2c15ab8132e9b7e3fe8b1ccff2085aa86ab171", 8 | "43b5c1df58c047c5744253d7deb3eca213f4a6a6292eba01bcf0a37e57b558aa" 9 | ], 10 | "time": 1421971102, 11 | "nonce": 0, 12 | "bits": "1c2fff64", 13 | "previousblockhash": "a98bcab52484bbef6b775cefc2bf05d413c868fe08c4bd60775ca30310b7bb8a", 14 | "block": "010000008abbb71003a35c7760bdc408fe68c813d405bfc2ef5c776befbb8424b5ca8ba9eaaeed66aa9569b6e42c37c85c9176f27294c6592e964617aecd9f6339d53c4f9e8ec15464ff2f1c0000000002010000009e8ec154010000000000000000000000000000000000000000000000000000000000000000ffffffff0f049e8ec15402e200062f503253482fffffffff0100000000000000000000000000010000009e8ec154012dc1ac382b63ae8643661e09d6cd4000860ef347089dc32a8a54faa2dda730270100000048473044022077f8529c99913589961bb5934ea2dcba8ee3229b220e53c29d0003d80eaf8f99022071d331d092c8c69f114ee9676f2f22134e6515bf178c58aef422eebf629f5bb601ffffffff030000000000000000001097237b000000002321035f85c7b5fca2dbb7b92d3c37fd17d785e7a667fa7a061eda9136afde92160dcbac1097237b000000002321035f85c7b5fca2dbb7b92d3c37fd17d785e7a667fa7a061eda9136afde92160dcbac0000000046304402202c23574792d538607f718066a0d7aa4d373c39b80b1191d70b30e4993fe5a52a022078b4614c56b921d811065baf149476f3d9c3c49b3c66ee12cf2c4636cf0e74d8" 15 | } 16 | -------------------------------------------------------------------------------- /tests/blocks/bitcoingreen_mainnet_10000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "341452fa379115e62c7b27f9c86376ab8b7aabc4e39337765595edcb97d77930", 3 | "size": 462, 4 | "height": 10000, 5 | "merkleroot": "fe847fdcf26d67b424959c6a9117bb54187eb661653bf2a208b5285eed239195", 6 | "tx": [ 7 | "705e9918f8cb302b9c498396b89f61ce111830512a2809ef2febc315797f777f", "07d211091b51a1e2975ee07ba4933fa59f7aeda0818907bae3a7c497461b5f48" 8 | ], 9 | "time": 1517539297, 10 | "nonce": 0, 11 | "bits": "1b638c5b", 12 | "previousblockhash": "7a9045c58a85b6d6a959721aef60ce5963897559a423e0e17ac1d34508a2ee53", 13 | "block": "0400000053eea20845d3c17ae1e023a45975896359ce60ef1a7259a9d6b6858ac545907a959123ed5e28b508a2f23b6561b67e1854bb17916a9c9524b4676df2dc7f84fee1cf735a5b8c631b000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff050210270101ffffffff0100000000000000000000000000010000000145ecb9083be84c146b1c96b88bf5157fe1771f7d6739bd137855c268e03da4c3020000006b4830450221009b4f8a1c8968c77192d38a538764a1fa5b33f9aef60e85c2157271759008033702202673c800cf8ce94259c0a06b9b093c9d1a716477ef9a1cb7c49c3c73ce7bbd880121023df508324112d8aa326d0539d741bf5f1f9dfc37d9f62b9b4574d76a1bd9600affffffff03000000000000000000005ed0b2000000002321023df508324112d8aa326d0539d741bf5f1f9dfc37d9f62b9b4574d76a1bd9600aac80e9fd97000000001976a914ee49dbdba7d30e659b93dde35d52c961ecbd186b88ac0000000046304402200320cb9881b72a30e81f5b2bfddc5bc404a3af8ef9220da8314896d7d025b5a0022070d9438034f84550b3a42fcaf86e7d186634956668b07702fa62d9db05b89366" 14 | } -------------------------------------------------------------------------------- /tests/blocks/pivx_mainnet_1000000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "bb6127b99bf96b150c86ac38fde17c47d6c95b460c462ef45fd5043a44479068", 3 | "size": 461, 4 | "height": 1000000, 5 | "merkleroot": "ecafe8267cbc5e4b6f4aec0978b02f0ba47a19828b0f8780e25685184d61c9e2", 6 | "tx": [ 7 | "290871d1dc1673069a4c3efef424278b377becbff0c776e20972d212daa4a3d4", 8 | "e217611a8db9ec5994632e1f66727c53e0ba09c406f6c993c8d52f5474efe620" 9 | ], 10 | "time": 1516510311, 11 | "nonce": 0, 12 | "bits": "1a7128a9", 13 | "previousblockhash": "795ab132be197a0a173cbe3590660235d906e0011052a10206244e0eae4b5152", 14 | "block": "0400000052514bae0e4e240602a1521001e006d93502669035be3c170a7a19be32b15a79e2c9614d188556e280870f8b82197aa40b2fb07809ec4a6f4b5ebc7c26e8afec671c645aa928711a000000004ff5c33f2832ca5fa5ecbefb33c068e32ad0ae6e47c71be916fc34615c299b8c0201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff060340420f0101ffffffff01000000000000000000000000000100000001eb79b426b80013c330e13e49764deeba311f8be69d0ec117d5b4f11d72215f3e0100000049483045022100f495580e30a64b4945582fe3e9a9118a60b53ca22c44232c170ff99a9fa7e8210220712921e4ddda1afe47b2481f2d1512759aaa0ab584f16ffe4b28771437c716be01ffffffff03000000000000000000500ae8470c0000002321037e0b96219461080ce2f837825fd3c52b08199c404a0d6d59f026a6a890dc4b15ac808ef20d000000001976a914f0364dfac5fca72abd79085c6b00f9e8f35bbff688ac0000000046304402203b270304b2fa14362d9718c16bf20e5c6ede49abfa7fe5fc5326b9f598d592d402203b32fda981ead1df35aebc1eca9b4766555dd2f200538f6b3d62d6ccc5180aa7" 15 | } -------------------------------------------------------------------------------- /tests/blocks/bitcoinplus_mainnet_749740.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "b51b081592349793bbf2d761828aabef40db8c7dd9451f0a0ea279faec1aecaf", 3 | "size": 456, 4 | "height": 749740, 5 | "merkleroot": "cddd323b42891a0787389d40ea0971fbf4b0215ca40fc0229e94edf486eeb1dc", 6 | "tx": [ 7 | "03079ad8d2c3e9db200582e7f3addec3f663c1388ea565482f6140ed58e83f1a", 8 | "6805f87aa7027c84db875d7147696dadd998cf261237bac4a3229e0d7d35c104" 9 | ], 10 | "time": 1544168075, 11 | "nonce": 0, 12 | "bits": "1e0cd5ed", 13 | "previousblockhash": "d86428d967a901e169de1313276f2d463664179e5a7f303923811d1c4a177102", 14 | "block": "030000200271174a1c1d812339307f5a9e176436462d6f271313de69e101a967d92864d8dcb1ee86f4ed949e22c00fa45c21b0f4fb7109ea409d3887071a89423b32ddcd8b220a5cedd50c1e0000000002010000008b220a5c010000000000000000000000000000000000000000000000000000000000000000ffffffff0503ac700b00ffffffff0200000000000000000000000000000000000000000000010000008b220a5c015186024f3de419c8846da76a254930f9b5d68246eb21b1aceca5ba889a190ba30100000049483045022100d81ae320b3f1a296cae778b342937412cc4689f375d5dfc594c1df7fac6aa046022015c71b090e85579f041ae31c6d1881959414231882648b0878a886ba8b8b2a5a01ffffffff03000000000000000000408491a400000000232102eeb314d0ae50152e8f416521b0f3184325f57d8c7932d6a91d186fa2820d3da7ac56aca7a400000000232102eeb314d0ae50152e8f416521b0f3184325f57d8c7932d6a91d186fa2820d3da7ac00000000473045022100c4a62b764a0984e6e2f909ca41b21f61b17f230d60f6c2ba69cb504300931bc202200aa57659cf8c54861002ca924b018385aa3a44c4ff0bc9207ddecc3b8086f76e" 15 | } 16 | -------------------------------------------------------------------------------- /tests/blocks/bitcoingold_mainnet_80000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000000000043a8c0fd1d6f726790caa2a406010d19efd2780db27bdbbd93baf6", 3 | "size": 373, 4 | "height": 80000, 5 | "merkleroot": "8fb300e3fdb6f30a4c67233b997f99fdd518b968b9a3fd65857bfe78b2600719", 6 | "tx": [ 7 | "c06fbab289f723c6261d3030ddb6be121f7d2508d77862bb1e484f5cd7f92b25", 8 | "5a4ebf66822b0b2d56bd9dc64ece0bc38ee7844a23ff1d7320a88c5fdb2ad3e2" 9 | ], 10 | "time": 1284613427, 11 | "nonce": "00000000000000000000000000000000000000000000000000000000572fe301", 12 | "bits": "1b5bede6", 13 | "previousblockhash": "00000000001937917bd2caba204bb1aa530ec1de9d0f6736e5d85d96da9c8bba", 14 | "block": "01000000ba8b9cda965dd8e536670f9ddec10e53aab14b20bacad27b9137190000000000190760b278fe7b8565fda3b968b918d5fd997f993b23674c0af3b6fde300b38f000000000000000000000000000000000000000000000000000000000000000033a5914ce6ed5b1b01e32f5700000000000000000000000000000000000000000000000000000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704e6ed5b1b014effffffff0100f2052a01000000434104b68a50eaa0287eff855189f949c1c6e5f58b37c88231373d8a59809cbae83059cc6469d65c665ccfd1cfeb75c6e8e19413bba7fbff9bc762419a76d87b16086eac000000000100000001a6b97044d03da79c005b20ea9c0e1a6d9dc12d9f7b91a5911c9030a439eed8f5000000004948304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d1090db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501ffffffff0100f2052a010000001976a914404371705fa9bd789a2fcd52d2c580b65d35549d88ac00000000" 15 | } -------------------------------------------------------------------------------- /tests/blocks/bitcoinatom_mainnet_586900.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000000000000000da3df1b019576a00d93974818b392b4c1a0a15f3df7c66fb", 3 | "size": 510, 4 | "height": 586900, 5 | "merkleroot": "296a6318fb26dd39534acbe2f2c4cd82d0a9ce00d727d37deb0684748f7b73a7", 6 | "tx": [ 7 | "31417678bfbfb9784494974a1b5a7fc5b072c2fc1077f7951158cba43452d0af", 8 | "253b8c15e7d5449dd604f07b5923a59ea35c6d0db0c0603497fec51cac317533" 9 | ], 10 | "time": 1518611740, 11 | "nonce": 2909803309, 12 | "bits": "1903fffc", 13 | "previousblockhash": "0000000000000003060c045d260d64f50cbd03f827630974fc7686d7b0ed002f", 14 | "block": "000000202f00edb0d78676fc74096327f803bd0cf5640d265d040c060300000000000000a7737b8f748406eb7dd327d700cea9d082cdc4f2e2cb4a5339dd26fb18636a291c2d845afcff03192d1370ad000000800201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff200394f408041c2d845a0877ffb4bff7f26d020d2f6e6f64655374726174756d2f00000000020000000000000000266a24aa21a9ed370b337f1e15c7e0159715ea1707ec27b4a123f1a8810ad88e3b24ae412cd764288e814a000000001976a9143c0b217ab4208ab437dfc49c96d7d6f9e6608c2788ac000000000200000001af692cd7d8192a3b80f405e528d4cb4bc49efcad44c6d290a11cd21134a3bb82010000006a4730440220721a2935cc808b96ab20685c4bff77a1c253c5827c9fec4e7a54f2170c44870e02203fd847b15b449f3154acad12ed2f1d29b067cf73640e678a4b847d851441f4b0412103e0d0b2ea7fe2b07a3e26957a995190e4cbbd590653c8b118e161bcbcdbf52c4cfeffffff021d1db709000000001976a914035e3987787b71e772366787e087c8e9351dd1a888acb6d84c00000000001976a9143acea32e9ebc212a858c28a9624fb8924f35d8f288ac93f40800" 15 | } -------------------------------------------------------------------------------- /tests/blocks/namecoin_mainnet_19204.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000000000000122ff239e71146bf57aee28ad913931d672cd124255e91351660", 3 | "size": 475, 4 | "height": 19204, 5 | "merkleroot": "45d5bc5330dad21dd4dcf0daadefef4ba826fe81e2dd2fa38a4a49ea06c97b1d", 6 | "tx": [ 7 | "7752b6a596641bd90ae71d1bc054f3dd1ad36ce3fe7e7d3292ff8594feafb8a9", 8 | "499dad7cd9e737c9f2f10bc4b3930b566d82288a8c02b68a50d2cf2694868bdd" 9 | ], 10 | "time": 1318073606, 11 | "nonce": 3373003561, 12 | "bits": "1b00b269", 13 | "previousblockhash": "07d6d85d2f33fae0b52d84a90757d1600fdb3f2cf2f31f2a32eef59172245af6", 14 | "block": "01000100f65a247291f5ee322a1ff3f22c3fdb0f60d15707a9842db5e0fa332f5dd8d6071d7bc906ea494a8aa32fdde281fe26a84befefaddaf0dcd41dd2da3053bcd5450635904e69b2001b29f30bc90201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff080469b2001b027829ffffffff0100f2052a0100000043410439cf5bc2e4b0d555178b3d19fa82d59aa998cc082086f874928af6e70c1093b300b6371d093ac9d41393e11907ed17d2489405e220a6f08feeecbce9f6cfcc0bac00000000010000000148efa1ba7512bbd538033b798da1064e724e21739f6bd8ea0c28e3d0d53136d6010000008c49304602210095cf1a495623ed7794746b7b0f2daa70a9783f635e24991487e8a6869b553c9b0221009dec7919115c3a84f03236c8aea6e175e8dd9ee3a6daa1f6c56ac1d6246ec5da014104d483cffe3907aefdb9a20dab73dd4c83f6d14d26bd9d21aeccd33b0be2068e4832fea66110606198728413ad88a6dd642bdd6ff72aefd79732a2375c3129f1fcffffffff0220ab6136000000001976a9141b5a80636dfa8c4e78c1d1150a2ba961d704911388ac0065cd1d000000001976a9143f47c122f3a71e70cb3a4c9d215e5ce7b740b96a88ac00000000" 15 | } 16 | -------------------------------------------------------------------------------- /tests/blocks/exos_testnet_60000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "1e4447195f4259b313b2c56072f7000237828e659254d5bf55f2b91e443f124b", 3 | "size": 401, 4 | "height": 60000, 5 | "merkleroot": "9cf808c8f0e0d62864edee37a27fc44114a8896a6ace0c4ac6434c58e0d450ef", 6 | "tx": [ 7 | "b3e734e183f1b4f10cc3de258d02efbd73fc64577e9c5fc54f7d750b95b29aff", 8 | "859a989109ee967e941808a43224463e181b51af8acc27ad05e2e4f7fdf45f81" 9 | ], 10 | "time": 1537111488, 11 | "nonce": 0, 12 | "bits": "1b00ffff", 13 | "previousblockhash": "4f57fffd01fabbf020ac9e2110b4de9e127c06ba19f83741a5cb26f3b0aa13fe", 14 | "signature" : "304402201d89a82d54b81e3aa0de97875bb15a874fce3319c7baf1751d18620f905909dc02202fc3fe4c17ef43aaa62dab4a6e0c735751d75b8f66e2a81cbead52f744570769", 15 | "block": "07000000fe13aab0f326cba54137f819ba067c129edeb410219eac20f0bbfa01fdff574fef50d4e0584c43c64a0cce6a6a89a81441c47fa237eeed6428d6e0f0c808f89cc0759e5bffff001b000000000201000000c0759e5b010000000000000000000000000000000000000000000000000000000000000000ffffffff040360ea00ffffffff010000000000000000000000000001000000c0759e5b0143723908791e72544c4796be9da581a40eae3ba54b71b596d167f6ab245b37d60100000049483045022100d11ebd7ac7d0dd94f22416a1b223cf91cf1a70de52b2cd502edc1121c4d5409302207e22f22add1dd96bd214ca0f8875e4f06d9688c27053db82ea0ae0e9676d575401ffffffff02000000000000000000c05469f60300000023210288e5256969a3a9fd4735e6b8c8f905b270564f2448658177faf4c990e5745c45ac0000000046304402201d89a82d54b81e3aa0de97875bb15a874fce3319c7baf1751d18620f905909dc02202fc3fe4c17ef43aaa62dab4a6e0c735751d75b8f66e2a81cbead52f744570769" 16 | } 17 | -------------------------------------------------------------------------------- /tests/blocks/iop_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1d00ffff", 3 | "chainwork": "000000000000000000000000000000000000000000000000000003e903e903e9", 4 | "confirmations": 194703, 5 | "difficulty": 1, 6 | "hash": "00000000ae544fca5adedfd03bfb219801d2c817f1c5399678c4418db36d4350", 7 | "height": 1000, 8 | "mediantime": 1476022083, 9 | "merkleroot": "9602ebeebf37867029a324c58b29238fc0a7b78675613014dd70cae9fcd5af72", 10 | "nextblockhash": "00000000e833c4f328806e0675d7f2223922930f3357ae24fc1d65baac064c31", 11 | "nonce": 19285, 12 | "previousblockhash": "00000000d28078cc5893f35040809f4b3a2e047439ee3b82b0463c486e08a3ff", 13 | "size": 300, 14 | "strippedsize": 300, 15 | "time": 1476024789, 16 | "tx": [ 17 | "9602ebeebf37867029a324c58b29238fc0a7b78675613014dd70cae9fcd5af72" 18 | ], 19 | "version": 536870912, 20 | "versionHex": "20000000", 21 | "weight": 1200, 22 | "block": "00000020ffa3086e483c46b0823bee3974042e3a4b9f804050f39358cc7880d20000000072afd5fce9ca70dd1430617586b7a7c08f23298bc524a329708637bfeeeb0296d559fa57ffff001d554b00000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff6a4730440220751e4d99e9795221b47cb2d13b35946220bf9f527cc0fdea8da2c099461badcf02201d5d598ddeadc0d62d2684bdb9865d879258bb4823642af622dbf6155eb167ad0121037979020e29bab721b3ab56ee41a8c105be3195a727222e995f6a8f93f207420bffffffff0200e1f50500000000232102895de2425c0ac119ba8ac728381a669b7d53838c7fa786a803b969fcd4b9a216ac0000000000000000096a046253ec4902121700000000" 23 | } 24 | -------------------------------------------------------------------------------- /tests/blocks/donu_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1e00cf7e", 3 | "chainwork": "000000000000000000000000000000000000000000000000000000012fbb989d", 4 | "confirmations": 112703, 5 | "difficulty": 0.004819385024850333, 6 | "hash": "3fcd3c65cad21bbf4f9e3ad32f0fab6ebee4d003052fc37e41272a166269fcee", 7 | "height": 1000, 8 | "mediantime": 1563331262, 9 | "merkleroot": "19e7a180fe9f732abd86db23831d772c0b2f9f789c911f129fea1f8343c79adf", 10 | "nTx": 1, 11 | "nextblockhash": "8cba1c5056da53b5a42d0206853c178d9a833cd017f0d6002585d43c3b8c5197", 12 | "nonce": 1147847, 13 | "previousblockhash": "5d66d0c8b38ccad92c128a9e04953b3d88dd02755312f1438c59c0dde431a4fc", 14 | "size": 288, 15 | "strippedsize": 252, 16 | "time": 1563331593, 17 | "tx": [ 18 | "19e7a180fe9f732abd86db23831d772c0b2f9f789c911f129fea1f8343c79adf" 19 | ], 20 | "version": 536870912, 21 | "versionHex": "20000000", 22 | "weight": 1044, 23 | "block": "00000020fca431e4ddc0598c43f112537502dd883d3b95049e8a122cd9ca8cb3c8d0665ddf9ac743831fea9f121f919c789f2f0b2c771d8323db86bd2a739ffe80a1e719098c2e5d7ecf001ec783110001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0502e8030127ffffffff0300b4c404000000001976a914209bb33238f7fbe0068c27240091294fe749841288ac002d3101000000001976a914209bb33238f7fbe0068c27240091294fe749841288ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000" 24 | } 25 | -------------------------------------------------------------------------------- /tests/blocks/bolivarcoin_mainnet_500000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000000000000b9dfa8f44b5a56041a6b4d3370a61f3074f18f9eab5675f3ce9f", 3 | "confirmations": 56493, 4 | "size": 423, 5 | "height": 500000, 6 | "version": 2, 7 | "merkleroot": "388d067407c3e228d2a1699af1f6118722e7f45522daa97dd258f4472013fb30", 8 | "tx": ["bfb870ffdb5d176fe054163f059a4e5175d69df7dadac12853ee216093317c6c", "5c379e96e10e68174da4afcda015bc82d8c03387e9f824e04e6aaabb4d79f408"], 9 | "time": 1543531308, 10 | "nonce": 3033454746, 11 | "bits": "1b020838", 12 | "difficulty": 32249.81798522, 13 | "previousblockhash": "000000000000f7cea54210135a9c89eead3d0d0a0ebe7eb7efb7a13fa4a2da2a", 14 | "nextblockhash": "00000000000004c8b97e38733e408015c2f2646714b63483304bba63b52c5184", 15 | "block": "020000002adaa2a43fa1b7efb77ebe0e0a0d3dadee899c5a131042a5cef700000000000030fb132047f458d27da9da2255f4e7228711f6f19a69a1d228e2c30774068d382c6b005c3808021b9ad8ceb40202000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1f0320a107062f503253482f042c6b005c0881000161bc0000007969696d70000000000001807c814a000000001976a91436e83f1c5aadb907b295b373f121542ce53ae26b88ac000000000100000001247ca95b435fd5ccffc0b7a584d2b4add0b27ff6b344f69d6296dfde98a4975d010000006b483045022100e53a43841194f7778ea7d5ef050087c77f19aaa19f0212d47fe54130e5a575ca02200c849e251d6008e7a381636db3627d2a5980a709e9e97ce0ddf4195cb9b16e31012102a34a68a5959d6dd1d37a30e08828dc90880e2da9ab98d5070b06a4d4c77d2e28ffffffff029cbfbb01000000001976a914a8dbb38f4b49423ece34d33c7186358d4e663fe888ace4f22a0d000000001976a91463762453311c1477c2c9164992a4a013cc7fd8f188ac00000000" 16 | } 17 | -------------------------------------------------------------------------------- /tests/blocks/bitcoinatom_mainnet_586956.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "27b7efad91a595c0717a2e9fc4fb252545000c18a6610130d15382be83c402e3", 3 | "size": 541, 4 | "height": 586956, 5 | "merkleroot": "81aa679f1878a93367dad062c8a6964847881260c19320b4e3664c63deabac7f", 6 | "tx": [ 7 | "789dda752eecf22056a93e8bcdf89eb31ac8102485124a7488fa0472250ac382", 8 | "0f35c0b9bbf661787bfc920b5f4571440602e5723144c10b8fa5629dc3279abf" 9 | ], 10 | "time": 1518630315, 11 | "nonce": 0, 12 | "bits": "1d00ffff", 13 | "previousblockhash": "0000000000000002c32c76bc7971dd10adf28abd4ff45c1b23c5b74d0265ffcc", 14 | "block": "00000020ccff65024db7c5231b5cf44fbd8af2ad10dd7179bc762cc302000000000000007facabde634c66e3b42093c1601288474896a6c862d0da6733a978189f67aa81ab75845affff001d00000000010000800202000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0603ccf4080101ffffffff02ca000000000000002321034055f219c9619e18ef193c0def3e43ebffea827c950f0e78ee8f146b9f4c8102ac0000000000000000266a24aa21a9ed164fe82b7473bf82cfdd7c28f90668f9fe78200022bafe159f293b4fe5e10832000000000200000001bef5797f980f07ba3bc619d2eef2ad728737709a747c4adf477dfb05186e7fe2010000006a47304402201fbef43b1877a013291effd9d9da882d128109d89db28ddd96f0bcb65ac4aab002206893640e754a9d147355474229af237581956fa191cb806648744e2d6ba989664121034055f219c9619e18ef193c0def3e43ebffea827c950f0e78ee8f146b9f4c8102ffffffff01b67b814a000000002321034055f219c9619e18ef193c0def3e43ebffea827c950f0e78ee8f146b9f4c8102ac000000004630440220413932292b5e1cc5ae8cc019b11e5db7ec4432d260e8fee0f9c0a195a5aec28902204a90b318cb1b4f77ebd678db45fc0fce5ab3f0cc2d89aacaa523d8b6cd82f29e" 15 | } -------------------------------------------------------------------------------- /tests/blocks/pac_mainnet_27676.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "00000000000001439cf3d3b09f067a600d10cbe8b532e14413c904ae17bccd49", 3 | "confirmations": 39839, 4 | "size": 456, 5 | "height": 27676, 6 | "merkleroot": "cffe89f39de2f101d6e2509b1f5121609c369c8e4ac0152252cb0cc18c613603", 7 | "tx": [ 8 | "d4426bc2597439f509e685848dbc5272b2d52e882e2b6cf4910971062e130dd6", 9 | "7f8761bdd82d6cf4b976008c533ae56c2f6c8f49b67597067dc156871fc40a4f" 10 | ], 11 | "time": 1520767916, 12 | "nonce": 2372120537, 13 | "bits": "1a03d789", 14 | "previousblockhash": "00000000000003b32ed577c591f6e60eb7b534f61ebdcc9f5fd28d2386e8f391", 15 | "nextblockhash": "000000000000017f3d0fe299f7a52cee98a46be48c853ff8197fd78340cbfcd8", 16 | "block": "0000002091f3e886238dd25f9fccbd1ef634b5b70ee6f691c577d52eb3030000000000000336618cc10ccb522215c04a8e9c369c6021511f9b50e2d601f1e29df389fecfac13a55a89d7031ad9af638d0201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1f021c6c04ac13a55a083ffffbbdb14c01000d2f6e6f64655374726174756d2f0000000002631e0b75700000001976a91489982fec237dfd38a42de5900c95b6deed54dad988ac7f027c96900000001976a9143b39725cff6ae6228194e15ad817976dbbc581e588ac00000000010000000178d66e9ffd71fc5edf9ac6bbffecbcf57d26c090e157b48f231fed89002dd217000000006a47304402205d1b6d24615cb924c38686e87319ec4282434368f6bc0881a94f8d22f980ca18022038b83b016e19c6fbccedef66c5eb73147119cb1cd93dacfdd3d42f647575ed30012102171a4f5763f91281a4ee4775d2e01d81f5c1ccddf2a05662b9682f84bf09ac93feffffff0260bf570b000000001976a91489dd6e460e00695b55b710d62b2e1fb815d44b6588ac1e6bb32d350000001976a91495f95b4a02171deca1046cf5c505aa3ea57216da88ac196c0000" 17 | } -------------------------------------------------------------------------------- /tests/server/test_notifications.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from electrumx.server.controller import Notifications 4 | 5 | 6 | @pytest.mark.asyncio 7 | async def test_simple_mempool(): 8 | n = Notifications() 9 | notified = [] 10 | async def notify(height, touched): 11 | notified.append((height, touched)) 12 | await n.start(5, notify) 13 | 14 | mtouched = {'a', 'b'} 15 | btouched = {'b', 'c'} 16 | await n.on_mempool(mtouched, 6) 17 | assert notified == [(5, set())] 18 | await n.on_block(btouched, 6) 19 | assert notified == [(5, set()), (6, set.union(mtouched, btouched))] 20 | 21 | 22 | @pytest.mark.asyncio 23 | async def test_enter_mempool_quick_blocks_2(): 24 | n = Notifications() 25 | notified = [] 26 | async def notify(height, touched): 27 | notified.append((height, touched)) 28 | await n.start(5, notify) 29 | 30 | # Suppose a gets in block 6 and blocks 7,8 found right after and 31 | # the block processer processes them together. 32 | await n.on_mempool({'a'}, 5) 33 | assert notified == [(5, set()), (5, {'a'})] 34 | # Mempool refreshes with daemon on block 6 35 | await n.on_mempool({'a'}, 6) 36 | assert notified == [(5, set()), (5, {'a'})] 37 | # Blocks 6, 7 processed together 38 | await n.on_block({'a', 'b'}, 7) 39 | assert notified == [(5, set()), (5, {'a'})] 40 | # Then block 8 processed 41 | await n.on_block({'c'}, 8) 42 | assert notified == [(5, set()), (5, {'a'})] 43 | # Now mempool refreshes 44 | await n.on_mempool(set(), 8) 45 | assert notified == [(5, set()), (5, {'a'}), (8, {'a', 'b', 'c'})] 46 | -------------------------------------------------------------------------------- /tests/blocks/exos_mainnet_50000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "596b9249ffd6c1dfb3cfa16d3ade2e0cb57342fed66b90e6444dc54cc99d0fc4", 3 | "size": 445, 4 | "height": 50000, 5 | "merkleroot": "8db60d963dad433c8655021d291aafd731a6754aac9b69cf0dece61e5b3c1b75", 6 | "tx": [ 7 | "364c947002496d3115379dd779e2ce54cf114fb6cca42bd3da4de1823e4f08cc", 8 | "a09b658cbe21162bbeb1821e2caf1f0947f8cdd517b87f2232ba1150043790e1" 9 | ], 10 | "time": 1526710352, 11 | "nonce": 0, 12 | "bits": "1a7b61c6", 13 | "previousblockhash": "44530f8cc7040528199dc3a41a8b660bf2feb8e0015d5c787086655ac03cbca3", 14 | "signature": "30440220710162172b283cca7007c72cbb848a52388518b8cfb7a6c906744f473afe312b022056fd92b06351ee7049f0857d688134449566dcb82d0f6a3cb36208832988cba3", 15 | "block": "07000000a3bc3cc05a658670785c5d01e0b8fef20b668b1aa4c39d19280504c78c0f5344751b3c5b1ee6ec0dcf699bac4a75a631d7af1a291d0255863c43ad3d960db68d50c0ff5ac6617b1a00000000020100000050c0ff5a010000000000000000000000000000000000000000000000000000000000000000ffffffff040350c300ffffffff01000000000000000000000000000100000050c0ff5a017879028fc93da2d5ce18feee9f074086790d34c97ccfafe15a42b2423f3e28490200000049483045022100e3a092a079346179213d9b7079c9795e291883cb715e3efee656b9a981632432022002cafb6d6d497705f455b5d6a60bca38c88c26910101faef433ecfe80515e1ef01ffffffff03000000000000000000c07975296d000000232103c0c30d173c8478ceaaba836e8cae3c8c4e43f88f6d555600be124781b533956bacc07975296d000000232103c0c30d173c8478ceaaba836e8cae3c8c4e43f88f6d555600be124781b533956bac000000004630440220710162172b283cca7007c72cbb848a52388518b8cfb7a6c906744f473afe312b022056fd92b06351ee7049f0857d688134449566dcb82d0f6a3cb36208832988cba3" 16 | } 17 | -------------------------------------------------------------------------------- /tests/blocks/emercoin_mainnet_357826.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "3547b7602c258ecbcc41add2a88ae7a17ba4ba652738665f2d251721f5ef5c10", 3 | "size": 529, 4 | "height": 357826, 5 | "merkleroot": "e3006f819f8d63d775fb9768c79459020af2476378038582ae84b161a0ba0acc", 6 | "tx": [ 7 | "9a5459ab695dc33350fe8cda07e0e7d0785a8ffd15ab15ce24e71b7c29032ac0", 8 | "478e827fd064766f3ffd4a48d66436d3f5b4067d8f23eb61138e9d79b2b44c0e" 9 | ], 10 | "time": 1559191908, 11 | "nonce": 0, 12 | "bits": "1c0bd7cd", 13 | "previousblockhash": "7a6ca59966f6c64c63e3a7368e69d802bcce24bb4e52f4913e38440ec4511599", 14 | "block": "08009a02991551c40e44383e91f4524ebb24cebc02d8698e36a7e3634cc6f66699a56c7acc0abaa061b184ae828503786347f20a025994c76897fb75d7638d9f816f00e36461ef5ccdd70b1c0000000002020000006461ef5c0001010000000000000000000000000000000000000000000000000000000000000000ffffffff0603c275050101ffffffff020000000000000000000000000000000000266a24aa21a9edcb3fd1d48b60833fd11082400a3b11380cd784beee5e34ec04edb76d9839212e0120000000000000000000000000000000000000000000000000000000000000000000000000020000006461ef5c0143c349bfe857bb2d6277d01f554d2e716420896d18a2468b4fb92dc608b73d860100000048473044022041f43ec86d25cbe2a1e768e20b3dfe1cb4268e12c2c128632a42fd87f308e2a302206f87ce19fe4b2c71f77cbe651cde44df12966b84367e7a3f20bd0bb586672ffa01ffffffff03000000000000000000041eb01e00000000232102a7a1a6520b42f10f17a9c5aae2b8f6e24c7d5c4cdef7d7abcfe54bf71ddec72facd410510b00000000232102a7a1a6520b42f10f17a9c5aae2b8f6e24c7d5c4cdef7d7abcfe54bf71ddec72fac0000000046304402203f9b16d59876626514326d01cad088cc3763cfa90172afd57b4c5716b8d63fa702203fb45c154c1b4158070d6bcdd62a14258d3e218663b298d5be2bafa0d03acdf3" 15 | } 16 | -------------------------------------------------------------------------------- /tests/blocks/ravencoin_testnet_100000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000000bb2c1bc93f4d14ce74b0cb62d5e05cc08e50be417e628b7c87aa33f942", 3 | "confirmations": 184332, 4 | "strippedsize": 229, 5 | "size": 265, 6 | "weight": 952, 7 | "height": 100000, 8 | "version": 805306368, 9 | "versionHex": "30000000", 10 | "merkleroot": "1e6c608cc6822d73a6fdc2721f66b187417a72de1b51fc92c732811b3d94964e", 11 | "tx": [ 12 | "1e6c608cc6822d73a6fdc2721f66b187417a72de1b51fc92c732811b3d94964e" 13 | ], 14 | "time": 1576410879, 15 | "mediantime": 1576410340, 16 | "nonce": 2869091, 17 | "bits": "1e020be8", 18 | "difficulty": 0.001908709318147927, 19 | "chainwork": "000000000000000000000000000000000000000000000000000055349924b5c0", 20 | "headerhash": "1ab6cceaed4853b43bcbb5c50259b8b3202deb1467feec2853868a514ff3fe70", 21 | "mixhash": "0000000000000000000000000000000000000000000000000000000000000000", 22 | "nonce64": 0, 23 | "previousblockhash": "000000e5ca4a25076008e092367fe8407e6d71559bac7f7fb7f165c523a0f16c", 24 | "nextblockhash": "000001d758149fa6150c2ec03aa9c1abe508e0b6969d3fe73f9fdb195401e738", 25 | "block": "000000306cf1a023c565f1b77f7fac9b55716d7e40e87f3692e0086007254acae50000004e96943d1b8132c792fc511bde727a4187b1661f72c2fda6732d82c68c606c1eff1ef65de80b021e63c72b0001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0603a086010101ffffffff020088526a74000000232102e955b24f14d5b6b1565284f3f8a6cf35969046d35a9b3ba1067cad31005e6259ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000" 26 | } 27 | 28 | -------------------------------------------------------------------------------- /tests/blocks/myce_mainnet_710000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "6bf18c06e6aef68b04b2768867ddf8b227449ad0bc596070f00efeb5dbc67022", 3 | "size": 429, 4 | "height": 710000, 5 | "version": 9, 6 | "merkleroot": "d6ec61592540184d9bd10b676ed8f7e3faa54c028a9a6f96c0e5549e208e5312", 7 | "tx": [ 8 | "124fdf0bbc71b0f46516223298b86cbb366dd8b209509fb53e9c63a66a9af4d1", 9 | "2beacd9f483e5cea74da90d57a8e061cd63ca82ce277926feda7026546fe008c" 10 | ], 11 | "time": 1559855502, 12 | "nonce": 0, 13 | "bits": "1d251585", 14 | "difficulty": 0.02696535177573847, 15 | "chainwork": "000000000000000000000000000000000000000000000019c39c3ca805670cd5", 16 | "previousblockhash": "f2f114a7e86bc4206c4da4bcc21aebe2f31798362720b9a6c017d166479d6a51", 17 | "nextblockhash": "61ccc10b583c9b23091398b24877ae2eafccc78ef88967ed12a75ccd49c00814", 18 | "block": "09000000516a9d4766d117c0a6b92027369817f3e2eb1ac2bca44d6c20c46be8a714f1f212538e209e54e5c0966f9a8a024ca5fae3f7d86e670bd19b4d1840255961ecd68e81f95c8515251d000000000203000000010000000000000000000000000000000000000000000000000000000000000000ffffffff060370d50a0101ffffffff010000000000000000000000000003000000014ff94bb3f4d3e464dc7a2b4eed036880dcbb0115cc065bece3433b36b3dc63ff01000000494830450221009a56fa7cb74211484637ce89725b91cca1ebadd4a93c607ee28d3b071be13e9b022077bc00625fee9e7b0578ab966564c03840f19748bf340fc8a67c340d8803a5d001ffffffff030000000000000000009981371b4b00000023210259cd61a5962fd375ccac514fcf976794fb86656f3ed343b5a28674d8a68855c2ac0008af2f000000001976a914b61d9e80b3ca66a79c867030a18f2f22a0ab24f988ac0000000046304402207fd3bd8bd350ed1819fcc4a045d90eb0e8b1f75a031524fd02627063736a4899022075a81334973d1794218f2a5547794b94a30eca136d301a51510db87cdff3b368" 19 | } -------------------------------------------------------------------------------- /tests/blocks/groestlcoin_mainnet_2000000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "00000000000434d5b8d1c3308df7b6e3fd773657dfb28f5dd2f70854ef94cc66", 3 | "size": 551, 4 | "height": 2000000, 5 | "merkleroot": "3219c39319362135080e89cca168dd1e145145a22baae2b3512e0c3fd386da77", 6 | "tx": [ 7 | "7a64cd89b9e0fd6b32be5deb349e460a90e6805278dee2fe301b347623f0806b", 8 | "89ff39e83636359bace69725fe19e1d33b16918205eaaf77c37684ac557e5154" 9 | ], 10 | "time": 1520891844, 11 | "nonce": 846303402, 12 | "bits": "1b14f5ec", 13 | "previousblockhash": "000000000011b76534c258708119c1448a74ce458f8d0b5e05958dd10529962c", 14 | "block": "000000202c962905d18d95055e0b8d8f45ce748a44c119817058c23465b711000000000077da86d33f0c2e51b3e2aa2ba24551141edd68a1cc890e083521361993c31932c4f7a65aecf5141baa90713202010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff4c0380841e04c4f7a65a08fabe6d6d33312d33302d383130325b6d36335b1b3691506e2a97a2c14df7e9bc6e94e540010000000000000060000413010200000d2f6e6f64655374726174756d2f00000000020000000000000000266a24aa21a9ed8dfe2e8f6eb7ff2d6e27732d11c6aaee5eab7d5ea67b6cf887ec9d4cd038e831a876cd1d000000001976a91442bbcfb1cd88dbbb4c56086f1d018f10a7ef760688ac01200000000000000000000000000000000000000000000000000000000000000000000000000100000001f7b346fc08b41de682b81b7ce729edb2aeddc2f587b759859031e3bf99e68779000000006b483045022100e00b07400fbe10ee9396242557026ff6d3e16ffb46add2ccc5d7ffd8ddbc1989022003cc6832c4d62e15478150748867ca71eca04655f4b2ce31773832353d571647012102d4ad38a64b4ec115a77a900d6fb7f44343aa761ab6fcf8b8613443fa7e24e5befeffffff026e539827000000001976a9145db12e800001e767f56a3dbb202d0666315d063288acb5162400000000001976a914bd7b0274f1ef4325d0e8e273ed5be328bc3d11d988ac4a841e00" 15 | } 16 | -------------------------------------------------------------------------------- /tests/blocks/myce_mainnet_341500.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "769f485854697c20088703e205017b96853f1a0bfbd288110bed45d39a3a60b4", 3 | "size": 435, 4 | "height": 341500, 5 | "version": 7, 6 | "merkleroot": "abb3cb9914b4f2737af1f2e0cf07710779798ef4d33bc1d68ca29de1eeae37a0", 7 | "tx": [ 8 | "7ad425173d5d06b7311768a5e92df028afc042134a820299aeebf53c6f5abbab", 9 | "c2f911bdb2c54babed5246cdc158d1ae4476bb56c63f4002600d28d1b6b1c115" 10 | ], 11 | "time": 1536377872, 12 | "nonce": 0, 13 | "bits": "1a52cc7e", 14 | "difficulty": 202623.232278631, 15 | "chainwork": "00000000000000000000000000000000000000000000000f50d15e43b4b0e049", 16 | "previousblockhash": "390f9714894676d115c7c628e51c4e19c9ed5e1c21731e8a55b47df28734a6e2", 17 | "nextblockhash": "57768c45fc2b5cec2061188bcc5f7a6c310a364827bd2652aa3238b88afc3804", 18 | "block": "07000000e2a63487f27db4558a1e73211c5eedc9194e1ce528c6c715d176468914970f39a037aeeee19da28cd6c13bd3f48e7979077107cfe0f2f17a73f2b41499cbb3ab1044935b7ecc521a0000000002010000001044935b010000000000000000000000000000000000000000000000000000000000000000ffffffff0403fc3505ffffffff0100000000000000000000000000010000001044935b015a41fb10e592107c8771c48e8953892a1e9712577aaf2c4d2587e00e50adc4c30100000049483045022100d3f39b0a909fb466999774eb266197229cdae8a38148a2ca17fe8bd86b77099802205f10346461b1b388308f763500bcb447451b80f41bcb9f8b8912723ee9096c2001ffffffff0300000000000000000000001c70af000000232102cdd566a2aeb6ba7bcf10be34b06e7abc4a6c1caff37ca091a7c4c2813a1be331ac00bca065010000001976a91413bbc57f041c647891de55f9cab25a943ce20b5588ac0000000046304402203a8768e5f32a1a2c57b97a04dfdc6a78a1378336f2f1bd1e0c0aab1f0ed915ee0220435d11dedb8c55e9014e29c433d0afbf6128348ba829dae49abc3ab8ec5b48e5" 19 | } -------------------------------------------------------------------------------- /tests/blocks/electra_mainnet_200000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "eb35558f177a902e165a54474bfd465c6fab11c4131fa9963cc224267bde1cb7", 3 | "size": 438, 4 | "height": 200000, 5 | "version": 8, 6 | "merkleroot": "3fe27f540667f559da14159ed95f51a990a80bc08a266a89338b02c211b8fe78", 7 | "tx": [ 8 | "7e5a915352a2941063a3cdb9319c2384857f7c3f97be68a0835a5fe8b2adc4e0", 9 | "3672944d4e16e8c76a09c8bb2cfbe5c8fdfdef3416b28e87359b6aa660059aca" 10 | ], 11 | "time": 1551967523, 12 | "nonce": 0, 13 | "bits": "1949405a", 14 | "difficulty": 58632371.88655923, 15 | "chainwork": "000000000000000000000000000000000000000000000184aa9c6381e7103e02", 16 | "previousblockhash": "b0d74219e3802621250af7ea50b858321fa360762bbaddf3968c1c044ba483e7", 17 | "nextblockhash": "4c1e839bcad65f4e7ea257db6169b5f025c13ac8f07825f70c93aa56d8cd0cb3", 18 | "block": "08000000e783a44b041c8c96f3ddba2b7660a31f3258b850eaf70a25212680e31942d7b078feb811c2028b33896a268ac00ba890a9515fd99e1514da59f56706547fe23f2325815c5a404919000000000207000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0603400d030101ffffffff01000000000000000000000000000700000001e01bde66c2b1fbf602c78ce2f43cbc53517d86b1caef3396962a881872c84bc4020000004847304402203bf1a143b384d257cf0f25803307c688fb09b1fdf57d310eea45beee8b6c85e002200dfef2703b80ccd6d7f30b32e702af7654d51f026dd1cd39f1cb8b25ce1b49ed01ffffffff03000000000000000000c02d08cdaa19000023210242a06ef798e2c434aba6fcdf5c30c80ce4382d722e19a4e85f91db67d6698b39acbf4c0dcdaa19000023210242a06ef798e2c434aba6fcdf5c30c80ce4382d722e19a4e85f91db67d6698b39ac00000000463044022055c7116568454603aa4529b399f2bcb50cb6e6ec9d64e1c8c95444fe1d38dca902202452c53ee34befaf525c5c91be465488c14a447838976a8f16255fc9bff6090e" 19 | } -------------------------------------------------------------------------------- /tests/blocks/simplicity_mainnet_1040000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "a8212fbda825a42ecd3a0d1251437626fbde53afc1ea4eea76d05b4898718a0f", 3 | "size": 441, 4 | "height": 1040000, 5 | "version": 536870912, 6 | "merkleroot": "a72e4d38041df2065a1d8523943e0e0aeb7a0e15d931feb4ec2e2525d9988f8d", 7 | "tx": [ 8 | "9d238b6afb4a3c6767e510d6278934169292dd2589bfea05bea509c27f4055bd", 9 | "9a02f1240a1347091b3d530fac4f889a49a7d3c85ebbb80509f13c71acd2e11c" 10 | ], 11 | "time": 1574635768, 12 | "nonce": 0, 13 | "bits": "1a032448", 14 | "difficulty": 5340049.590861406, 15 | "chainwork": "000000000000000000000000000000000000000000000c88128735f6b6caae3f", 16 | "previousblockhash": "e0cf7f7201fdcc1b5f30f57a64cb8be9889124bd230eca349c18b3c6a2f73c4b", 17 | "nextblockhash": "d3eb14aa9b8eec45b059ec189be270c0b8d58943e76a296eea18745fe01d843c", 18 | "block": "000000204b3cf7a2c6b3189c34ca0e23bd249188e98bcb647af5305f1bccfd01727fcfe08d8f98d925252eecb4fe31d9150e7aeb0a0e3e9423851d5a06f21d04384d2ea7f808db5d4824031a000000000203000000010000000000000000000000000000000000000000000000000000000000000000ffffffff070380de0f02c000ffffffff0100000000000000000000000000030000000100da81675dca6b9766faec59cc99e69cce6c4ddc9dc6afa8fa7f2b7406a18f0001000000494830450221009b812b2030b859645a58cd9836bcff268626ca4d5f978304764593403698eca5022062d7b0d2173b80aa52a3eb69ba75e38c0ff5d7d575ee626d8f47bc76b1383fed01ffffffff030000000000000000005ee3b14d235d00002321028ac5d9ed13c61f9fb986c3038d783f6b15da502f341172e40188d536a12143c1ac525394b204000000232103a4f6c7336909f19028383b1ca702eb1eaa0e25605925d834123290099719cb3fac00000000473045022100d65f72c17e8c66a3693aad7e1121f62fd85ccce4704fcccf5084a3d837e6175f022010e84847b6b10b728bc070ff046c571dfe14df274d4604087fd7248870e0d309" 19 | } -------------------------------------------------------------------------------- /tests/blocks/ravencoin_testnet_250000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0000000063ffb76793cc868a3d6d9af02ea0101631e04701cfc612cbedebe2b4", 3 | "confirmations": 34335, 4 | "strippedsize": 271, 5 | "size": 307, 6 | "weight": 1120, 7 | "height": 250000, 8 | "version": 805306368, 9 | "versionHex": "30000000", 10 | "merkleroot": "696a51657f357cbbd02236c6c0e33dfc8ca36baee0e82ee0e5ad0d307bf20b06", 11 | "tx": [ 12 | "696a51657f357cbbd02236c6c0e33dfc8ca36baee0e82ee0e5ad0d307bf20b06" 13 | ], 14 | "time": 1586327820, 15 | "mediantime": 1586327616, 16 | "nonce": 0, 17 | "bits": "1d02f913", 18 | "difficulty": 0.3363615366848872, 19 | "chainwork": "00000000000000000000000000000000000000000000000000014993be1c6407", 20 | "headerhash": "b13d236e5d01e5ed55d3d4a5640506cea773db33c4f65be90d7087690fb45c1c", 21 | "mixhash": "0a5c6d9c174b4078dadf36e34413af91a52e258c8ed6aafef027006a216e846a", 22 | "nonce64": 3629398823377678474, 23 | "previousblockhash": "000000028f2097d72d2002c961a4e511d828b49f8465ff16404b9e38cf0fe931", 24 | "nextblockhash": "00000000e33861b3eac8946013bc1eb2ef16d0247fb6a7f8367bdd9204f3802b", 25 | "block": "0000003031e90fcf389e4b4016ff65849fb428d811e5a461c902202dd797208f02000000060bf27b300dade5e02ee8e0ae6ba38cfc3de3c0c63622d0bb7c357f65516a690c718d5e13f9021d90d003008ab0a51f00375e326a846e216a0027f0feaad68e8c252ea591af1344e336dfda78404b179c6d5c0a01010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff120390d003006d696e65726d6f72652e636f6dffffffff020088526a740000001976a914925029b1d7fad2640600b08a89d8c01cc82d477088ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000" 26 | } 27 | 28 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | dist: bionic 3 | language: python 4 | before_install: 5 | - sudo add-apt-repository -y ppa:streetcrypto7/rocksdb 6 | - sudo apt-get -qq update 7 | - sudo apt-get install -yq libsnappy-dev zlib1g-dev libbz2-dev libgflags-dev liblz4-dev librocksdb-dev libleveldb-dev 8 | python: 9 | - "3.7-dev" 10 | - "3.8-dev" 11 | - "3.9-dev" 12 | # command to install dependencies 13 | install: 14 | - pip install aiohttp 15 | - pip install aiorpcX 16 | - pip install ecdsa 17 | - pip install plyvel 18 | - pip install pycodestyle 19 | - pip install pylru 20 | - pip install python-rocksdb 21 | - pip install pytest-asyncio 22 | - pip install pytest-cov 23 | - pip install Sphinx 24 | # hashes 25 | - pip install tribushashm 26 | - pip install blake256 27 | - pip install x11_hash 28 | - pip install git+https://github.com/bitcoinplusorg/x13-hash 29 | - pip install xevan_hash 30 | - pip install quark_hash 31 | - pip install groestlcoin_hash 32 | - pip install x16r_hash 33 | - pip install pycryptodomex 34 | - pip install git+https://github.com/Electra-project/nist5_hash 35 | - pip install git+https://github.com/RitoProject/x21s_hash 36 | - pip install x16rv2_hash 37 | - pip install git+https://github.com/VerusCoin/verushashpy 38 | - pip install bell-yespower 39 | - pip install cpupower 40 | - pip install kawpow 41 | # command to run tests 42 | script: 43 | - pytest --cov=electrumx 44 | - pycodestyle --max-line-length=100 electrumx/server/*.py electrumx/lib/*.py *.py 45 | - sh -c "cd docs && make html" 46 | # Dont report coverage from nightly 47 | after_success: 48 | - if [[ $(python3 -V 2>&1) == *"Python 3.7"* ]]; then 49 | pip install coveralls; 50 | coveralls; 51 | fi 52 | -------------------------------------------------------------------------------- /electrumx/lib/enum.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2016, Neil Booth 2 | # 3 | # All rights reserved. 4 | # 5 | # See the file "LICENCE" for information about the copyright 6 | # and warranty status of this software. 7 | 8 | '''An enum-like type with reverse lookup. 9 | 10 | Source: Python Cookbook, http://code.activestate.com/recipes/67107/ 11 | ''' 12 | 13 | 14 | class EnumError(Exception): 15 | pass 16 | 17 | 18 | class Enumeration: 19 | 20 | def __init__(self, name, enumList): 21 | self.__doc__ = name 22 | 23 | lookup = {} 24 | reverseLookup = {} 25 | i = 0 26 | uniqueNames = set() 27 | uniqueValues = set() 28 | for x in enumList: 29 | if isinstance(x, tuple): 30 | x, i = x 31 | if not isinstance(x, str): 32 | raise EnumError("enum name {} not a string".format(x)) 33 | if not isinstance(i, int): 34 | raise EnumError("enum value {} not an integer".format(i)) 35 | if x in uniqueNames: 36 | raise EnumError("enum name {} not unique".format(x)) 37 | if i in uniqueValues: 38 | raise EnumError("enum value {} not unique".format(x)) 39 | uniqueNames.add(x) 40 | uniqueValues.add(i) 41 | lookup[x] = i 42 | reverseLookup[i] = x 43 | i = i + 1 44 | self.lookup = lookup 45 | self.reverseLookup = reverseLookup 46 | 47 | def __getattr__(self, attr): 48 | result = self.lookup.get(attr) 49 | if result is None: 50 | raise AttributeError('enumeration has no member {}'.format(attr)) 51 | return result 52 | 53 | def whatis(self, value): 54 | return self.reverseLookup[value] 55 | -------------------------------------------------------------------------------- /tests/blocks/gravityzerocoin_mainnet_400000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "c4a16ed137cf312ffc8ec989dbcc230b179d1bc6d7e2369cff0c54e268bcb458", 3 | "confirmations": 371494, 4 | "size": 402, 5 | "height": 400000, 6 | "version": 6, 7 | "merkleroot": "d96a352f4cab0e73b8ddc69633b5fb54c39c53f8d93b9e1fb4882132a68646a7", 8 | "mint": 13.55584584, 9 | "time": 1547766314, 10 | "nonce": 0, 11 | "bits": "1d03bed6", 12 | "difficulty": 0.26698634, 13 | "blocktrust": "44597bc6", 14 | "chaintrust": "106a07cee0e24", 15 | "previousblockhash": "3a045b39c2369f23a95b32b0ec2c30234fd307dc86795d8f9a295f85b1e6f632", 16 | "nextblockhash": "24f1df989cbede25bbeef305a420b22b28840de7ee52122be0e3d56c6875b062", 17 | "flags": "proof-of-stake", 18 | "proofhash": "0000637026cfd1b97af9bcbc558cd577962057c99760dedbabd3f7b3ced909bb", 19 | "entropybit": 0, 20 | "modifier": "7e35682c0e03ff1b", 21 | "modifierchecksum": "fa487772", 22 | "tx": [ 23 | "7d37da7d2d20142d2323af4b556e2377faf4d86d2fc29ad307f983bfe4d5465c", 24 | "36811b8de5a6fd1e2bf3a5f5e7157a5169d380345bb6b688c89ab07280faf79f" 25 | ], 26 | "block": "0600000032f6e6b1855f299a8f5d7986dc07d34f23302cecb0325ba9239f36c2395b043aa74686a6322188b41f9e3bd9f8539cc354fbb53396c6ddb8730eab4c2f356ad92a0a415cd6be031d0000000002010000002a0a415c010000000000000000000000000000000000000000000000000000000000000000ffffffff0403801a06ffffffff0100000000000000000000000000010000002a0a415c016596bbccd731657b1a47d8570c2ae3ef3976c199d4784a8ca2dff1a3c3684a160100000049483045022100a1bc3acbbf446729e387baf13e5d58566b192178a43d2ccdf7ac0b5aa699fe9102206625909db2a437976689594a5b488a9137b8bb458e3bee5227a051917646c2a901ffffffff02000000000000000000d3f51b394600000023210394f136be999f1e1daca9198dbb61418a1d658cb6857aaaacf06e3e4f9a33fdd0ac00000000" 27 | } -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | version = '1.15.0' 3 | 4 | setuptools.setup( 5 | name='electrumX', 6 | version=version, 7 | scripts=['electrumx_server', 'electrumx_rpc', 'electrumx_compact_history'], 8 | python_requires='>=3.7', 9 | install_requires=['aiorpcX[ws]>=0.18.3,<0.19', 'attrs', 10 | 'plyvel', 'pylru', 'aiohttp>=3.3'], 11 | extras_require={ 12 | 'rapidjson': ['python-rapidjson>=0.4.1,<1.0.0'], 13 | 'rocksdb': ['python-rocksdb>=0.6.9'], 14 | 'ujson': ['ujson>=2.0.0,<4.0.0'], 15 | 'uvloop': ['uvloop>=0.14'], 16 | # For various coins 17 | 'blake256': ['blake256>=0.1.1'], 18 | 'crypto': ['pycryptodomex>=3.8.1'], 19 | 'groestl': ['groestlcoin-hash>=1.0.1'], 20 | 'tribushashm': ['tribushashm>=1.0.5'], 21 | 'xevan-hash': ['xevan-hash'], 22 | 'x11-hash': ['x11-hash>=1.4'], 23 | 'zny-yespower-0-5': ['zny-yespower-0-5'], 24 | 'bell-yespower': ['bell-yespower'], 25 | 'cpupower': ['cpupower'], 26 | }, 27 | packages=setuptools.find_packages(include=('electrumx*',)), 28 | description='ElectrumX Server', 29 | author='Neil Booth', 30 | author_email='kyuupichan@gmail.com', 31 | license='MIT Licence', 32 | url='https://github.com/spesmilo/electrumx', 33 | long_description='Server implementation for the Electrum protocol', 34 | download_url=('https://github.com/spesmilo/electrumX/archive/' 35 | f'{version}.tar.gz'), 36 | classifiers=[ 37 | 'Development Status :: 5 - Production/Stable', 38 | 'Framework :: AsyncIO', 39 | 'License :: OSI Approved :: MIT License', 40 | 'Operating System :: Unix', 41 | "Programming Language :: Python :: 3.7", 42 | "Topic :: Database", 43 | 'Topic :: Internet', 44 | ], 45 | ) 46 | -------------------------------------------------------------------------------- /tests/blocks/namecoin_mainnet_19200.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "d8a7c3e01e1e95bcee015e6fcc7583a2ca60b79e5a3aa0a171eddd344ada903d", 3 | "size": 678, 4 | "height": 19200, 5 | "merkleroot": "88afdfdcc78f778f701835b62e432d3ba7d55b3e59ac4e7cab08d6bc49655c0f", 6 | "tx": [ 7 | "88afdfdcc78f778f701835b62e432d3ba7d55b3e59ac4e7cab08d6bc49655c0f" 8 | ], 9 | "time": 1318066829, 10 | "nonce": 0, 11 | "bits": "1b00b269", 12 | "previousblockhash": "000000000000b19f0ad5cd46859fe8c9662e8828d8a75ff6da73167ac09a9036", 13 | "block": "0101010036909ac07a1673daf65fa7d828882e66c9e89f8546cdd50a9fb10000000000000f5c6549bcd608ab7c4eac593e5bd5a73b2d432eb63518708f778fc7dcdfaf888d1a904e69b2001b0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff35045dee091a014d522cfabe6d6dd8a7c3e01e1e95bcee015e6fcc7583a2ca60b79e5a3aa0a171eddd344ada903d0100000000000000ffffffff0160a0102a01000000434104f8bbe97ed2acbc5bba11c68f6f1a0313f918f3d3c0e8475055e351e3bf442f8c8dcee682d2457bdc5351b70dd9e34026766eba18b06eaee2e102efd1ab634667ac00000000a903ef9de1918e4b44f6176a30c0e7c7e3439c96fb597327473d00000000000005050ac4a1a1e1bce0c48e555b1a9f935281968c72d6379b24729ca0425a3fc3cb433cd348b35ea22806cf21c7b146489aef6989551eb5ad2373ab6121060f30341d648757c0217d43e66c57eaed64fc1820ec65d157f33b741965183a5e0c8506ac2602dfe2f547012d1cc75004d48f97aba46bd9930ff285c9f276f5bd09f356df19724579d65ec7cb62bf97946dfc6fb0e3b2839b7fdab37cdb60e55122d35b0000000000000000000100000008be13295c03e67cb70d00dae81ea06e78b9014e5ceb7d9ba504000000000000e0fd42db8ef6d783f079d126bea12e2d10c104c0927cd68f954d856f9e8111e59a23904e5dee091a1c6550860101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff080469b2001b010152ffffffff0100f2052a0100000043410489fe91e62847575c98deeab020f65fdff17a3a870ebb05820b414f3d8097218ec9a65f1e0ae0ac35af7247bd79ed1f2a24675fffb5aa6f9620e1920ad4bf5aa6ac00000000" 14 | } 15 | -------------------------------------------------------------------------------- /tests/blocks/odin_mainnet_1337.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "6733a167600d75c51e4e1c86aca95e5cb2c7b5a545f4027906dfda890e426413", 3 | "confirmations": 313490, 4 | "height": 1337, 5 | "version": 3, 6 | "merkleroot": "82428534b45d72fb714efc68201805a4108e438f344a21d73e270a19515be161", 7 | "time": 1538189461, 8 | "nonce": 0, 9 | "bits": "1a0db9f7", 10 | "difficulty": 1222238.113064503, 11 | "chainwork": "000000000000000000000000000000000000000000000000264ff2b7dbef2c2f", 12 | "acc_checkpoint": "0000000000000000000000000000000000000000000000000000000000000000", 13 | "previousblockhash": "8124baf13a48e7f9336db961d0b59b2021cf95138b3068f6c22b689cbe265c83", 14 | "nextblockhash": "28dd5e9887f029a46e1bf12100403c698087747ff1fbb7cf1f5802b4e28cb982", 15 | "tx": [ 16 | "bf927d12784d64dfadb8ccd27124abe0c5c4978cef1dc84187285e7bca05d282", 17 | "8663461f3adaa54a2438ef83198ad31f34747f9e037ca89351e88c9dd9e7c3e3" 18 | ], 19 | "block": "03000000835c26be9c682bc2f668308b1395cf21209bb5d061b96d33f9e7483af1ba248161e15b51190a273ed7214a348f438e10a405182068fc4e71fb725db43485428295e8ae5bf7b90d1a000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff050239050101ffffffff010000000000000000000000000001000000010b0e46907b49b0794767633f59e584719d81aead72d87a26bbbae595cc04f88b0100000049483045022100fff2f7b2b4abad935f5a5731dd4b3363e658d3bcf433263e7ec813313dc6230102207772df5639a8cfad622ba8d54f7aa22ecaff88bc360222fc6e6d2ebaa9f9941401ffffffff040000000000000000000028babda0050000232103c16d7c1523d9f36578e9e631f97b7a39e5282ccd6374d98b2aacf1dd4fe984a6ac42f2f6aba0050000232103c16d7c1523d9f36578e9e631f97b7a39e5282ccd6374d98b2aacf1dd4fe984a6ac00a3e111000000001976a91492150f863991f5a465a0a3a06caebd2787a260a588ac00000000473045022100d478732e49ab4f273c687bc24f6a646d8aad6877b0948a24f9030d7683b028d502207f8933b6de4604d2d702a165eaca9ede81933ca1185c00c6dd365e074935a741" 20 | } 21 | -------------------------------------------------------------------------------- /tests/blocks/odin_mainnet_17000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "7bc09de55cd8334f6f167829753f043ac1afa4eddaf5898dc1a14b46ace947f0", 3 | "confirmations": 144827, 4 | "height": 170000, 5 | "version": 4, 6 | "merkleroot": "e60ecea79426c869bea8d064465dd9cc9e6b426bdfb632752e3de3c352272f27", 7 | "time": 1548246463, 8 | "nonce": 0, 9 | "bits": "1a2865aa", 10 | "difficulty": 415300.8388247479, 11 | "chainwork": "00000000000000000000000000000000000000000000001371001c2972478ec1", 12 | "acc_checkpoint": "0000000000000000000000000000000000000000000000000000000000000000", 13 | "previousblockhash": "2cc1019efc9b89475c0f2a72d1418c4387cfd8b9da5548d819740b0a9843568d", 14 | "nextblockhash": "cce7302d617f9a490104e70098f8e6015a46499516b25bf6fbd54c4edbefb808", 15 | "tx": [ 16 | "77f183818333fc317122c448151f5d11b7f621151130ce02bf6acd1f6ccbadd6", 17 | "39436b3d686eb2be88c89e4edb66fa853a3d49f1ded40d2cd156b0e43c2e8e82" 18 | ], 19 | "block": "040000008d5643980a0b7419d84855dab9d8cf87438c41d1722a0f5c47899bfc9e01c12c272f2752c3e33d2e7532b6df6b426b9eccd95d4664d0a8be69c82694a7ce0ee6bf5d485caa65281a0000000000000000000000000000000000000000000000000000000000000000000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff06031098020101ffffffff0100000000000000000000000000010000000102b5c06f8f38c2139a5e51b15fcc8ce4685523b4549b4c3528483fad0c865b87030000006b4830450221008374ad472e099de0cc627f2d6ea2e9ffe878ad41bc1209ebe8e942eb516dc9dc022070968c94f60d55902a64bb3705502eb0ed591cf090785ad44061ba4a987db0ab012103cdca2f4c4d26ce23d543caf2d14426e4cd03878bd29c3637d7f181e3fe1ffc25ffffffff03000000000000000000366f6a6701000000232103cdca2f4c4d26ce23d543caf2d14426e4cd03878bd29c3637d7f181e3fe1ffc25ac009aad4e000000001976a9141ec10816853643a3b3cbbb8189d0bfbea75304bf88ac00000000473045022100b8aa4d4fde2452268ba06a0bf7be76e48007ec439ce97a6647ff10a293d2f54a02202c21ee5eefa4d078eae5d6a16ce29debfce274ed4f9cd38feab80821a6ec83fc" 20 | } 21 | -------------------------------------------------------------------------------- /tests/blocks/peercoin_mainnet_400000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash" : "c30fd1d91e93a2ede890082f2bebdc9ff3f98bedbd3f2af93c24e78d5f02ae71", 3 | "confirmations" : 9303, 4 | "size" : 447, 5 | "height" : 400000, 6 | "version" : 2, 7 | "merkleroot" : "c8f7fa5334c7b0eb5109657c49c175fd5dd2917eb964e08aae320a2a0569aafd", 8 | "time" : 1543222503, 9 | "nonce" : 0, 10 | "bits" : "1c209b13", 11 | "difficulty" : 7.85125402, 12 | "mint" : 0.17000000, 13 | "previousblockhash" : "c2386977e86edce265e16dee971e16182d30276dcbe4f8d3952de2f7604205e8", 14 | "nextblockhash" : "0b44da48e6c67204a8ba70287661aaeb2a701860db6cbdbc524383a1ff5f69c3", 15 | "flags" : "proof-of-stake", 16 | "proofhash" : "00000017751b95cb61a50e42edd4199222b35bac524cda142e1f21fa5ab2bb81", 17 | "entropybit" : 1, 18 | "modifier" : "0a1b9dcd55c93fad", 19 | "modifierchecksum" : "88a78bdd", 20 | "tx" : [ 21 | "b43a373255449745a771fa606b56b6b10c7aaca6e2804bb7a30fc7717b80cc73", 22 | "ffcf0b421c3fe791a1baf068deb538a508950231812905e2110f12727f780a21" 23 | ], 24 | "block": "02000000e8054260f7e22d95d3f8e4cb6d27302d18161e97ee6de165e2dc6ee8776938c2fdaa69052a0a32ae8ae064b97e91d25dfd75c1497c650951ebb0c73453faf7c8e7b4fb5b139b201c000000000201000000e7b4fb5b010000000000000000000000000000000000000000000000000000000000000000ffffffff0e03801a06026f01062f503253482fffffffff010000000000000000000000000001000000e7b4fb5b011565b918218df4f074319bafafc94ec0ff50e6f9f681143ccb2f429f1a85e1c2000000006c493046022100acbc9716921186723bf778b9ff7d8a4e252275674e2735cd3b02c272dbe678b8022100a7b4170b8c3707101bfd82a7fa7c16436740df0803ab6a9024f82d09b0d98a8e0121029fb0c1b71e83ff07732d0847133e46e4557bc95f1b670ea598f1dccfe70b1312ffffffff0200000000000000000000050802000000002321029fb0c1b71e83ff07732d0847133e46e4557bc95f1b670ea598f1dccfe70b1312ac00000000473045022018245fa0e09bbe08696724016243fac0de694bb61a841655a48598d32070a42d022100fa118a1a8d179789f852f9517ac5ab06dfa72475b4cc0527a6972a142add80f4" 25 | } -------------------------------------------------------------------------------- /tests/blocks/peercointestnet_testnet_1337.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "f0e6edf02c1fda098144756cf466936977a553fa18739325cd4af36d489e8632", 3 | "confirmations": 380792, 4 | "size": 457, 5 | "height": 1337, 6 | "version": 1, 7 | "merkleroot": "df17fad72c04727b88e748f087dfcf6aab817f9bd248a38bd88bb967c104cada", 8 | "time": 1346638335, 9 | "nonce": 0, 10 | "bits": "1d05789d", 11 | "difficulty": 0.18277429, 12 | "mint": 0.07, 13 | "previousblockhash": "2b7fd3d7e53bdf8bbe5d8241e313458fb7a2a65dfaa8ea2a03710709c9e60d4e", 14 | "nextblockhash": "f47c998cfc6f7089665b0be9b42c00ec83442c5059beb5490abf16a81f3827fd", 15 | "flags": "proof-of-stake", 16 | "proofhash": "0000371d6be77a6e38732ebe0b388017c1d29bc7843227d6244b7b837dd7d45d", 17 | "entropybit": 1, 18 | "modifier": "a7dde56766970857", 19 | "modifierchecksum": "875223e4", 20 | "tx": [ 21 | "f7214afc86d37d29d8cc4f9d040d6605512fbf3ac21bc1a6f32609dfa7b0f7da", 22 | "575eb33679da3981cfb5ed35f48a02a0b6492ceb30dc75ccc307e0e8ee1d3ca1" 23 | ], 24 | "block": "010000004e0de6c9090771032aeaa8fa5da6a2b78f4513e341825dbe8bdf3be5d7d37f2bdaca04c167b98bd88ba348d29b7f81ab6acfdf87f048e7887b72042cd7fa17dfff1144509d78051d000000000201000000ff114450010000000000000000000000000000000000000000000000000000000000000000ffffffff0f04ff114450029701062f503253482fffffffff010000000000000000000000000001000000ff1144500115f754e065609bf45b0ff796b3be0e4b91357edebae2f3d1a3ced332b6c52dd10100000049483045022001f3652da344fa1f25a4da28aa0b5f727f58c5182a42931a6433d1995d089ba9022100b9420da34863c0c7ed27c6bdc916c045485a0d2ad3049cb989adda728c4f6d7d01ffffffff03000000000000000000a097223c00000000232102ed1b78f2dd015603be7d7a108ea26c1e9535f98a4e3c8ddd7dc6291e378009b0aca097223c00000000232102ed1b78f2dd015603be7d7a108ea26c1e9535f98a4e3c8ddd7dc6291e378009b0ac000000004730450220097e783d6d92f4882ce58bebb7094d1420abd8669183f862bb4c3978cf0589e00221009f2598fdc627711431dbcbc732e043037b052a32e00edfd6bee511bcd2b9e76f" 25 | } -------------------------------------------------------------------------------- /tests/blocks/peercointestnet_testnet_310000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "305970c9387e4adde8dee27ed50b6207d738b7578f4f1f481cee23a727a76172", 3 | "confirmations": 72129, 4 | "size": 456, 5 | "height": 310000, 6 | "version": 2, 7 | "merkleroot": "87a298a3e1890c08948727e8ce4a6367e77d0ab7e5ff3b1875fe607c03992c9e", 8 | "time": 1512575032, 9 | "nonce": 0, 10 | "bits": "1c0ab99a", 11 | "difficulty": 23.86908607, 12 | "mint": 0.46, 13 | "previousblockhash": "7d25ff5e201e2951ff9b4d877c2a218ea0df17c4dd47abf2978b41fc0b890862", 14 | "nextblockhash": "bf09ac2b219f3784e8fe1d4f65b1c77d8cb4bff0bacab9677436346c14f524ea", 15 | "flags": "proof-of-stake", 16 | "proofhash": "00000251ba021240b5ffb2d918d8475b19f368962e28350155d66b6f3a04fb25", 17 | "entropybit": 0, 18 | "modifier": "006d50c1cdf9fafd", 19 | "modifierchecksum": "68f95e6a", 20 | "tx": [ 21 | "25f0a69c9e7cd99eb6be21e3152447cf5a48d71903e3b15da01118191b9ec764", 22 | "549d76e88e06c3e0e02058d01f543a6da5ac7b8d34520ffad1104829432944c1" 23 | ], 24 | "block": "020000006208890bfc418b97f2ab47ddc417dfa08e212a7c874d9bff51291e205eff257d9e2c99037c60fe75183bffe5b70a7de767634acee8278794080c89e1a398a2873810285a9ab90a1c0000000002010000003810285a010000000000000000000000000000000000000000000000000000000000000000ffffffff0e03f0ba04024a01062f503253482fffffffff0100000000000000000000000000010000003810285a0132e413fa8effb7c4a99e89f6a62cc1a4ea3424ee78a391b117b047c57f40de690100000049483045022100b45fc1471ca229fd692e4b96a67e8e25ab7858f8c445c1cf92e362758f7e23d402203778a10d47ba33a94cb89b0fde0d9883d5cca8ca25456288bd59026c0c900c9101ffffffff0300000000000000000060765925000000002321035df758c3d2f0d60efc48b6c3a08e0aea265861c355ead942705503258307c698ac709d5925000000002321035df758c3d2f0d60efc48b6c3a08e0aea265861c355ead942705503258307c698ac0000000047304502205361a4b0d0937b2904078ba643d0ca106691c17b5c700045f1b658bb4311dd6e022100e96082cf51d2a19c3b24c44044f75dc796d5770690b2cba24de44ef16de62684" 25 | } -------------------------------------------------------------------------------- /tests/blocks/gravityzerocoin_mainnet_42000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "c6224c2d994ed417be7a550b6201cf71a110c378df5dfe1a423b51deef276309", 3 | "confirmations": 729491, 4 | "size": 515, 5 | "height": 42000, 6 | "version": 6, 7 | "merkleroot": "1118f54a5cedcda6cdd669d7ed337ddd418edcc9c8065ba06ec8b3473179c7d2", 8 | "mint": 3.24335269, 9 | "time": 1526472385, 10 | "nonce": 0, 11 | "bits": "1d154384", 12 | "difficulty": 0.04702771, 13 | "blocktrust": "c0a0e25", 14 | "chaintrust": "21f0d6cef092", 15 | "previousblockhash": "2407cc6fe5d1293808bc681771aa292b736ce7e142ad32d181101c18c23cbc89", 16 | "nextblockhash": "e4a12df47a26484006ffdfc35d6db49cfe74626d57d580483b5a6e1ebf0ea307", 17 | "flags": "proof-of-stake", 18 | "proofhash": "000060fe229530c712d0fa9501a7212da3748b8a95c9e876f72d28ffe1dedae2", 19 | "entropybit": 1, 20 | "modifier": "f7a842c2194e61e3", 21 | "modifierchecksum": "e20172af", 22 | "tx": [ 23 | "761638848add367b5dd05b913be94af62e4b313f3a6f807803f174ed989b5912", 24 | "2e9d00b06f1f18457b7ab45ec81e02e8fb01d33912dc65c05f5d871ffe981db6" 25 | ], 26 | "block": "0600000089bc3cc2181c1081d132ad42e1e76c732b29aa711768bc083829d1e56fcc0724d2c7793147b3c86ea05b06c8c9dc8e41dd7d33edd769d6cda6cded5c4af51811c11efc5a8443151d000000000201000000c11efc5a010000000000000000000000000000000000000000000000000000000000000000ffffffff040310a400ffffffff010000000000000000000000000001000000c11efc5a026fedaa2a742acabb33a2c7c91954e22781f2140a3992beb109d5b3d48a804abe020000004847304402205910e4efd1b60edd9a5e6fdd4bc65dccb9b88019f1e2119861498fe3b3630aec0220692619c3f5c6b2d01c3af3d4835d9fe1d10556f587733a3ca436a30559e2e09c01ffffffff3bd3c8697d79143d6c35474c2de04e255499fa1bab71be1e03a320ad1225c5a30100000049483045022100d3eea15b5d3dcfd80eb021aa2446f98abf517af7dc74eef2e149ba6a8f7199ba02203b2e595e01beaa6f6bb4e15850ae9ff87fd6facebe65ef745618f3eaa02f849c01ffffffff020000000000000000006f2fa37322000000232103ebb76b9b604909b1af2ba737e31f54b9e394f160174f44de330cb7c08563b47eac00000000" 27 | } -------------------------------------------------------------------------------- /tests/blocks/eccoin_mainnet_200000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "1f1ea51aee8a7456655e31857c7cd4a9f494556438485abd4c60d86cacf24b44", 3 | "confirmations": 1914861, 4 | "size": 412, 5 | "height": 200000, 6 | "version": 4, 7 | "merkleroot": "d53f4d65ec4cbab16b538d2c5b1e80681510c000c8dcf33121dd3dce90d7f9fb", 8 | "mint": 15.931506, 9 | "tx": [ 10 | "dc74bc4d471b12780ebdad606d60927f15ca892dde9c38042b6490bb10f32e43", 11 | "c3d0aa280a269ab7edcc5bb16c9c9a7a9fb0ded98a632bf39cca936a9880f270" 12 | ], 13 | "time": 1405318345, 14 | "mediantime": 1405317997, 15 | "nonce": 0, 16 | "bits": "1d06fd2d", 17 | "difficulty": 0.14308045997088, 18 | "chainwork": "00000000000000000000000000000000000000000000000000264aaf47bc1642", 19 | "previousblockhash": "cbedb6de9ce90a6a4124f84d975070fcef0664a4d0c954403cbb6ef54fe7307a", 20 | "nextblockhash": "731cc4879221da610890deaf16cc2085f6e833d47f180f35a1552e666e5d7af5", 21 | "flags": "proof-of-stake", 22 | "nflags:": "1", 23 | "proofhash": "ffd9bac8019ae3fa8d613336467d7c08e7abd9ce55d502ffd7c95842550edd53", 24 | "entropybit": 0, 25 | "block entropybit": 0, 26 | "modifier": "7967e8d05d08c98620215610a4a3484735446a12eb1671a890607199aa244446", 27 | "block": "040000007a30e74ff56ebb3c4054c9d0a46406effc7050974df824416a0ae99cdeb6edcbfbf9d790ce3ddd2131f3dcc800c0101568801e5b2c8d536bb1ba4cec654d3fd5c974c3532dfd061d000000000201000000c974c353010000000000000000000000000000000000000000000000000000000000000000ffffffff0d03400d030122062f503253482fffffffff010000000000000000000000000001000000c974c353017c9f872e042e1a47a015a971978fa959e7698c06bbfed6ac875946e947708b04010000004948304502201b36699258081d054eb47329d319ce9bf1141a00bc96ca95880aad9a9f7765d702210094d36cabea1f2d011bdd9f4e1906f294b149d2d3cfb5b295ce4a85dafef2469501ffffffff0200000000000000000029de3716000000002321027401e2b15c988824d5707b9ce3c966e96e41e1867a618ffe8e6b31a3196c0606ac00000000483046022100d1e1269b8dd0a280f70e6507963cf07a6bcadb40daa5acf9258964788d30db3f0221008d115faa6e0eee6974588718aa1c4b98a1d7d5d344b049a88e946a071f3e389a" 28 | } 29 | -------------------------------------------------------------------------------- /tests/blocks/smartcash_mainnet_200000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000000000000d1772b7e3ffc661133c252faedcc52b3dd186b83da4b2f2f8cbe", 3 | "size": 692, 4 | "height": 200000, 5 | "merkleroot": "f8f490671e499b66a73e3fe37f3b2288b82e3d359fc3c18938f32e9e830928d2", 6 | "tx": [ 7 | "c19c6e1dd5ca9d06b046a2962782293cdd9be39bb006ce65add0ad945c9eaeec", 8 | "0151e788a439caa317dce1cf5a754f0b5bb8639d4f1073e89d3baa450fda5306", 9 | "a4217a9a787b66a597efae52b24e2c88d1700cf5661bac6ed58c718f90a98b97" 10 | ], 11 | "time": 1511678597, 12 | "nonce": 3716569074, 13 | "bits": "1b01c757", 14 | "previousblockhash": "0000000000016e6bcdbe8af532509cf5aaf99e74b8b0346a59d360beb460e0bf", 15 | "block": "02000000bfe060b4be60d3596a34b0b8749ef9aaf59c5032f58abecd6b6e010000000000d22809839e2ef33889c1c39f353d2eb888223b7fe33f3ea7669b491e6790f4f885621a5a57c7011bf25786dd0301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2703400d03062f503253482f0485621a5a087ffd6961cf0000000d2f6e6f64655374726174756d2f000000000240e6202d040000001976a9145dd99e7cfdee45d47edf9b2d92df27961241145e88ac40412d574f0000001976a9144a7018841fc6003d66b6a1b859e73b4cc3e621b488ac0000000001000000019521d2cde436c42b81158198b2cd8b9d52dc093d4f8465163ecc98a134dd12a6000000006b483045022100ddad79fd8a9fa0ca664ac8e91aa7c8dcc7cad8c4894e1a7d9143de4bdedeef9f022013dfd0605b50d22d2675e21a27255540fa48263ab44801d287a61883ee8074c3012103635fd7668414f4eb1d6088cac789e58709cae9c3c07a00791f415164b67cda4cffffffff0281c03b9e000000001976a9141dc91417504cb86ac5eea49d85a4d3fd51f72db988acbc91e5cb000000001976a914ecdccf8dec8482314050acd84f72d6559a19b30d88ac0000000001000000011a8b6c07eb61bb5e9910de4d31a410a5b69de2bde8a3cb9df599ddaccd373d95000000006c493046022100d1bf91d45a0d53bfad9aa0d226be625f667641fa53661e2cdc21526cf84ede21022100d0cbf38220d789c9b1a5c6288ebfe2e5ddd4ceb5714881d0f43a27d06a6e9649012103133678a3c4d9855f4a25ab318619fe68e0ed67d67c14fa9be678cb561a75f71bffffffff027fd500fc000000001976a914098cd3573bcca56674eb6eeb51fad42ff353945088ac58bda83d000000001976a91456feb1c72217b8f45aa4183da1c81b314a47f5f388ac00000000" 16 | } -------------------------------------------------------------------------------- /tests/blocks/trezarcoin_mainnet_612581.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "7fccc90aa5997b036d41ec079a2e8e2c52a0d1f64079b59aaa08c25e0e1e1a30", 3 | "size": 682, 4 | "height": 612581, 5 | "merkleroot": "7d9f01b60ab6718e97018b47cd0cf61ca85afe77bcf8d9c90e9709bb2aab9539", 6 | "tx": [ 7 | "758012ea68d57bdc6e413a6d4195638b410df2ed8a3b2387343a854bb3a1c4b6", 8 | "c9f6d252f90f42884774d66d8ca17629333cda2871eeb3612307abeebb7e888d", 9 | "1354ba387c5f42f807889741a63704fc0ea87dc04f29834111c5f8d80ac0a70b" 10 | ], 11 | "time": 1541864019, 12 | "nonce": 0, 13 | "bits": "1c092c62", 14 | "previousblockhash": "ac69b095cc53f7a0e9197a243fab2dfa49e7f0934fa79ec68f47993be813b33e", 15 | "block": "030000003eb313e83b99478fc69ea74f93f0e749fa2dab3f247a19e9a0f753cc95b069ac3995ab2abb09970ec9d9f8bc77fe5aa81cf60ccd478b01978e71b60ab6019f7d53fae65b622c091c00000000030200000053fae65b010000000000000000000000000000000000000000000000000000000000000000ffffffff0d03e558090130062f503253482fffffffff0100000000000000000000000000000200000053fae65b014f5dccf6592b950c707a5ae62c11644bf0cd1bd5777412a26c25e60015ce4f2001000000494830450220360d685960bd8fa30617beac5c952073e2d89be2528eeb11d475e43b894abdfd0221009b7cd6f2b5d8e2f8ad1919ea81b058ba1703e8c07180c09bacc974ec418a612b01ffffffff020000000000000000002059a4cd000000002321026b1af42e2ea1f61ca8bdb563a61787f8d69d7578de77229ef7bb2d2120b7f8f3ac000000000002000000d8f9e65b01b170ad1b81ac0164a637b6bd970c9897cc9be7d4f05b358ccd868a5d2adb2779010000006b483045022100bfffc1364ad5dfc2da6aedc8d8cdb31905d4e8fb7e4c7c5efafada7cbb18559502205a9cd74bba48fc60e142214917a6d66347aa5ca8f0d9664546e37955ca09c401012103765dbe24359bee468d2fde0ad714906bc0c15ce02e7170dbe98d42e663adb3a2feffffff0290aa0830000000001976a9149d864f487a38c872013901e463ea47a56967251888ac404b4c00000000001976a914690acc951705cd7668f6df688ba33c62cf15a3c288ace358090026746578743a536d696c6579476e6f6d6520697320612062616461737320676e6f6d65205e2e5e473045022100ef1ee96a60ce2d0368b371eccf92aea0d532ff5d447ff70b403130f0212b10ba022061c2c9d7b061035fa416303699768c8e99f3f27a470d3b63abc055181ea91350" 16 | } -------------------------------------------------------------------------------- /tests/blocks/zero_mainnet_800000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000001a76b58c2bd8748849ee402d7bb010c862aa20cb82bacdf1008c5a2e2a6", 3 | "size": 747, 4 | "height": 800000, 5 | "version": 4, 6 | "merkleroot": "05c587fcb921e00ff7f76389b6abd52796fefe136e196a74fb9834fb0acad8ee", 7 | "tx": [ 8 | "05c587fcb921e00ff7f76389b6abd52796fefe136e196a74fb9834fb0acad8ee" 9 | ], 10 | "time": 1583551674, 11 | "nonce": "0054683900000000000000000000000000000000000000000000000028430000", 12 | "bits": "1e01ddbd", 13 | "previousblockhash": "00000156e3f26d3cc0cc3f2598294f73ff89d5d91ca2128ab450ea0017602918", 14 | "block": "040000001829601700ea50b48a12a21cd9d589ff734f2998253fccc03c6df2e356010000eed8ca0afb3498fb746a196e13fefe9627d5abb68963f7f70fe021b9fc87c5055a716f09be7c3132e2e04c81d6413f47e5ec5e262eef5a74e3727fd94a446550ba14635ebddd011e0000432800000000000000000000000000000000000000000000000039685400fd900102d1e02c86f3d967c6dd7daa396f9d1eb787df45914fcebb5105e143537f19106957f78eed90f00d956ea1acbb3251a998bd23c3e53b0fa5e096c5fe927e326ed14cd5c0d21daaef1e16dc31fef5a0fc350d63c85cbb54545cafb4313b718f556720f35404a2690cfb23555fc275d22aa3343575d8d1c90147ef120e324394756af196ad7248fdcdd0a569ff7eee1a25a57350e920fe16e0355a5ba9155c9e2d1266b69b2d875f945eec097bbc0a451c73f61c9c3517f7d677e25bd94328a4aecdfeb83c6986344605f560b551fc41e94e76173ae55044b734400e91f121fd6c3541422c386e2f91d73e191b1d25a1b0d7f6c559d78c697c5f291f2af3939a7321e5f49bf255a59d229b832fb1ffc225810a0f3d5aaf45d5435268f54ce7fb351c1c7b67f6923634d5b1c82d07aa595d70225e392b1cf8e0d2261c4b788f80d2e4a72524762743a24e63bf4a17314b8de6d5b5456e5ce562578beb9de5f20a769b4623c10813cfa5902634baabbf1fc66da095751c089015034260a9b686280db722697b924747c63a875ba449b2f8e8010400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff210300350c005a657267706f6f6c20687474703a2f2f7a657267706f6f6c2e636f6dffffffff0320fb69020000000017a914ff856ce07140ae4127fbd9850a19922fe336c22387c0ef0b08000000001976a914315ce0394b12f1d38f68d7570c2158de5118a66d88ac20d4b915000000001976a91489367c57ef935d82bd812a3834510811ef3f1d3288ac00000000000000000000000000000000000000" 15 | } 16 | -------------------------------------------------------------------------------- /docs/PERFORMANCE-NOTES: -------------------------------------------------------------------------------- 1 | Just some notes on performance with Python 3.5. We are taking these into 2 | account in the code. 3 | 4 | - 60% faster to create lists with [] list comprehensions than tuples 5 | or lists with tuple(), list(). Of those list is 10% faster than 6 | tuple. 7 | 8 | - however when not initializing from a generator, a fixed-length tuple 9 | is at least 80% faster than a list. 10 | 11 | - an implicit default argument is ~5% faster than passing the default 12 | explicitly 13 | 14 | - using a local variable x rather than self.x in loops and list 15 | comprehensions is over 50% faster 16 | 17 | - struct.pack, struct.unpack are over 60% faster than int.to_bytes and 18 | int.from_bytes. They are faster little endian (presumably because 19 | it matches the host) than big endian regardless of length. Furthermore, 20 | using stored packing and unpacking methods from Struct classes is faster 21 | than using the flexible-format struct.[un]pack equivalents. 22 | 23 | After storing the Struct('`_. 11 | The original author dropped support for Bitcoin, which we intend to keep. 12 | 13 | ElectrumX allows users to run their own Electrum server. It connects to your 14 | full node and indexes the blockchain, allowing efficient querying of history of 15 | arbitrary addresses. The server can be exposed publicly, and joined to the public network 16 | of servers via peer discovery. As of May 2020, a significant chunk of the public 17 | Electrum server network runs ElectrumX. 18 | 19 | The current version is |release|. 20 | 21 | Source Code 22 | =========== 23 | 24 | The project is hosted on `GitHub 25 | `_. and uses `Travis 26 | `_ for Continuous 27 | Integration. 28 | 29 | Please submit an issue on the `bug tracker 30 | `_ if you have found a 31 | bug or have a suggestion to improve the server. 32 | 33 | Authors and License 34 | =================== 35 | 36 | Neil Booth wrote the vast majority of the code; see :ref:`Authors`. 37 | Python version at least 3.7 is required. 38 | 39 | The code is released under the `MIT Licence 40 | `_. 41 | 42 | Getting Started 43 | =============== 44 | 45 | See :ref:`HOWTO`. 46 | 47 | There is also an `installer`_ available that simplifies the 48 | installation on various Linux-based distributions, and a `Dockerfile`_ 49 | available . 50 | 51 | .. _installer: https://github.com/bauerj/electrumx-installer 52 | .. _Dockerfile: https://github.com/lukechilds/docker-electrumx 53 | 54 | Documentation 55 | ============= 56 | 57 | .. toctree:: 58 | 59 | features 60 | changelog 61 | HOWTO 62 | environment 63 | protocol 64 | peer_discovery 65 | rpc-interface 66 | architecture 67 | authors 68 | 69 | Indices and tables 70 | ================== 71 | 72 | * :ref:`genindex` 73 | * :ref:`search` 74 | -------------------------------------------------------------------------------- /tests/lib/test_tx.py: -------------------------------------------------------------------------------- 1 | import electrumx.lib.tx as tx_lib 2 | 3 | tests = [ 4 | "020000000192809f0b234cb850d71d020e678e93f074648ed0df5affd0c46d3bcb177f" 5 | "9ccf020000008b483045022100c5403bcf86c3ae7b8fd4ca0d1e4df6729cc1af05ff95" 6 | "d9726b43a64b41dd5d9902207fab615f41871885aa3062fc7d8f8d9d3dcbc2e4867c5d" 7 | "96dd7a176b99e927924141040baa4271a82c5f1a09a5ea63d763697ca0545b6049c4dd" 8 | "8e8d099dd91f2da10eb11e829000a82047ac56969fb582433067a21c3171e569d1832c" 9 | "34fdd793cfc8ffffffff030000000000000000226a20195ce612d20e5284eb78bb28c9" 10 | "c50d6139b10b77b2d5b2f94711b13162700472bfc53000000000001976a9144a519c63" 11 | "f985ba5ab8b71bb42f1ecb82a0a0d80788acf6984315000000001976a9148b80536aa3" 12 | "c460258cda834b86a46787c9a2b0bf88ac00000000", 13 | "0200000003ee933f16c93d433bfd45426e94ddb4c0406aecac66f1c23a9e55151430c2" 14 | "b4c4a70000006b483045022100c940624ddbefcf86f3a3d820347de9c695204583a3ce" 15 | "9977c45cb1d6f69d577202205e0d9e9c0bfc2993160edad71cd1474b6308d990a89a54" 16 | "c80d7c62295edd2a394121039999e7c52a1447916b2af30478669c4e6e3ce52b895da7" 17 | "78f0b46b73f8ea6f00feffffff30be91ac83fee19e06304732027a39f9ec9018c5aae1" 18 | "159bf1c5de53dea61785fc0200006a473044022057cee17c3e123864336bdd6373e4bc" 19 | "0bf030ca70dd078520705930a4168610d0022061fdeedfbeb0b89c3b20db220799978b" 20 | "c94e11e4155b810b8b59df019b3f1859412103e2074e4387eeb3b1dec2fc8b953b0c13" 21 | "c53d0d3b7b676e1b3ca75ee606ecf750feffffffdd462d60e51be69451f06c36ba4490" 22 | "aaad8ebf40501dd27341e9c64a5f633324000000006a473044022043511ab874f0037c" 23 | "5726b1efc69fcdb638fac74ab3f6766eb80947cff8c1175a02200606ccf8db60f56e77" 24 | "03f6d5b81f5f5141f5b029a7b5a35700907f368b7e0f024121038daab4c77b9a428efb" 25 | "23aa2ccadc5c5332f299f5e51d1f1600524c0313ab9ec2feffffff04fe66c200000000" 26 | "001976a914a8c27c62fafec0a07d28b3b905912e9f385a7f1a88ac2a3b560800000000" 27 | "1976a914c20992e92764ef7e33e2cf6ed538d34b18a1fff888ac00a3e1110000000019" 28 | "76a9147137cd9dc7aad0d1cbc8e0ec12aae753d1acfaf488ac5d2b0f00000000001976" 29 | "a914c10084f449e968b0d71ee23a308954c68d8c97e488ac28620700" 30 | ] 31 | 32 | def test_tx_serialiazation(): 33 | for test in tests: 34 | test = bytes.fromhex(test) 35 | deser = tx_lib.Deserializer(test) 36 | tx = deser.read_tx() 37 | assert tx.serialize() == test 38 | -------------------------------------------------------------------------------- /tests/blocks/adcoin_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "acc_checkpoint": "00000000000000000000000000000000000000000000000000000000000 00000", 3 | "bits": "1a477df5", 4 | "chainwork": "000000000000000000000000000000000000000000000000010eac567bcfcc52 ", 5 | "confirmations": 504937, 6 | "difficulty": 234668.9893690928, 7 | "hash": "79c4194bc0debc2e0d272ff6bd3ec87536867f0ff58f6a5da2d99264529a1df9", 8 | "height": 1000, 9 | "mediantime": 1548124552, 10 | "merkleroot": "405bc6a405568e1841201ba46c1b8973643de75bea20ecfa67891910bd4bf5e 4", 11 | "moneysupply": 31004994.9999809, 12 | "nextblockhash": "836e71740b533cad28d72cfa5025993df6e69a8da5064b3d77d1ccc6607a 0da8", 13 | "nonce": 0, 14 | "previousblockhash": "a7af209eccf55cec92bf06723c53072bf7a6b9396a678e97193ec6c5 f45b2e0b", 15 | "size": 470, 16 | "time": 1548124802, 17 | "tx": [ 18 | "df275d713fcf5e78e7e8369d640201d46736c0d2255e31ce45bd5aa0206f861f", 19 | "7cefb3db05be979676982fb8dc46de4636a1bb8b4d060fc71138fbf887606a9f" 20 | ], 21 | "version": 5, 22 | "zADCOINsupply": { 23 | "1": 0.0, 24 | "10": 0.0, 25 | "100": 0.0, 26 | "1000": 0.0, 27 | "5": 0.0, 28 | "50": 0.0, 29 | "500": 0.0, 30 | "5000": 0.0, 31 | "total": 0.0 32 | }, 33 | "block": "050000000b2e5bf4c5c63e19978e676a39b9a6f72b07533c7206bf92ec5cf5cc9e20afa7e4f54bbd10198967faec20ea5be73d6473891b6ca41b2041188e5605a4c65b408282465cf57d471a0000000000000000000000000000000000000000000000000000000000000000000000000201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0502e8030101ffffffff010000000000000000000000000001000000011cd5c00a4a0f2fac5988ebdbfbd50742fc6700af20becfb8c0fefdd77240932f0200000048473044022009bf9a4e9c7060c00faee38da9f82fa9d41c75323b096aadb34c7efd91e3ec81022053f6bed2d56733d71f9d788b4a2635bbd964fae0de94cd3d1af68fcaaa87e28601ffffffff03000000000000000000c0a681f9c0020000232103454747c0d549d75b317b88cf05ba547270c600a5ced65fd07a6a358ea265ad44ac00e990f9c0020000232103454747c0d549d75b317b88cf05ba547270c600a5ced65fd07a6a358ea265ad44ac00000000473045022100b53ef914ef998990b9dcebbbe1607f898c929a716ca37bc67dfb2e5bdac9edd50220391e1033a3f4f5ff13cbc1a28ee5be57372ff0e13373032b690c4b30938a4e63" 34 | } -------------------------------------------------------------------------------- /tests/blocks/bata_mainnet_1000.json: -------------------------------------------------------------------------------- 1 | { 2 | "bits": "1c027c92", 3 | "chainwork": "000000000000000000000000000000000000000000000000000457e92ae77396", 4 | "confirmations": 1470603, 5 | "difficulty": 102.9501356144377, 6 | "hash": "455490f1892e605c38d214613911d86f13d1387f8e5360b50b7dfdb6d928f880", 7 | "height": 1000, 8 | "mediantime": 1431399204, 9 | "merkleroot": "5c147d3f1dcacd9a558e00962d5d7e5232a8f767cc0626de6e4c0a8c05e8682b", 10 | "nTx": 3, 11 | "nextblockhash": "2897fdef809bc73b80b884a327b0ecde7334848e1d3fdba73dcb42e107024131", 12 | "nonce": 91364951, 13 | "previousblockhash": "81b124c35efd6d6bcb17ea27a59da44a3a47c1dd2086e6084c980a3d762ae2a4", 14 | "size": 656, 15 | "strippedsize": 656, 16 | "time": 1431399496, 17 | "tx": [ 18 | "fec0b1a557d5870be78f2159a2d9b2ea9d9a62c524d5b8ca873a3842dda35b26", 19 | "8d196eb09483272c3c380e9b607ea34d853a034d4c653660bbe0b20cadb7f560", 20 | "75b0a549911262dc72773a2c7ff7802ca54ffed082cdcde36877cee04c60e825" 21 | ], 22 | "version": 2, 23 | "versionHex": "00000002", 24 | "weight": 2624, 25 | "block": "02000000a4e22a763d0a984c08e68620ddc1473a4aa49da527ea17cb6b6dfd5ec324b1812b68e8058c0a4c6ede2606cc67f7a832527e5d2d96008e559acdca1d3f7d145c486c5155927c021c571e72050301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2602e803062f503253482f04496c51550858000277d12000000d2f6e6f64655374726174756d2f0000000001d0000395000000001976a91410afb18a0ef71a8a6753066e6f58c8fcfcde411988ac0000000001000000013618a0825b6b7c88407ec09f353979ea5ab8eb717fe9c4080c277d7b365996da010000006b48304502202ded546a7630d5e8f0b1bc97d88ecf5113a1bfe5632256781e6b7a6e11309444022100fe2c46b17be6b95c222d88c19b537a2a80c494d8e25b6cb2b61d23fbea55e209012102fabf61b27ec61346d0c4cde192988828306899542f18d4f0f93c142122245364ffffffff028b579038000000001976a9148b593d0240b97c4b7f5bfb4d922afe527c523b0d88ac4a659725000000001976a914352b16d2a158a240428bb2c8e76225220af0fefd88ac0000000001000000010851ac02a455737e4eb7811cf43609700dac4bf194001468a0bbf68cf56b16fe010000006b483045022100b597c444a2c2945fd511b0afa6f0bbd62479274cfe99158b41c4c0c5d2d2046f02204de8e10d00257f03b4f484261afc47e16ddbc2963047339dfce5fc8fd32036160121024570e2d24e27e1b1474d724c4143f645f229171d0380fc10eb62be62b6392d4cffffffff0256d25314000000001976a91422eb0cf9da17719ce85df16df8dfddb797c1f71788ac0c53150f000000001976a914e2a0bbe2a46fab50a987a151cc113a7b11405ba288ac00000000" 26 | } 27 | -------------------------------------------------------------------------------- /tests/blocks/electra_mainnet_120000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "ed87415eec682bd45915cf9b58c3240937373b5904e2e781504960930400228d", 3 | "size": 821, 4 | "height": 120000, 5 | "version": 6, 6 | "merkleroot": "9ff8c579c4929aa1aa1e6a9a704e36afa7e075f6f555dfa915af27f5c6fcb9c0", 7 | "tx": [ 8 | "7e95106d7f2f9ce046c97e991aedb13ca631633b5d93aea216dc24ab05303a11", 9 | "3f4cfbc123c934ab983c989e3ed81cc8a3296a696474a589e7fae45cc22a14fa", 10 | "793b99eb068bd837743e5730b75739254095efc0ea70a1480e8488c73050e6de" 11 | ], 12 | "time": 1539998087, 13 | "nonce": 0, 14 | "bits": "1b094a51", 15 | "difficulty": 7054.132896662391, 16 | "chainwork": "0000000000000000000000000000000000000000000000005e21e43dfb3d33a6", 17 | "previousblockhash": "3471e0e3d5bda84109f9e9a0676d36d4e2448c4ae22283af8b117300380c95c8", 18 | "nextblockhash": "5488c63f091160dd27a070fdc6a4a261d838dbdd84570f6170f6b9fa34ba8a90", 19 | "block": "06000000c8950c380073118baf8322e24a8c44e2d4366d67a0e9f90941a8bdd5e3e07134c0b9fcc6f527af15a9df55f5f675e0a7af364e709a6a1eaaa19a92c479c5f89f8781ca5b514a091b0000000003010000008781ca5b010000000000000000000000000000000000000000000000000000000000000000ffffffff0403c0d401ffffffff0100000000000000000000000000010000008781ca5b01a943749d1b322c6cc73d09aed39ac5f98b7d949663a65e11b450d73854023cc1010000004847304402205b7c7fb4ef30a134e803521ee883e1439f6425f5850a0758382a04ba3bd133900220289f23f63ada2785d22b150f88afe8ab037766e37e76b00a726558151dea0e2101ffffffff03000000000000000000c0ce822556db0000232102755f8f296fc1e5e643b9f90415144f9311e029d8e284bdaac838b45c3d32cd55ac88e0832556db0000232102755f8f296fc1e5e643b9f90415144f9311e029d8e284bdaac838b45c3d32cd55ac0000000001000000fc80ca5b029ec3ff99757227d7aafb90829b56307716b250ac0967e8574661a99e036db165000000006a473044022051edc0e5ab66205d6e28d7c02f41458059d109823a7a2d2007bdb274c48dd68a02200654c59f234fa370a602dd45ed6039c09057d70ed337d1d03215bd8e082bd5f80121022adbff4e8ad66004fe7ab9a72cac0f53b64cad3ecba683c923a22a16f23a4683ffffffffcb3100ffd79b9a3ff3da51d68a6768473f57f6e4b9909e818c76f6041e7a2a7c000000006b483045022100bace32c50fa6ba9840d7685ac2a85afaf0214b6239082b023f53a411f45ca4b702205f0d12ec1ec101df8e3a37f5288daaa9d312f72d2b822d4dd551b331e5ac4e6001210206970eaf01f12e516da6ced85bf623c59450676a42c2ea3b40f7179974975252ffffffff021cd46e0f000000001976a91492dd2d2a436680ff82c814da03477a3d1be295e188ac7aa91989020000001976a9140a237dd29cc896e96ad996aa689056575c48bb0388ac00000000463044022026caa49a29231a9490215d13843dbe5c8067f4a92f9487cff3d6f77341896c0302206ce90a5724d699d29a5e32a12c85d0d7ea49a7279f14a1c9611850866b8ad904" 20 | } -------------------------------------------------------------------------------- /tests/blocks/xaya_mainnet_neoscrypt_400021.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "c53c371f253426f9e582e3de9d9f1f03e5e40e771aa96953c502ebe2222bb013", 3 | "confirmations": 630231, 4 | "strippedsize": 582, 5 | "size": 618, 6 | "weight": 2364, 7 | "height": 400021, 8 | "version": 536870912, 9 | "versionHex": "20000000", 10 | "merkleroot": "28e89aa0dbc0f1cacccb3ab402d7891abf636165b2cfd1b018e3b675468d8855", 11 | "tx": [ 12 | "43b8bea316ac7df3eeadd3b941808b100d66d424464af2dfb211773cd8dc0752", 13 | "4d581281a17e679df9f109e0b0e7c59efacfe50860a733d1f06a23fa08540b6d" 14 | ], 15 | "time": 1544070336, 16 | "mediantime": 1544070221, 17 | "nonce": 0, 18 | "chainwork": "00000000000000000000000000000000000000000011cc010c812da27182ad31", 19 | "nTx": 2, 20 | "powdata": { 21 | "algo": "neoscrypt", 22 | "mergemined": false, 23 | "bits": "1d016293", 24 | "difficulty": 0.7219816901873947, 25 | "fakeheader": "00000000000000000000000000000000000000000000000000000000000000000000000013b02b22e2eb02c55369a91a770ee4e5031f9f9ddee382e5f92634251f373cc50000000000000000cd8740e3" 26 | }, 27 | "rngseed": "ae81fb25abb6328512e52af04b7e36e03ed545061ad000e6b07ed86e08551cb1", 28 | "previousblockhash": "ab66782b9aa7edd86912bde739b7954517ef82907e7df2b910c6720b69c197fb", 29 | "nextblockhash": "adfaac85095ab7f6c565a4c7af76229abcfd07fb0a0199383c3d65b5294f471a", 30 | "block": "00000020fb97c1690b72c610b9f27d7e9082ef174595b739e7bd1269d8eda79a2b7866ab55888d4675b6e318b0d1cfb2656163bf1a89d702b43acbcccaf1c0dba09ae828c0a4085c0000000000000000029362011d00000000000000000000000000000000000000000000000000000000000000000000000013b02b22e2eb02c55369a91a770ee4e5031f9f9ddee382e5f92634251f373cc50000000000000000cd8740e302020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0603951a060101ffffffff02404af6050000000023210259b332f71852584ffcbb7701e76721adf988ba12cdbe1091b7cfd7b36ec93869ac0000000000000000266a24aa21a9edb0c34f0b713a6807ef08628f5db0c5c0037c39b2f6d208b5e08da25b13cfb2e501200000000000000000000000000000000000000000000000000000000000000000000000000200000001ebd8995be8b4ebc8ce2f082bf577818a5abf667afd09f5dcafd1c8790a63b391010000006a4730440220442743b7fc92e9904d3910cc61f5077a787b78f763b9efbe56c9306cbb6e2a77022004fae47d54cb45728894c511611cb66513cf01a04471a4b53821ba4cf386f19901210319f13957ea073a98708f09531a10d0f4e4f42a82102c4fead7c69ba4b4974e6bfeffffff0240420f0000000000445108702f444f474341541e7b2267223a7b2274667472223a5b7b226f223a332c226d223a317d5d7d7d6d7576a91452df4afbfbc31db12150f6e2038fa43c55aeafe988ac04f7fc03000000001976a914711acc7fc374161611ac25fa4f3d264940bcbdd288ac931a0600" 31 | } 32 | -------------------------------------------------------------------------------- /electrumx/lib/env_base.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Neil Booth 2 | # 3 | # All rights reserved. 4 | # 5 | # See the file "LICENCE" for information about the copyright 6 | # and warranty status of this software. 7 | 8 | '''Class for server environment configuration and defaults.''' 9 | 10 | 11 | from os import environ 12 | 13 | from electrumx.lib.util import class_logger 14 | 15 | 16 | class EnvBase: 17 | '''Wraps environment configuration.''' 18 | 19 | class Error(Exception): 20 | pass 21 | 22 | def __init__(self): 23 | self.logger = class_logger(__name__, self.__class__.__name__) 24 | self.allow_root = self.boolean('ALLOW_ROOT', False) 25 | self.loop_policy = self.event_loop_policy() 26 | 27 | @classmethod 28 | def default(cls, envvar, default): 29 | return environ.get(envvar, default) 30 | 31 | @classmethod 32 | def boolean(cls, envvar, default): 33 | default = 'Yes' if default else '' 34 | return bool(cls.default(envvar, default).strip()) 35 | 36 | @classmethod 37 | def required(cls, envvar): 38 | value = environ.get(envvar) 39 | if value is None: 40 | raise cls.Error(f'required envvar {envvar} not set') 41 | return value 42 | 43 | @classmethod 44 | def integer(cls, envvar, default): 45 | value = environ.get(envvar) 46 | if value is None: 47 | return default 48 | try: 49 | return int(value) 50 | except Exception: 51 | raise cls.Error(f'cannot convert envvar {envvar} value {value} to ' 52 | f'an integer') 53 | 54 | @classmethod 55 | def custom(cls, envvar, default, parse): 56 | value = environ.get(envvar) 57 | if value is None: 58 | return default 59 | try: 60 | return parse(value) 61 | except Exception as e: 62 | raise cls.Error( 63 | f'cannot parse envvar {envvar} value {value}' 64 | ) from e 65 | 66 | @classmethod 67 | def obsolete(cls, envvars): 68 | bad = [envvar for envvar in envvars if environ.get(envvar)] 69 | if bad: 70 | raise cls.Error(f'remove obsolete environment variables {bad}') 71 | 72 | def event_loop_policy(self): 73 | policy = self.default('EVENT_LOOP_POLICY', None) 74 | if policy is None: 75 | return None 76 | if policy == 'uvloop': 77 | import uvloop 78 | return uvloop.EventLoopPolicy() 79 | raise self.Error(f'unknown event loop policy "{policy}"') 80 | -------------------------------------------------------------------------------- /tests/blocks/bitcoinsv_mainnet_100000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506", 3 | "size": 957, 4 | "height": 100000, 5 | "merkleroot": "f3e94742aca4b5ef85488dc37c06c3282295ffec960994b2c0d5ac2a25a95766", 6 | "tx": [ 7 | "8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87", 8 | "fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4", 9 | "6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4", 10 | "e9a66845e05d5abc0ad04ec80f774a7e585c6e8db975962d069a522137b80c1d" 11 | ], 12 | "time": 1293623863, 13 | "nonce": 274148111, 14 | "bits": "1b04864c", 15 | "previousblockhash": "000000000002d01c1fccc21636b607dfd930d31d01c3a62104612a1719011250", 16 | "block": "0100000050120119172a610421a6c3011dd330d9df07b63616c2cc1f1cd00200000000006657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f337221b4d4c86041b0f2b57100401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff08044c86041b020602ffffffff0100f2052a010000004341041b0e8c2567c12536aa13357b79a073dc4444acb83c4ec7a0e2f99dd7457516c5817242da796924ca4e99947d087fedf9ce467cb9f7c6287078f801df276fdf84ac000000000100000001032e38e9c0a84c6046d687d10556dcacc41d275ec55fc00779ac88fdf357a187000000008c493046022100c352d3dd993a981beba4a63ad15c209275ca9470abfcd57da93b58e4eb5dce82022100840792bc1f456062819f15d33ee7055cf7b5ee1af1ebcc6028d9cdb1c3af7748014104f46db5e9d61a9dc27b8d64ad23e7383a4e6ca164593c2527c038c0857eb67ee8e825dca65046b82c9331586c82e0fd1f633f25f87c161bc6f8a630121df2b3d3ffffffff0200e32321000000001976a914c398efa9c392ba6013c5e04ee729755ef7f58b3288ac000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac000000000100000001c33ebff2a709f13d9f9a7569ab16a32786af7d7e2de09265e41c61d078294ecf010000008a4730440220032d30df5ee6f57fa46cddb5eb8d0d9fe8de6b342d27942ae90a3231e0ba333e02203deee8060fdc70230a7f5b4ad7d7bc3e628cbe219a886b84269eaeb81e26b4fe014104ae31c31bf91278d99b8377a35bbce5b27d9fff15456839e919453fc7b3f721f0ba403ff96c9deeb680e5fd341c0fc3a7b90da4631ee39560639db462e9cb850fffffffff0240420f00000000001976a914b0dcbf97eabf4404e31d952477ce822dadbe7e1088acc060d211000000001976a9146b1281eec25ab4e1e0793ff4e08ab1abb3409cd988ac0000000001000000010b6072b386d4a773235237f64c1126ac3b240c84b917a3909ba1c43ded5f51f4000000008c493046022100bb1ad26df930a51cce110cf44f7a48c3c561fd977500b1ae5d6b6fd13d0b3f4a022100c5b42951acedff14abba2736fd574bdb465f3e6f8da12e2c5303954aca7f78f3014104a7135bfe824c97ecc01ec7d7e336185c81e2aa2c41ab175407c09484ce9694b44953fcb751206564a9c24dd094d42fdbfdd5aad3e063ce6af4cfaaea4ea14fbbffffffff0140420f00000000001976a91439aa3d569e06a1d7926dc4be1193c99bf2eb9ee088ac00000000" 17 | } -------------------------------------------------------------------------------- /docs/architecture.rst: -------------------------------------------------------------------------------- 1 | Architecture 2 | ============ 3 | 4 | .. image:: https://docs.google.com/drawings/d/1Su_DR2c8__-4phm12hAzV65fL2tNm_1IhKr4XivkW6Q/pub?w=720&h=540 5 | :target: https://docs.google.com/drawings/d/1Su_DR2c8__-4phm12hAzV65fL2tNm_1IhKr4XivkW6Q/pub?w=960&h=720 6 | 7 | Env 8 | --- 9 | 10 | Holds configuration taken from the environment, with apprioriate 11 | defaulting appropriately. Generally passed to the constructor of 12 | other components which take their settings from it. 13 | 14 | Controller 15 | ---------- 16 | 17 | The central part of the server process initialising and coordinating 18 | all the others. Manages resource usage. 19 | 20 | 21 | LocalRPC 22 | -------- 23 | 24 | Handles local JSON RPC connections querying ElectrumX server state. 25 | Started when the ElectrumX process starts. 26 | 27 | ElectrumX 28 | --------- 29 | 30 | Handles JSON Electrum client connections over TCP or SSL. One 31 | instance per client session. Should be the only component concerned 32 | with the details of the Electrum wire protocol. 33 | 34 | Not started until the Block Processor has caught up with bitcoind. 35 | 36 | Daemon 37 | ------ 38 | 39 | Encapsulates the RPC wire protocol with bitcoind for the whole server. 40 | Transparently handles temporary bitcoind connection errors, and fails 41 | over if necessary. 42 | 43 | Notifies the Mempool when the list of mempool transaction hashes is 44 | updated. 45 | 46 | 47 | Block Processor 48 | --------------- 49 | 50 | Responsible for managing block chain state (UTXO set, history, 51 | transaction and undo information) and for handling block chain 52 | reorganisations. 53 | 54 | When caught up, processes new blocks as they are found, and flushes 55 | the updates to the Database immediately. 56 | 57 | When syncing uses caches for in-memory state updates since the prior 58 | flush. Occasionally flushes state to the storage layer when caches 59 | get large. 60 | 61 | Prefetcher 62 | ---------- 63 | 64 | Cooperates with the Block Processor to asynchronously prefetch blocks 65 | from bitcoind. Once it has caught up it additionally asks the Daemon 66 | to refresh its view of bitcoind's mempool transaction hashes. Serves 67 | blocks to the Block Processor via a queue. 68 | 69 | Mempool 70 | ------- 71 | 72 | Handles all the details of maintaining a representation of bitcoind's 73 | mempool state. Obtains the list of current mempool transaction hashes 74 | from the Daemon when notified by the Prefetcher. 75 | 76 | Notifies the Controller that addresses have been touched when the 77 | mempool refreshes (or implicitly when a new block is found). 78 | 79 | Database 80 | -------- 81 | 82 | The underlying data store, made up of the DB backend (such as 83 | `leveldb`) and the host filesystem. 84 | -------------------------------------------------------------------------------- /electrumx_compact_history: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # 3 | # Copyright (c) 2017, Neil Booth 4 | # 5 | # All rights reserved. 6 | # 7 | # See the file "LICENCE" for information about the copyright 8 | # and warranty status of this software. 9 | 10 | '''Script to compact the history database. This should save space and 11 | will reset the flush counter to a low number, avoiding overflow when 12 | the flush count reaches 65,536. 13 | 14 | This needs to lock the database so ElectrumX must not be running - 15 | shut it down cleanly first. 16 | 17 | It is recommended you run this script with the same environment as 18 | ElectrumX. However it is intended to be runnable with just 19 | DB_DIRECTORY and COIN set (COIN defaults as for ElectrumX). 20 | 21 | If you use daemon tools, you might run this script like so: 22 | 23 | envdir /path/to/the/environment/directory ./compact_history.py 24 | 25 | Depending on your hardware this script may take up to 6 hours to 26 | complete; it logs progress regularly. 27 | 28 | Compaction can be interrupted and restarted harmlessly and will pick 29 | up where it left off. However, if you restart ElectrumX without 30 | running the compaction to completion, it will not benefit and 31 | subsequent compactions will restart from the beginning. 32 | ''' 33 | 34 | import asyncio 35 | import logging 36 | import sys 37 | import traceback 38 | from os import environ 39 | 40 | from electrumx import Env 41 | from electrumx.server.db import DB 42 | 43 | 44 | async def compact_history(): 45 | if sys.version_info < (3, 7): 46 | raise RuntimeError('Python >= 3.7 is required to run ElectrumX') 47 | 48 | environ['DAEMON_URL'] = '' # Avoid Env erroring out 49 | env = Env() 50 | db = DB(env) 51 | await db.open_for_compacting() 52 | 53 | assert not db.first_sync 54 | history = db.history 55 | # Continue where we left off, if interrupted 56 | if history.comp_cursor == -1: 57 | history.comp_cursor = 0 58 | 59 | history.comp_flush_count = max(history.comp_flush_count, 1) 60 | limit = 8 * 1000 * 1000 61 | 62 | while history.comp_cursor != -1: 63 | history._compact_history(limit) 64 | 65 | # When completed also update the UTXO flush count 66 | db.set_flush_count(history.flush_count) 67 | 68 | def main(): 69 | logging.basicConfig(level=logging.INFO) 70 | logging.info('Starting history compaction...') 71 | loop = asyncio.get_event_loop() 72 | try: 73 | loop.run_until_complete(compact_history()) 74 | except Exception: 75 | traceback.print_exc() 76 | logging.critical('History compaction terminated abnormally') 77 | else: 78 | logging.info('History compaction complete') 79 | 80 | 81 | if __name__ == '__main__': 82 | main() 83 | -------------------------------------------------------------------------------- /tests/blocks/emercoin_mainnet_255544.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "0106a1f3a8f9ece5e213eb6e62d9b647724b7785bdc6b51737910a13dbbc3360", 3 | "size": 1188, 4 | "height": 255544, 5 | "merkleroot": "6b72c4658cbc026c758d10d8bd1e434391d2b5eacda7b92e4b14901e18f59ce0", 6 | "tx": [ 7 | "6b72c4658cbc026c758d10d8bd1e434391d2b5eacda7b92e4b14901e18f59ce0" 8 | ], 9 | "time": 1507384461, 10 | "nonce": 0, 11 | "bits": "1800d0a5", 12 | "previousblockhash": "c901fae6103621bd2d946d97eb2946ef8a0d5a6f0f524716d4783c6899f9c6e4", 13 | "block": "05019a02e4c6f999683c78d41647520f6f5a0d8aef4629eb976d942dbd213610e6fa01c9e09cf5181e90144b2eb9a7cdeab5d29143431ebdd8108d756c02bc8c65c4726b8ddcd859a5d00018000000000100000087e0d859010000000000000000000000000000000000000000000000000000000000000000ffffffff610302750741d676381fc9c77841d676381ee793a52f4254432e544f502f4e59412f4542312f4144362ffabe6d6dbbe5aa12107008a60a220800a220fd068f6430b8a531c33d0db347272dc5292e8000000000000000cd006407894e000000000000ffffffff024242554e000000001976a914ba507bae8f1643d2556000ca26b9301b9069dc6b88ac0000000000000000266a24aa21a9ed3782874124388ef2e919659287e455d702146d547b41a56d12b1b89f40cbab6200000000d9bedd194a44d85d2b4f6380bcd5e11ea80bf74706dd0d0000000000000000000bca926bdaef806e6b02edf26f327b9323db51805976b55bb2281b833d938e5f7772473fcebf7e7b4af337949ef79c02a4081b34dff892f5ff7bfa6c9e562a41b430f88d80c6f3b9a31e373494b6c936edf1b11554ca685b6587c1c10c9723f17acc5d3e584ca249f1976cd8e9a7f7ce4b3e9bcaab49f604f8a1a1085872031ad7f7033256c58640d08109746085baa7c12a0653834bea13d56190d664707f575e6b80b08ae2f16be8f1a6f9c46231a66b75e82a6dd1fd628217c17eb332c0568812be071dc9aefe18450a400d00a75702c58fa7f48126afd1bfc1c32896fd022c18671829b85dcba51377276a73b36cb8d6c11a3c0de631aebb40776b56c6767d55324d7731ea510bc02a616a1f1c42cac707ee532ff1e1bbded068681194c40e02454362bedc584b4021986ed8f6fec206f143cd579b88b8f562969bc58d2e001c300be2f3c7f7026825e386608a37b2c6af981b770b784f5771cbb4c27d3df900000000070000000000000000000000000000000000000000000000000000000000000000e2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf97d24db2bfa41474bfb2f877d688fac5faa5e10a2808cf9de307370b93352e54894857d3e08918f70395d9206410fbfa942f1a889aa5ab8188ec33c2f6e207dc7f537f8222340379c1ec62fdf65fb8a39565503229bed1f818f38eb0bf41142f0ad83a7857080ddaac962e156e92e3f07d488bc7f06ca9c070ec0daeb7370ee88cbea15ce5bbf2b83da04eaaba12a4a398f72ff5c32813ff2e489d2f1337ca3dd1000000000000020638c009db3fb62933dd2b3be4602c2513892fa53ccf4f500000000000000000025dd3d6f8d741230a4b5b1847cbb2f9dfe822fc3832989fa0d409e83418ed3507ae0d85973fa0018d8e2ffe701010000008ddcd859010000000000000000000000000000000000000000000000000000000000000000ffffffff060338e6030101ffffffff01201b4700000000002321028caf0472ca07d4534a879aeab480531a68f47753e46118986882ef33b689e788ac0000000046304402201fc3bf8154434f37627333b3b228a4dbf95bcd5fc9def51be0afd40b6b010cc7022045e327bbd7460dfece08514e699afffb54c6881f352f67b5a6e7e50f03e31a1c" 14 | } 15 | -------------------------------------------------------------------------------- /tests/test_blocks.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, the ElectrumX authors 2 | # 3 | # All rights reserved. 4 | # 5 | # The MIT License (MIT) 6 | # 7 | # Permission is hereby granted, free of charge, to any person obtaining 8 | # a copy of this software and associated documentation files (the 9 | # "Software"), to deal in the Software without restriction, including 10 | # without limitation the rights to use, copy, modify, merge, publish, 11 | # distribute, sublicense, and/or sell copies of the Software, and to 12 | # permit persons to whom the Software is furnished to do so, subject to 13 | # the following conditions: 14 | # 15 | # The above copyright notice and this permission notice shall be 16 | # included in all copies or substantial portions of the Software. 17 | # 18 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19 | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21 | # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22 | # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24 | # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 | # and warranty status of this software. 26 | 27 | import json 28 | import os 29 | from binascii import unhexlify 30 | 31 | import pytest 32 | 33 | from electrumx.lib.coins import Coin 34 | from electrumx.lib.hash import hex_str_to_hash 35 | 36 | BLOCKS_DIR = os.path.join( 37 | os.path.dirname(os.path.realpath(__file__)), 'blocks') 38 | 39 | # Find out which db engines to test 40 | # Those that are not installed will be skipped 41 | blocks = [] 42 | 43 | for name in os.listdir(BLOCKS_DIR): 44 | try: 45 | name_parts = name.split("_") 46 | coin = Coin.lookup_coin_class(name_parts[0], name_parts[1]) 47 | with open(os.path.join(BLOCKS_DIR, name)) as f: 48 | blocks.append((coin, json.load(f))) 49 | except Exception as e: 50 | blocks.append(pytest.fail(name)) 51 | 52 | 53 | @pytest.fixture(params=blocks) 54 | def block_details(request): 55 | return request.param 56 | 57 | 58 | def test_block(block_details): 59 | coin, block_info = block_details 60 | 61 | raw_block = unhexlify(block_info['block']) 62 | block = coin.block(raw_block, block_info['height']) 63 | 64 | try: 65 | assert coin.header_hash( 66 | block.header) == hex_str_to_hash(block_info['hash']) 67 | except ImportError as e: 68 | pytest.skip(str(e)) 69 | assert (coin.header_prevhash(block.header) 70 | == hex_str_to_hash(block_info['previousblockhash'])) 71 | assert len(block_info['tx']) == len(block.transactions) 72 | for n, (tx, txid) in enumerate(block.transactions): 73 | assert txid == hex_str_to_hash(block_info['tx'][n]) 74 | -------------------------------------------------------------------------------- /tests/transactions/xaya_mainnet_namereg_a32f38.json: -------------------------------------------------------------------------------- 1 | { 2 | "txid": "a32f38a463b75f2cb9955f5660063e7888f9120b40f27312b65e53fad6a226fd", 3 | "hash": "a32f38a463b75f2cb9955f5660063e7888f9120b40f27312b65e53fad6a226fd", 4 | "version": 2, 5 | "size": 240, 6 | "vsize": 240, 7 | "weight": 960, 8 | "locktime": 0, 9 | "vin": [ 10 | { 11 | "txid": "c87eb7b9c71146a18f8ebaea93b74bfeb4795b265f151ba5a1e62ef32017bc34", 12 | "vout": 0, 13 | "scriptSig": { 14 | "asm": "3045022100df2c9fdfa19e145a3d1f3b995e2925e6270f02dd13a9d5e79edc0bf7841517d40220722d8c694a21890bb24b82530f7e553371b9123d1e0e8c1ad818fe87c53e3cbb[ALL] 03a2bfae3cc2b43c7ac5e8ae402e1552b9edca7a2ff73ac1950ca52dae73791e95", 15 | "hex": "483045022100df2c9fdfa19e145a3d1f3b995e2925e6270f02dd13a9d5e79edc0bf7841517d40220722d8c694a21890bb24b82530f7e553371b9123d1e0e8c1ad818fe87c53e3cbb012103a2bfae3cc2b43c7ac5e8ae402e1552b9edca7a2ff73ac1950ca52dae73791e95" 16 | }, 17 | "sequence": 4294967294 18 | } 19 | ], 20 | "vout": [ 21 | { 22 | "value": 1996928100, 23 | "n": 0, 24 | "scriptPubKey": { 25 | "asm": "OP_DUP OP_HASH160 5026b54aec9036aaf02473481356acb3fe45846a OP_EQUALVERIFY OP_CHECKSIG", 26 | "hex": "76a9145026b54aec9036aaf02473481356acb3fe45846a88ac", 27 | "reqSigs": 1, 28 | "type": "pubkeyhash", 29 | "addresses": [ 30 | "CPmgzsvaWeSNvXd5CNfzSLnX2ymjJ7jwtw" 31 | ] 32 | } 33 | }, 34 | { 35 | "value": 1000000, 36 | "n": 1, 37 | "scriptPubKey": { 38 | "nameOp": { 39 | "op": "name_register", 40 | "name": "p/domob", 41 | "name_encoding": "utf8", 42 | "value": "{}", 43 | "value_encoding": "ascii" 44 | }, 45 | "asm": "OP_NAME_REGISTER 702f646f6d6f62 32123 OP_2DROP OP_DROP OP_DUP OP_HASH160 eed2f5ecba300e6137c3a966d60cab012b490e01 OP_EQUALVERIFY OP_CHECKSIG", 46 | "hex": "5107702f646f6d6f62027b7d6d7576a914eed2f5ecba300e6137c3a966d60cab012b490e0188ac", 47 | "reqSigs": 1, 48 | "type": "pubkeyhash", 49 | "addresses": [ 50 | "CeEg7VvAJ6rtz7MQ9sbkmEEb4zxRbSU4JT" 51 | ] 52 | } 53 | } 54 | ], 55 | "hex": "020000000134bc1720f32ee6a1a51b155f265b79b4fe4bb793eaba8e8fa14611c7b9b77ec8000000006b483045022100df2c9fdfa19e145a3d1f3b995e2925e6270f02dd13a9d5e79edc0bf7841517d40220722d8c694a21890bb24b82530f7e553371b9123d1e0e8c1ad818fe87c53e3cbb012103a2bfae3cc2b43c7ac5e8ae402e1552b9edca7a2ff73ac1950ca52dae73791e95feffffff0264b40677000000001976a9145026b54aec9036aaf02473481356acb3fe45846a88ac40420f0000000000275107702f646f6d6f62027b7d6d7576a914eed2f5ecba300e6137c3a966d60cab012b490e0188ac00000000", 56 | "blockhash": "1efbbbe72b0198a68bd3a9f5d349f4bcb5d87c660262a6c6731c37b1cb61a73e", 57 | "confirmations": 1032707, 58 | "time": 1531484387, 59 | "blocktime": 1531484387 60 | } 61 | -------------------------------------------------------------------------------- /tests/transactions/namecoin_mainnet_0c6867.json: -------------------------------------------------------------------------------- 1 | { 2 | "txid": "0c686779a1dcc867039a3c71934d6cde487c4eabd9cd2efd0bdcf15262ed9886", 3 | "hash": "0c686779a1dcc867039a3c71934d6cde487c4eabd9cd2efd0bdcf15262ed9886", 4 | "version": 28928, 5 | "size": 280, 6 | "vsize": 280, 7 | "locktime": 421976, 8 | "vin": [ 9 | { 10 | "txid": "0b9468e87947debbf999ac9290fcd25af7eff5f4d6df4773be2a89fd31009078", 11 | "vout": 1, 12 | "scriptSig": { 13 | "asm": "304402203b3d10f8ba91fb477fdcbeb0354016bce97fcdf7d050191c7958a7d174ae4e76022064bd96fb14fcfc535320dd9eafd9a6c6dd9410937afa4fdb1064e2d8cc1110fa[ALL] 0421c34686d12da7331dcf876a61b58cdfa9bb892120fa8e699daac1333ad7325ed09a37432a414ccc2bed6506b3badd0413cd35469dcfda23ebadca86929f59c1", 14 | "hex": "47304402203b3d10f8ba91fb477fdcbeb0354016bce97fcdf7d050191c7958a7d174ae4e76022064bd96fb14fcfc535320dd9eafd9a6c6dd9410937afa4fdb1064e2d8cc1110fa01410421c34686d12da7331dcf876a61b58cdfa9bb892120fa8e699daac1333ad7325ed09a37432a414ccc2bed6506b3badd0413cd35469dcfda23ebadca86929f59c1" 15 | }, 16 | "sequence": 4294967294 17 | } 18 | ], 19 | "vout": [ 20 | { 21 | "value": 280480622, 22 | "n": 0, 23 | "scriptPubKey": { 24 | "asm": "OP_DUP OP_HASH160 b7db2908b47c32f4b8864caf2522d2eb1ed3d50b OP_EQUALVERIFY OP_CHECKSIG", 25 | "hex": "76a914b7db2908b47c32f4b8864caf2522d2eb1ed3d50b88ac", 26 | "reqSigs": 1, 27 | "type": "pubkeyhash", 28 | "address": "NDLWQGyHyhneB7ySsL6na2QBPK1T2i1WSQ" 29 | } 30 | }, 31 | { 32 | "value": 1000000, 33 | "n": 1, 34 | "scriptPubKey": { 35 | "nameOp": { 36 | "op": "name_new", 37 | "hash": "2dbe200657c5c3cce22f0637480865d5db3aaaac" 38 | }, 39 | "asm": "OP_NAME_NEW 2dbe200657c5c3cce22f0637480865d5db3aaaac OP_2DROP OP_DUP OP_HASH160 6985a7f580409d4fdaf223f34848212955d371eb OP_EQUALVERIFY OP_CHECKSIG", 40 | "hex": "51142dbe200657c5c3cce22f0637480865d5db3aaaac6d76a9146985a7f580409d4fdaf223f34848212955d371eb88ac", 41 | "reqSigs": 1, 42 | "type": "pubkeyhash", 43 | "address": "N6CKGNr6iBDriS6iwZBAFswM2auAQnjd5K" 44 | } 45 | } 46 | ], 47 | "hex": "007100000178900031fd892abe7347dfd6f4f5eff75ad2fc9092ac99f9bbde4779e868940b010000008a47304402203b3d10f8ba91fb477fdcbeb0354016bce97fcdf7d050191c7958a7d174ae4e76022064bd96fb14fcfc535320dd9eafd9a6c6dd9410937afa4fdb1064e2d8cc1110fa01410421c34686d12da7331dcf876a61b58cdfa9bb892120fa8e699daac1333ad7325ed09a37432a414ccc2bed6506b3badd0413cd35469dcfda23ebadca86929f59c1feffffff026ecbb710000000001976a914b7db2908b47c32f4b8864caf2522d2eb1ed3d50b88ac40420f00000000003051142dbe200657c5c3cce22f0637480865d5db3aaaac6d76a9146985a7f580409d4fdaf223f34848212955d371eb88ac58700600", 48 | "blockhash": "15b3979258287d26becc021b265bcccc964b9863d44a8a5802b9f6ce53d9509d", 49 | "confirmations": 170, 50 | "time": 1539845549, 51 | "blocktime": 1539845549 52 | } 53 | -------------------------------------------------------------------------------- /tests/blocks/litecoin_mainnet_900000.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "545127eacc261629ae25ada99c7aadc1a929aed2da32f95ef866333f37c11e49", 3 | "size": 1132, 4 | "height": 900000, 5 | "merkleroot": "11929e3e325f6346e9d24c0373dafbafcaaa7837aa862f33b7c529d457ca1229", 6 | "tx": [ 7 | "ad21fe3e94fd3da9a0920ed2fd112f7c805ac1b80274f4d999da3d2a5c6bd733", 8 | "ea3b27388e968c413ef6af47be2843d649979e9b721331f593287b8d486be230", 9 | "3b6b555a86471c5e5ee3d07838df04a6802f83b6f37c79922b86ef1983262d5e", 10 | "026f93ffe84775b6c42b660944d25f7224c31b1175db837b664db32cd42e2300", 11 | "7c274e298aa6feae7a0590dffca92d31b1f5f3697b26c6ceb477efc43f0afe39" 12 | ], 13 | "time": 1449526456, 14 | "nonce": 685998084, 15 | "bits": "1b014ec5", 16 | "previousblockhash": "93819e801bbdaec2698e3dda35e12be0a0004759c635924fda7f007a358848be", 17 | "block": "03000000be4888357a007fda4f9235c6594700a0e02be135da3d8e69c2aebd1b809e81932912ca57d429c5b7332f86aa3778aacaaffbda73034cd2e946635f323e9e9211b8046656c54e011b0480e3280501000000010000000000000000000000000000000000000000000000000000000000000000ffffffff6403a0bb0de4b883e5bda9e7a59ee4bb99e9b1bcfabe6d6d227c509f30b3ac49948323ce5974f89f6261ed913a701fc137bc08ead15179b940000000f09f909f4d696e6564206279206c6a6a38380000000000000000000000000000000000000000000000510000000176fa0795000000001976a914aa3750aa18b8a0f3f0590731e1fab934856680cf88ac5aa5893301000000015992d44c8d8790727c91055ce305e115373ff7fe32d632edc3f9939914b7d810000000006a47304402203ea789e265999b19b2155e4eb6135a50773d45836e1abb00a4959126c323e25d02207db24c9069683a6e4fc850a700717da08bf2c3ea80e8f3ee1ac75c1b702198800121033567eb9b5281b320bd8f20718b205e1808e7c0432d41991bdfad3eb5b53c49f9ffffffff02427e8837000000001976a914bc8d35412e239d91f9c95548afa15e22f094be3688ac0027b929000000001976a914b5e82238517f926b14467fbf8f90812b0eec8e5288ac000000000100000001ad3d610da30df966af2407b45bf0236a782f1e4444b829bf59da1679ceb16733000000006a47304402206b32468586635a1965fbb1c186799f1ccfce13549bd098845b97e75ea8bff473022021f35faf6e67428d51e58ed1895f9db2d40337d04e1b8819154c2bc71b0446af012102a740669302896fc4bdba32a951a67f95b3369fbc2ac97f1fda559999866d623bffffffff0245781300000000001976a9146f67216770c0af807e0597896a8c8ec306994e7b88ac80841e00000000001976a914b5e8223ec1e89b386cb5beb1c30cf165ac84e46388ac000000000100000001520f304eec49a1a9eeb0682da600b436a8dd43efc97ff4ed6ac2bcf0912e5caa000000006a473044022040218475e180db66cf71aa56668145b4f4d4d0a93b0e3777985039d87a53f881022047aaef5b4e262365c2dd2d7e1cbdf3016ff22468faef6104e4397540c199dfc6012103418a46f4534e7ec8a98146da6431550c370069777cacfdfbccc7a01f31abd1d0ffffffff02505bd425000000001976a9149f74e62f0f92663525050b56ad8b180048b4e80488ac408d1c1b000000001976a9149f7044d46304c187dc08d05864aeccb5a044e45588ac00000000010000000139c9bb7efca3fdd77ae18adf87614827d1c0bb1803a0d50ae42342e524ca99b7000000006a47304402205b75fd27c33c89346bc778d1369549b27f41ed0ded4947a19fb2884363a8ee7502206672bb1bd4e4a2a89cba62d1c5a93e1a6ae042f379e57380aebf14a693b42bea0121024f5b70c3309c77762c1b487f804c9666f5302545d7555d1808b63fdc9c17f840ffffffff01f3247d00000000001976a9149a20d4f533a7d7670cf14c77107dfd1eefddbd5388ac00000000" 18 | } -------------------------------------------------------------------------------- /tests/test_transactions.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, John L. Jegutanis 2 | # 3 | # All rights reserved. 4 | # 5 | # See the file "LICENCE" for information about the copyright 6 | # and warranty status of this software. 7 | 8 | import json 9 | import os 10 | from binascii import unhexlify 11 | 12 | import pytest 13 | 14 | from electrumx.lib.coins import Coin, Namecoin 15 | from electrumx.lib.hash import hash_to_hex_str 16 | from electrumx.lib.script import OpCodes, Script 17 | 18 | TRANSACTION_DIR = os.path.join( 19 | os.path.dirname(os.path.realpath(__file__)), 'transactions') 20 | 21 | # Find out which db engines to test 22 | # Those that are not installed will be skipped 23 | transactions = [] 24 | 25 | for name in os.listdir(TRANSACTION_DIR): 26 | try: 27 | name_parts = name.split("_") 28 | coinFound = Coin.lookup_coin_class(name_parts[0], name_parts[1]) 29 | with open(os.path.join(TRANSACTION_DIR, name)) as f: 30 | transactions.append((coinFound, json.load(f))) 31 | except Exception as e: 32 | transactions.append(pytest.fail(name)) 33 | 34 | 35 | @pytest.fixture(params=transactions) 36 | def transaction_details(request): 37 | return request.param 38 | 39 | 40 | def test_transaction(transaction_details): 41 | coin, tx_info = transaction_details 42 | 43 | raw_tx = unhexlify(tx_info['hex']) 44 | tx, tx_hash = coin.DESERIALIZER(raw_tx, 0).read_tx_and_hash() 45 | assert tx_info['txid'] == hash_to_hex_str(tx_hash) 46 | 47 | vin = tx_info['vin'] 48 | for i in range(len(vin)): 49 | assert vin[i]['txid'] == hash_to_hex_str(tx.inputs[i].prev_hash) 50 | assert vin[i]['vout'] == tx.inputs[i].prev_idx 51 | 52 | vout = tx_info['vout'] 53 | for i in range(len(vout)): 54 | # value pk_script 55 | assert vout[i]['value'] == tx.outputs[i].value 56 | spk = vout[i]['scriptPubKey'] 57 | tx_pks = tx.outputs[i].pk_script 58 | assert spk['hex'] == tx_pks.hex() 59 | if "addresses" in spk: 60 | assert len(spk["addresses"]) == 1 61 | address = spk["addresses"][0] 62 | else: 63 | address = spk["address"] 64 | assert coin.address_to_hashX(address) == coin.hashX_from_script(tx_pks) 65 | if issubclass(coin, Namecoin): 66 | if "nameOp" not in spk or "name" not in spk["nameOp"]: 67 | assert coin.name_hashX_from_script(tx_pks) is None 68 | else: 69 | OP_NAME_UPDATE = OpCodes.OP_3 70 | normalized_name_op_script = bytearray() 71 | normalized_name_op_script.append(OP_NAME_UPDATE) 72 | normalized_name_op_script.extend(Script.push_data(spk["nameOp"]["name"].encode("ascii"))) 73 | normalized_name_op_script.extend(Script.push_data(bytes([]))) 74 | normalized_name_op_script.append(OpCodes.OP_2DROP) 75 | normalized_name_op_script.append(OpCodes.OP_DROP) 76 | normalized_name_op_script.append(OpCodes.OP_RETURN) 77 | assert coin.name_hashX_from_script(tx_pks) == Coin.hashX_from_script(normalized_name_op_script) 78 | -------------------------------------------------------------------------------- /tests/lib/test_hash.py: -------------------------------------------------------------------------------- 1 | # 2 | # Tests of lib/hash.py 3 | # 4 | from functools import partial 5 | 6 | import pytest 7 | 8 | import electrumx.lib.hash as lib_hash 9 | 10 | 11 | def test_sha256(): 12 | assert lib_hash.sha256(b'sha256') == b'][\t\xf6\xdc\xb2\xd5:_\xff\xc6\x0cJ\xc0\xd5_\xab\xdfU`i\xd6c\x15E\xf4*\xa6\xe3P\x0f.' 13 | with pytest.raises(TypeError): 14 | lib_hash.sha256('sha256') 15 | 16 | def test_double_sha256(): 17 | assert lib_hash.double_sha256(b'double_sha256') == b'ksn\x8e\xb7\xb9\x0f\xf6\xd9\xad\x88\xd9#\xa1\xbcU(j1Bx\xce\xd5;s\xectL\xe7\xc5\xb4\x00' 18 | 19 | def test_hash_to_hex_str(): 20 | assert lib_hash.hash_to_hex_str(b'hash_to_str') == '7274735f6f745f68736168' 21 | 22 | def test_hex_str_to_hash(): 23 | assert lib_hash.hex_str_to_hash('7274735f6f745f68736168') == b'hash_to_str' 24 | 25 | def test_Base58_char_value(): 26 | chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' 27 | for value, c in enumerate(chars): 28 | assert lib_hash.Base58.char_value(c) == value 29 | for c in (' ', 'I', '0', 'l', 'O'): 30 | with pytest.raises(lib_hash.Base58Error): 31 | lib_hash.Base58.char_value(c) 32 | 33 | def test_Base58_decode(): 34 | with pytest.raises(TypeError): 35 | lib_hash.Base58.decode(b'foo') 36 | with pytest.raises(lib_hash.Base58Error): 37 | lib_hash.Base58.decode('') 38 | assert lib_hash.Base58.decode('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz') == b'\x00\x01\x11\xd3\x8e_\xc9\x07\x1f\xfc\xd2\x0bJv<\xc9\xaeO%+\xb4\xe4\x8f\xd6j\x83^%*\xda\x93\xffH\rm\xd4=\xc6*d\x11U\xa5' 39 | assert lib_hash.Base58.decode('3i37NcgooY8f1S') == b'0123456789' 40 | 41 | def test_Base58_encode(): 42 | with pytest.raises(TypeError): 43 | lib_hash.Base58.encode('foo') 44 | assert lib_hash.Base58.encode(b'') == '' 45 | assert lib_hash.Base58.encode(b'\0') == '1' 46 | assert lib_hash.Base58.encode(b'0123456789') == '3i37NcgooY8f1S' 47 | 48 | def test_Base58_decode_check(): 49 | with pytest.raises(TypeError): 50 | lib_hash.Base58.decode_check(b'foo') 51 | assert lib_hash.Base58.decode_check('4t9WKfuAB8') == b'foo' 52 | with pytest.raises(lib_hash.Base58Error): 53 | lib_hash.Base58.decode_check('4t9WKfuAB9') 54 | 55 | def test_Base58_encode_check(): 56 | with pytest.raises(TypeError): 57 | lib_hash.Base58.encode_check('foo') 58 | assert lib_hash.Base58.encode_check(b'foo') == '4t9WKfuAB8' 59 | 60 | def test_Base58_decode_check_custom(): 61 | decode_check_sha256 = partial(lib_hash.Base58.decode_check, 62 | hash_fn=lib_hash.sha256) 63 | with pytest.raises(TypeError): 64 | decode_check_sha256(b'foo') 65 | assert decode_check_sha256('4t9WFhKfWr') == b'foo' 66 | with pytest.raises(lib_hash.Base58Error): 67 | decode_check_sha256('4t9WFhKfWp') 68 | 69 | def test_Base58_encode_check_custom(): 70 | encode_check_sha256 = partial(lib_hash.Base58.encode_check, 71 | hash_fn=lib_hash.sha256) 72 | with pytest.raises(TypeError): 73 | encode_check_sha256('foo') 74 | assert encode_check_sha256(b'foo') == '4t9WFhKfWr' 75 | -------------------------------------------------------------------------------- /tests/transactions/emercoin_mainnet_35ea64.json: -------------------------------------------------------------------------------- 1 | { 2 | "txid": "35ea64349dfca4158ba745d3031c1014b9f27262c9c8bb672b829b33b3ac56ee", 3 | "hash": "35ea64349dfca4158ba745d3031c1014b9f27262c9c8bb672b829b33b3ac56ee", 4 | "size": 390, 5 | "vsize": 390, 6 | "version": 1638, 7 | "locktime": 358665, 8 | "time": 1559642505, 9 | "hex": "660600008941f65c02ad38a624bee634b804a930564b1f92c8ec062c20619a6ae22ff667bd5fecf8d7000000006b483045022100d3b0aa2d650b1e632c8392180c4305b939c61a054947bde720840ae6765a6c0e0220309d4cff12bfacadeb994ae81810d9b368c27f7c84e34a4d55683928deea14c1012103b5e9a6b0f0feb239060986d3eadbb554b82dff8a6b75d8880810391e276d197cfeffffff4c96d5b045260667313a9f51c81028d13c66bd32ae2134d162d4931f2ad45a61010000006a4730440220573baeb5ae416971bb112197978f1a7053b4dc75ab9a877671541796d1df33f80220444153b0085ca275fc05efac6dbbcad95bbfa07de51ea69a9d01325d45af99ad012102df1f5deb42e7568ac9578ab942ceeca8e8cade0cbe7678e66089794771e6cd31feffffff026400000000000000265375095465737431303030317576a91434960bef9fcc33ff4d2c8c2cfc77edd2f463a58f88ac1c250000000000001976a9148d5104c62b85ac953de67538dbdc3b70e4027abb88ac09790500", 10 | "vin": [ 11 | { 12 | "txid": "d7f8ec5fbd67f62fe26a9a61202c06ecc8921f4b5630a904b834e6be24a638ad", 13 | "vout": 0, 14 | "scriptSig": { 15 | "asm": "3045022100d3b0aa2d650b1e632c8392180c4305b939c61a054947bde720840ae6765a6c0e0220309d4cff12bfacadeb994ae81810d9b368c27f7c84e34a4d55683928deea14c1[ALL] 03b5e9a6b0f0feb239060986d3eadbb554b82dff8a6b75d8880810391e276d197c", 16 | "hex": "483045022100d3b0aa2d650b1e632c8392180c4305b939c61a054947bde720840ae6765a6c0e0220309d4cff12bfacadeb994ae81810d9b368c27f7c84e34a4d55683928deea14c1012103b5e9a6b0f0feb239060986d3eadbb554b82dff8a6b75d8880810391e276d197c" 17 | }, 18 | "sequence": 4294967294 19 | }, 20 | { 21 | "txid": "615ad42a1f93d462d13421ae32bd663cd12810c8519f3a3167062645b0d5964c", 22 | "vout": 1, 23 | "scriptSig": { 24 | "asm": "30440220573baeb5ae416971bb112197978f1a7053b4dc75ab9a877671541796d1df33f80220444153b0085ca275fc05efac6dbbcad95bbfa07de51ea69a9d01325d45af99ad[ALL] 02df1f5deb42e7568ac9578ab942ceeca8e8cade0cbe7678e66089794771e6cd31", 25 | "hex": "4730440220573baeb5ae416971bb112197978f1a7053b4dc75ab9a877671541796d1df33f80220444153b0085ca275fc05efac6dbbcad95bbfa07de51ea69a9d01325d45af99ad012102df1f5deb42e7568ac9578ab942ceeca8e8cade0cbe7678e66089794771e6cd31" 26 | }, 27 | "sequence": 4294967294 28 | } 29 | ], 30 | "vout": [ 31 | { 32 | "value": 100, 33 | "n": 0, 34 | "scriptPubKey": { 35 | "asm": "3 OP_DROP 546573743130303031 OP_DROP OP_DUP OP_HASH160 34960bef9fcc33ff4d2c8c2cfc77edd2f463a58f OP_EQUALVERIFY OP_CHECKSIG", 36 | "hex": "5375095465737431303030317576a91434960bef9fcc33ff4d2c8c2cfc77edd2f463a58f88ac", 37 | "reqSigs": 1, 38 | "type": "name_pubkeyhash", 39 | "address": "EMwxNytaiBZkYSZpCrqeRMaMMeqfXEXmAH" 40 | } 41 | }, 42 | { 43 | "value": 9500, 44 | "n": 1, 45 | "scriptPubKey": { 46 | "asm": "OP_DUP OP_HASH160 8d5104c62b85ac953de67538dbdc3b70e4027abb OP_EQUALVERIFY OP_CHECKSIG", 47 | "hex": "76a9148d5104c62b85ac953de67538dbdc3b70e4027abb88ac", 48 | "reqSigs": 1, 49 | "type": "pubkeyhash", 50 | "address": "EW37puYPfAKP5QvB8BQbeoyh5L58GiMBy6" 51 | } 52 | } 53 | ] 54 | } 55 | --------------------------------------------------------------------------------