From 06d58f7786e8f09d6164525226555cc0b1932993 Mon Sep 17 00:00:00 2001 From: turcol Date: Wed, 24 Oct 2018 05:59:51 -0400 Subject: [PATCH] Add support for CivX mainnet and testnet (#627) --- electrumx/lib/coins.py | 52 +++++++++++++++++++++++++++- electrumx/server/daemon.py | 12 +++++++ tests/blocks/civx_mainnet_50000.json | 16 +++++++++ tests/blocks/civx_testnet_60000.json | 16 +++++++++ 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 tests/blocks/civx_mainnet_50000.json create mode 100644 tests/blocks/civx_testnet_60000.json diff --git a/electrumx/lib/coins.py b/electrumx/lib/coins.py index 6eb7e47..e572db1 100644 --- a/electrumx/lib/coins.py +++ b/electrumx/lib/coins.py @@ -40,7 +40,7 @@ import base64 import electrumx.lib.util as util from electrumx.lib.hash import Base58, hash160, double_sha256, hash_to_hex_str -from electrumx.lib.hash import HASHX_LEN +from electrumx.lib.hash import HASHX_LEN, hex_str_to_hash from electrumx.lib.script import ScriptPubKey, OpCodes import electrumx.lib.tx as lib_tx import electrumx.server.block_processor as block_proc @@ -2238,3 +2238,53 @@ class tBitg(Bitg): GENESIS_HASH = ( '000008467c3a9c587533dea06ad9380cded3ed32f9742a6c0c1aebc21bf2bc9b') RPC_PORT = 19332 + + +class CivX(Coin): + NAME = "CivX" + SHORTNAME = "CIVX" + NET = "mainnet" + XPUB_VERBYTES = bytes.fromhex("0488b21e") + XPRV_VERBYTES = bytes.fromhex("0488ade4") + GENESIS_HASH = ('00000036090a68c523471da7a4f0f958' + 'c1b4403fef74a003be7f71877699cab7') + P2PKH_VERBYTE = bytes.fromhex("1C") + P2SH_VERBYTE = [bytes.fromhex("57")] + WIF_BYTE = bytes.fromhex("9C") + RPC_PORT = 4561 + TX_COUNT = 1000 + TX_COUNT_HEIGHT = 10000 + TX_PER_BLOCK = 4 + DAEMON = daemon.PreLegacyRPCDaemon + DESERIALIZER = lib_tx.DeserializerTxTime + + @classmethod + def header_hash(cls, header): + version, = util.unpack_le_uint32_from(header) + + if version > 2: + return double_sha256(header) + else: + return hex_str_to_hash(CivX.GENESIS_HASH) + + +class CivXTestnet(CivX): + SHORTNAME = "tCIVX" + NET = "testnet" + XPUB_VERBYTES = bytes.fromhex("043587cf") + XPRV_VERBYTES = bytes.fromhex("04358394") + GENESIS_HASH = ('0000059bb2c2048493efcb0f1a034972' + 'b3ce4089d54c93b69aaab212fb369887') + P2PKH_VERBYTE = bytes.fromhex("4B") + P2SH_VERBYTE = [bytes.fromhex("CE")] + WIF_BYTE = bytes.fromhex("CB") + RPC_PORT = 14561 + + @classmethod + def header_hash(cls, header): + version, = util.unpack_le_uint32_from(header) + + if version > 2: + return double_sha256(header) + else: + return hex_str_to_hash(CivXTestnet.GENESIS_HASH) diff --git a/electrumx/server/daemon.py b/electrumx/server/daemon.py index 11ccbc7..79c4216 100644 --- a/electrumx/server/daemon.py +++ b/electrumx/server/daemon.py @@ -445,3 +445,15 @@ class DecredDaemon(Daemon): # FIXME allow self signed certificates connector = aiohttp.TCPConnector(verify_ssl=False) return aiohttp.ClientSession(connector=connector) + + +class PreLegacyRPCDaemon(LegacyRPCDaemon): + '''Handles connections to a daemon at the given URL. + + This class is useful for daemons that don't have the new 'getblock' + RPC call that returns the block in hex, and need the False parameter + for the getblock''' + + async def deserialised_block(self, hex_hash): + '''Return the deserialised block with the given hex hash.''' + return await self._send_single('getblock', (hex_hash, False)) diff --git a/tests/blocks/civx_mainnet_50000.json b/tests/blocks/civx_mainnet_50000.json new file mode 100644 index 0000000..aa8cdde --- /dev/null +++ b/tests/blocks/civx_mainnet_50000.json @@ -0,0 +1,16 @@ +{ + "hash": "596b9249ffd6c1dfb3cfa16d3ade2e0cb57342fed66b90e6444dc54cc99d0fc4", + "size": 445, + "height": 50000, + "merkleroot": "8db60d963dad433c8655021d291aafd731a6754aac9b69cf0dece61e5b3c1b75", + "tx": [ + "364c947002496d3115379dd779e2ce54cf114fb6cca42bd3da4de1823e4f08cc", + "a09b658cbe21162bbeb1821e2caf1f0947f8cdd517b87f2232ba1150043790e1" + ], + "time": 1526710352, + "nonce": 0, + "bits": "1a7b61c6", + "previousblockhash": "44530f8cc7040528199dc3a41a8b660bf2feb8e0015d5c787086655ac03cbca3", + "signature": "30440220710162172b283cca7007c72cbb848a52388518b8cfb7a6c906744f473afe312b022056fd92b06351ee7049f0857d688134449566dcb82d0f6a3cb36208832988cba3", + "block": "07000000a3bc3cc05a658670785c5d01e0b8fef20b668b1aa4c39d19280504c78c0f5344751b3c5b1ee6ec0dcf699bac4a75a631d7af1a291d0255863c43ad3d960db68d50c0ff5ac6617b1a00000000020100000050c0ff5a010000000000000000000000000000000000000000000000000000000000000000ffffffff040350c300ffffffff01000000000000000000000000000100000050c0ff5a017879028fc93da2d5ce18feee9f074086790d34c97ccfafe15a42b2423f3e28490200000049483045022100e3a092a079346179213d9b7079c9795e291883cb715e3efee656b9a981632432022002cafb6d6d497705f455b5d6a60bca38c88c26910101faef433ecfe80515e1ef01ffffffff03000000000000000000c07975296d000000232103c0c30d173c8478ceaaba836e8cae3c8c4e43f88f6d555600be124781b533956bacc07975296d000000232103c0c30d173c8478ceaaba836e8cae3c8c4e43f88f6d555600be124781b533956bac000000004630440220710162172b283cca7007c72cbb848a52388518b8cfb7a6c906744f473afe312b022056fd92b06351ee7049f0857d688134449566dcb82d0f6a3cb36208832988cba3" +} diff --git a/tests/blocks/civx_testnet_60000.json b/tests/blocks/civx_testnet_60000.json new file mode 100644 index 0000000..ac7b20c --- /dev/null +++ b/tests/blocks/civx_testnet_60000.json @@ -0,0 +1,16 @@ +{ + "hash": "1e4447195f4259b313b2c56072f7000237828e659254d5bf55f2b91e443f124b", + "size": 401, + "height": 60000, + "merkleroot": "9cf808c8f0e0d62864edee37a27fc44114a8896a6ace0c4ac6434c58e0d450ef", + "tx": [ + "b3e734e183f1b4f10cc3de258d02efbd73fc64577e9c5fc54f7d750b95b29aff", + "859a989109ee967e941808a43224463e181b51af8acc27ad05e2e4f7fdf45f81" + ], + "time": 1537111488, + "nonce": 0, + "bits": "1b00ffff", + "previousblockhash": "4f57fffd01fabbf020ac9e2110b4de9e127c06ba19f83741a5cb26f3b0aa13fe", + "signature" : "304402201d89a82d54b81e3aa0de97875bb15a874fce3319c7baf1751d18620f905909dc02202fc3fe4c17ef43aaa62dab4a6e0c735751d75b8f66e2a81cbead52f744570769", + "block": "07000000fe13aab0f326cba54137f819ba067c129edeb410219eac20f0bbfa01fdff574fef50d4e0584c43c64a0cce6a6a89a81441c47fa237eeed6428d6e0f0c808f89cc0759e5bffff001b000000000201000000c0759e5b010000000000000000000000000000000000000000000000000000000000000000ffffffff040360ea00ffffffff010000000000000000000000000001000000c0759e5b0143723908791e72544c4796be9da581a40eae3ba54b71b596d167f6ab245b37d60100000049483045022100d11ebd7ac7d0dd94f22416a1b223cf91cf1a70de52b2cd502edc1121c4d5409302207e22f22add1dd96bd214ca0f8875e4f06d9688c27053db82ea0ae0e9676d575401ffffffff02000000000000000000c05469f60300000023210288e5256969a3a9fd4735e6b8c8f905b270564f2448658177faf4c990e5745c45ac0000000046304402201d89a82d54b81e3aa0de97875bb15a874fce3319c7baf1751d18620f905909dc02202fc3fe4c17ef43aaa62dab4a6e0c735751d75b8f66e2a81cbead52f744570769" +}