diff --git a/electrumx/lib/coins.py b/electrumx/lib/coins.py index 43ea3c3..324e5a1 100644 --- a/electrumx/lib/coins.py +++ b/electrumx/lib/coins.py @@ -273,6 +273,7 @@ class AuxPowMixin(object): STATIC_BLOCK_HEADERS = False DESERIALIZER = lib_tx.DeserializerAuxPow SESSIONCLS = AuxPoWElectrumX + TRUNCATED_HEADER_SIZE = 80 # AuxPoW headers are significantly larger, so the DEFAULT_MAX_SEND from # Bitcoin is insufficient. In Namecoin mainnet, 5 MB wasn't enough to # sync, while 10 MB worked fine. @@ -3177,3 +3178,56 @@ class CPUchain(Coin): '''Given a header return the hash.''' import cpupower return cpupower.getPoWHash(header) + + +class Xaya(AuxPowMixin, Coin): + NAME = "Xaya" + SHORTNAME = "CHI" + NET = "mainnet" + XPUB_VERBYTES = bytes.fromhex("0488b21e") + XPRV_VERBYTES = bytes.fromhex("0488ade4") + P2PKH_VERBYTE = bytes.fromhex("1c") + P2SH_VERBYTES = [bytes.fromhex("1e")] + WIF_BYTE = bytes.fromhex("82") + GENESIS_HASH = ('e5062d76e5f50c42f493826ac9920b63' + 'a8def2626fd70a5cec707ec47a4c4651') + TX_COUNT = 1147749 + TX_COUNT_HEIGHT = 1030000 + TX_PER_BLOCK = 2 + DESERIALIZER = lib_tx.DeserializerXaya + TRUNCATED_HEADER_SIZE = 80 + 5 + RPC_PORT = 8396 + PEERS = [ + 'seeder.xaya.io s50002', + 'xaya.domob.eu s50002', + ] + + @classmethod + def genesis_block(cls, block): + super().genesis_block(block) + + # In Xaya, the genesis block's coinbase is spendable. Thus unlike + # the generic genesis_block() method, we return the full block here. + return block + + +class XayaTestnet(Xaya): + SHORTNAME = "XCH" + NET = "testnet" + P2PKH_VERBYTE = bytes.fromhex("58") + P2SH_VERBYTES = [bytes.fromhex("5a")] + WIF_BYTE = bytes.fromhex("e6") + GENESIS_HASH = ('5195fc01d0e23d70d1f929f21ec55f47' + 'e1c6ea1e66fae98ee44cbbc994509bba') + TX_COUNT = 51557 + TX_COUNT_HEIGHT = 49000 + TX_PER_BLOCK = 1 + RPC_PORT = 18396 + PEERS = [] + + +class XayaRegtest(XayaTestnet): + NET = "regtest" + GENESIS_HASH = ('6f750b36d22f1dc3d0a6e483af453010' + '22646dfc3b3ba2187865f5a7d6d83ab1') + RPC_PORT = 18493 diff --git a/electrumx/lib/tx.py b/electrumx/lib/tx.py index 7eb0026..46aee0f 100644 --- a/electrumx/lib/tx.py +++ b/electrumx/lib/tx.py @@ -275,28 +275,44 @@ class DeserializerSegWit(Deserializer): class DeserializerAuxPow(Deserializer): VERSION_AUXPOW = (1 << 8) + def read_auxpow(self): + '''Reads and returns the CAuxPow data''' + + # We first calculate the size of the CAuxPow instance and then + # read it as bytes in the final step. + start = self.cursor + + self.read_tx() # AuxPow transaction + self.cursor += 32 # Parent block hash + merkle_size = self._read_varint() + self.cursor += 32 * merkle_size # Merkle branch + self.cursor += 4 # Index + merkle_size = self._read_varint() + self.cursor += 32 * merkle_size # Chain merkle branch + self.cursor += 4 # Chain index + self.cursor += 80 # Parent block header + + end = self.cursor + self.cursor = start + return self._read_nbytes(end - start) + def read_header(self, static_header_size): '''Return the AuxPow block header bytes''' + + # We are going to calculate the block size then read it as bytes start = self.cursor + version = self._read_le_uint32() if version & self.VERSION_AUXPOW: - # We are going to calculate the block size then read it as bytes self.cursor = start self.cursor += static_header_size # Block normal header - self.read_tx() # AuxPow transaction - self.cursor += 32 # Parent block hash - merkle_size = self._read_varint() - self.cursor += 32 * merkle_size # Merkle branch - self.cursor += 4 # Index - merkle_size = self._read_varint() - self.cursor += 32 * merkle_size # Chain merkle branch - self.cursor += 4 # Chain index - self.cursor += 80 # Parent block header + self.read_auxpow() header_end = self.cursor else: - header_end = static_header_size + header_end = start + static_header_size + self.cursor = start - return self._read_nbytes(header_end) + return self._read_nbytes(header_end - start) class DeserializerAuxPowSegWit(DeserializerSegWit, DeserializerAuxPow): @@ -918,3 +934,37 @@ class DeserializerZcoin(Deserializer): ) return tx_input + + +class DeserializerXaya(DeserializerSegWit, DeserializerAuxPow): + """Deserializer class for the Xaya network + + The main difference to other networks is the changed format of the + block header with "triple purpose mining", see + https://github.com/xaya/xaya/blob/master/doc/xaya/mining.md. + + This builds upon classic auxpow, but has a modified serialisation format + that we have to implement here.""" + + MM_FLAG = 0x80 + + def read_header(self, static_header_size): + """Reads in the full block header (including PoW data)""" + + # We first calculate the dynamic size of the block header, and then + # read in all the data in the final step. + start = self.cursor + + self.cursor += static_header_size # Normal block header + + algo = self._read_byte() + self._read_le_uint32() # nBits + + if algo & self.MM_FLAG: + self.read_auxpow() + else: + self.cursor += static_header_size # Fake header + + end = self.cursor + self.cursor = start + return self._read_nbytes(end - start) diff --git a/electrumx/server/session.py b/electrumx/server/session.py index 48fa03f..7cb2992 100644 --- a/electrumx/server/session.py +++ b/electrumx/server/session.py @@ -1680,7 +1680,7 @@ class AuxPoWElectrumX(ElectrumX): headers = bytearray() while cursor < len(headers_full): - headers.extend(headers_full[cursor:cursor+self.coin.BASIC_HEADER_SIZE]) + headers.extend(headers_full[cursor:cursor+self.coin.TRUNCATED_HEADER_SIZE]) cursor += self.db.dynamic_header_len(height) height += 1 diff --git a/tests/blocks/xaya_mainnet_neoscrypt_400021.json b/tests/blocks/xaya_mainnet_neoscrypt_400021.json new file mode 100644 index 0000000..7b41e8b --- /dev/null +++ b/tests/blocks/xaya_mainnet_neoscrypt_400021.json @@ -0,0 +1,31 @@ +{ + "hash": "c53c371f253426f9e582e3de9d9f1f03e5e40e771aa96953c502ebe2222bb013", + "confirmations": 630231, + "strippedsize": 582, + "size": 618, + "weight": 2364, + "height": 400021, + "version": 536870912, + "versionHex": "20000000", + "merkleroot": "28e89aa0dbc0f1cacccb3ab402d7891abf636165b2cfd1b018e3b675468d8855", + "tx": [ + "43b8bea316ac7df3eeadd3b941808b100d66d424464af2dfb211773cd8dc0752", + "4d581281a17e679df9f109e0b0e7c59efacfe50860a733d1f06a23fa08540b6d" + ], + "time": 1544070336, + "mediantime": 1544070221, + "nonce": 0, + "chainwork": "00000000000000000000000000000000000000000011cc010c812da27182ad31", + "nTx": 2, + "powdata": { + "algo": "neoscrypt", + "mergemined": false, + "bits": "1d016293", + "difficulty": 0.7219816901873947, + "fakeheader": "00000000000000000000000000000000000000000000000000000000000000000000000013b02b22e2eb02c55369a91a770ee4e5031f9f9ddee382e5f92634251f373cc50000000000000000cd8740e3" + }, + "rngseed": "ae81fb25abb6328512e52af04b7e36e03ed545061ad000e6b07ed86e08551cb1", + "previousblockhash": "ab66782b9aa7edd86912bde739b7954517ef82907e7df2b910c6720b69c197fb", + "nextblockhash": "adfaac85095ab7f6c565a4c7af76229abcfd07fb0a0199383c3d65b5294f471a", + "block": "00000020fb97c1690b72c610b9f27d7e9082ef174595b739e7bd1269d8eda79a2b7866ab55888d4675b6e318b0d1cfb2656163bf1a89d702b43acbcccaf1c0dba09ae828c0a4085c0000000000000000029362011d00000000000000000000000000000000000000000000000000000000000000000000000013b02b22e2eb02c55369a91a770ee4e5031f9f9ddee382e5f92634251f373cc50000000000000000cd8740e302020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0603951a060101ffffffff02404af6050000000023210259b332f71852584ffcbb7701e76721adf988ba12cdbe1091b7cfd7b36ec93869ac0000000000000000266a24aa21a9edb0c34f0b713a6807ef08628f5db0c5c0037c39b2f6d208b5e08da25b13cfb2e501200000000000000000000000000000000000000000000000000000000000000000000000000200000001ebd8995be8b4ebc8ce2f082bf577818a5abf667afd09f5dcafd1c8790a63b391010000006a4730440220442743b7fc92e9904d3910cc61f5077a787b78f763b9efbe56c9306cbb6e2a77022004fae47d54cb45728894c511611cb66513cf01a04471a4b53821ba4cf386f19901210319f13957ea073a98708f09531a10d0f4e4f42a82102c4fead7c69ba4b4974e6bfeffffff0240420f0000000000445108702f444f474341541e7b2267223a7b2274667472223a5b7b226f223a332c226d223a317d5d7d7d6d7576a91452df4afbfbc31db12150f6e2038fa43c55aeafe988ac04f7fc03000000001976a914711acc7fc374161611ac25fa4f3d264940bcbdd288ac931a0600" +} diff --git a/tests/blocks/xaya_mainnet_sha256d_100000.json b/tests/blocks/xaya_mainnet_sha256d_100000.json new file mode 100644 index 0000000..273cdc3 --- /dev/null +++ b/tests/blocks/xaya_mainnet_sha256d_100000.json @@ -0,0 +1,103 @@ +{ + "hash": "948183fa76c2a4466bb32a06cc4f4f0afe3894d524dd07a963b3836c092f3acd", + "confirmations": 930248, + "strippedsize": 1567, + "size": 1603, + "weight": 6304, + "height": 100000, + "version": 536870912, + "versionHex": "20000000", + "merkleroot": "bd2b4a5a8f1f8085bab936f2f20f82e5928a0bbd573be780fec14d8b4fc4e922", + "tx": [ + "e16a22c4dfd99c639b60914ce75e3a7847fed7c1f3f5f2dd565ff48d6395a116", + "9854b65e59dca27649a3268d0feee2d55036e26cc49038f67aae000dd0126b48" + ], + "time": 1534624527, + "mediantime": 1534624309, + "nonce": 0, + "chainwork": "00000000000000000000000000000000000000000003fbc9da84e345e04f5136", + "nTx": 2, + "powdata": { + "algo": "sha256d", + "mergemined": true, + "bits": "18347258", + "difficulty": 20964060431.07306, + "auxpow": { + "tx": { + "hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff64033c33082cfabe6d6dfe0718afd8c0651b58f14378a128efde085d91bcfa2790de57ec862ad420d90708000000f09f909f000f4d696e6564206279207374636f646500000000000000000000000000000000000000000000000000000000000000000000ff3b9a010320983b4b000000001976a914c825a1ecf2a6830c4401620c3a16f1995057c2ab88ac00000000000000002f6a24aa21a9ed98a08f4c63b7cad2f139005520cf5998e1fa2ad8d53bbad87e0868d8c509149308000000000000000000000000000000002c6a4c2952534b424c4f434b3a88b841b4ba9c30eff483b55f8a520403afac9e2050a769129a76620c51e633615b9cd447", + "txid": "54bfbec36774378ce65ab829b00d45bb4d734a9220932f5514d8b4e1992e8dfc", + "hash": "54bfbec36774378ce65ab829b00d45bb4d734a9220932f5514d8b4e1992e8dfc", + "version": 1, + "size": 294, + "vsize": 294, + "weight": 1176, + "locktime": 1205115995, + "vin": [ + { + "coinbase": "033c33082cfabe6d6dfe0718afd8c0651b58f14378a128efde085d91bcfa2790de57ec862ad420d90708000000f09f909f000f4d696e6564206279207374636f646500000000000000000000000000000000000000000000000000000000000000000000", + "sequence": 26885119 + } + ], + "vout": [ + { + "value": 12.62196768, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 c825a1ecf2a6830c4401620c3a16f1995057c2ab OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914c825a1ecf2a6830c4401620c3a16f1995057c2ab88ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "CaiAoAHC4kYmGJnNdcJWP8EFDE42Ji7XiS" + ] + } + }, + { + "value": 0.00000000, + "n": 1, + "scriptPubKey": { + "asm": "OP_RETURN aa21a9ed98a08f4c63b7cad2f139005520cf5998e1fa2ad8d53bbad87e0868d8c5091493 0000000000000000", + "hex": "6a24aa21a9ed98a08f4c63b7cad2f139005520cf5998e1fa2ad8d53bbad87e0868d8c5091493080000000000000000", + "type": "nulldata" + } + }, + { + "value": 0.00000000, + "n": 2, + "scriptPubKey": { + "asm": "OP_RETURN 52534b424c4f434b3a88b841b4ba9c30eff483b55f8a520403afac9e2050a769129a76620c51e63361", + "hex": "6a4c2952534b424c4f434b3a88b841b4ba9c30eff483b55f8a520403afac9e2050a769129a76620c51e63361", + "type": "nulldata" + } + } + ], + "blockhash": "00000000000000001903108b258887d0258a3e8caf776983069f94b9f47049f6" + }, + "chainindex": 7, + "merklebranch": [ + "5c3158d4f108917fba77f9695650608477456b8f6f06238b1613311aafa74b09", + "eebaf1b6b9ab455497e6dd571140f0a3647ce36e1ab3e34a177dacc474a755d9", + "69191fcf85cf624ec99de2d341475478d5b4dc6ba47fc615aaefb05af2ca27a8", + "4930ddee5d4553184fc83c98e86f3fb317e6811c00840789dc67fea8be9a182f", + "32648a287897e297e999fff9426c2b90b79bf7d1b086a227a19b13a7ec2b41a2", + "fffd55d7bbea5f951ae2f3a8f540a9a0a71949d9578d9d44d20f86e090a2f810", + "74ddee1ce47dcb62229411fe9ae3a208f488ed18aef409fb5704fb55844ce2e0", + "a3b018da9723bdef26aaf35c69c24ef03c028ef0080cb78f524de8a3f1ae4ef4", + "b2b0fee71fab43ae9c6eb27aaff5f4a1806a3568a0fd7cdae67c95b7f5684ce2", + "ca7503900f2b8aeec18402721788f9ea340ab4216ffd095cba066b3af306cbdb", + "0aba5a93156602ce5202293e3c83c4e1f3c754ff9338770d18bceda4fcfbd686", + "084cf897b58d851626d0ba32d4c717584b018881ab022e8fba1c9d8ed6aaae0e" + ], + "chainmerklebranch": [ + "2cadbb3ce34769fc6f95572012c22605f8c3a69982a9a6854523f6548007d30b", + "e5c2407ba454ffeb28cf0c50c5c293a84c9a75788f8a8f35ccb974e606280377", + "a5cd51355bea0fd77416d06bf3647e16b4663d2f87e6a3ccb23e713cb8b4de1c" + ], + "parentblock": "00000020913d01444f14db2c6ab43ffd0f36af5613423815543c22000000000000000000a2edf8bab99ac19e7f7adaf23bc43570d543054aed83e77694f26d33ec9db2a51e83785ba70d2c17865f3a57" + } + }, + "rngseed": "1cc1ed830b99a352c02a10fca08284d005c1cfb01e5ffd10b85bcda3e2164636", + "previousblockhash": "8acbc6b31dabb5b3a224d9e4e55e2bd766882f07b2c592e1a101ab7a6e59cd6b", + "nextblockhash": "427b1860366cfc584170f73b0518a71adb9787841c960ad3a857e27b6b773385", + "block": "000000206bcd596e7aab01a1e192c5b2072f8866d72b5ee5e4d924a2b3b5ab1db3c6cb8a22e9c44f8b4dc1fe80e73b57bd0b8a92e5820ff2f236b9ba85801f8f5a4a2bbd0f83785b0000000000000000815872341801000000010000000000000000000000000000000000000000000000000000000000000000ffffffff64033c33082cfabe6d6dfe0718afd8c0651b58f14378a128efde085d91bcfa2790de57ec862ad420d90708000000f09f909f000f4d696e6564206279207374636f646500000000000000000000000000000000000000000000000000000000000000000000ff3b9a010320983b4b000000001976a914c825a1ecf2a6830c4401620c3a16f1995057c2ab88ac00000000000000002f6a24aa21a9ed98a08f4c63b7cad2f139005520cf5998e1fa2ad8d53bbad87e0868d8c509149308000000000000000000000000000000002c6a4c2952534b424c4f434b3a88b841b4ba9c30eff483b55f8a520403afac9e2050a769129a76620c51e633615b9cd44700000000000000000000000000000000000000000000000000000000000000000c094ba7af1a3113168b23066f8f6b45778460505669f977ba7f9108f1d458315cd955a774c4ac7d174ae3b31a6ee37c64a3f0401157dde6975445abb9b6f1baeea827caf25ab0efaa15c67fa46bdcb4d578544741d3e29dc94e62cf85cf1f19692f189abea8fe67dc890784001c81e617b33f6fe8983cc84f1853455deedd3049a2412beca7139ba127a286b0d1f79bb7902b6c42f9ff99e997e29778288a643210f8a290e0860fd2449d8d57d94919a7a0a940f5a8f3e21a955feabbd755fdffe0e24c8455fb0457fb09f4ae18ed88f408a2e39afe11942262cb7de41ceedd74f44eaef1a3e84d528fb70c08f08e023cf04ec2695cf3aa26efbd2397da18b0a3e24c68f5b7957ce6da7cfda068356a80a1f4f5af7ab26e9cae43ab1fe7feb0b2dbcb06f33a6b06ba5c09fd6f21b40a34eaf98817720284c1ee8a2b0f900375ca86d6fbfca4edbc180d773893ff54c7f3e1c4833c3e290252ce026615935aba0a0eaeaad68e9d1cba8f2e02ab8188014b5817c7d432bad02616858db597f84c0800000000030bd3078054f6234585a6a98299a6c3f80526c2122057956ffc6947e33cbbad2c77032806e674b9cc358f8a8f78759a4ca893c2c5500ccf28ebff54a47b40c2e51cdeb4b83c713eb2cca3e6872f3d66b4167e64f36bd01674d70fea5b3551cda50700000000000020913d01444f14db2c6ab43ffd0f36af5613423815543c22000000000000000000a2edf8bab99ac19e7f7adaf23bc43570d543054aed83e77694f26d33ec9db2a51e83785ba70d2c17865f3a5702020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0603a086010101ffffffff02ae8ef60500000000232103ac17736c4dfa051108f5a9f6c602bdac64ff6f4aab4dd36b7fb47ed5df8df68bac0000000000000000266a24aa21a9ed2c2eedd160077355e9d578fc8deebe7008bb20ecb418ccb750aa8367a385ad9401200000000000000000000000000000000000000000000000000000000000000000000000000200000002963d484c856e84ee811aaec4e4f1819d01b8444a82cd967b35dda08edec7f772010000006a4730440220528529296ef5d2a3341bf7438f7fc6a8baf3d77cc0f58718b3cb03503dfb64a502203ceff4277e2a7f4acc3b9dea2c8df64b1a794e6dda790de986033dcafb2df3660121039f8c7dfcbe7745bc72d5e1fb3e77a7dac3a20220102e7a1bb4ff96e7f8b8c0cbfeffffff963d484c856e84ee811aaec4e4f1819d01b8444a82cd967b35dda08edec7f772000000006b483045022100998ad854b30a4049e6eda69dd6248976bfa8eaf73244e909f01bd3ced9e1a9fb02203229b294e83931ad4ea8ff823895cd0d579c590337e72a40b1f254d33d65df460121021f787facf0e78ba561a2094803d32d4cba38ec861c60b1732e2615963e6c82a1feffffff02f947fa02000000001976a914463f344026a1829a0dec9da38efe408f786be9e988ac40420f000000000059520b702f46756e436f6f6b6965307b2267223a7b2274667472223a5b7b226f223a31322c226d223a35337d2c7b226f223a31322c226d223a32347d5d7d7d6d7576a914ef56cda5eeea29b552dc6c2526b6a1a16715483188ac9e860100" +} diff --git a/tests/test_blocks.py b/tests/test_blocks.py index 4cc2387..9aaa9b4 100644 --- a/tests/test_blocks.py +++ b/tests/test_blocks.py @@ -66,5 +66,6 @@ def test_block(block_details): block.header) == hex_str_to_hash(block_info['hash']) assert (coin.header_prevhash(block.header) == hex_str_to_hash(block_info['previousblockhash'])) + assert len(block_info['tx']) == len(block.transactions) for n, (tx, txid) in enumerate(block.transactions): assert txid == hex_str_to_hash(block_info['tx'][n]) diff --git a/tests/test_transactions.py b/tests/test_transactions.py index 731012d..ad70943 100644 --- a/tests/test_transactions.py +++ b/tests/test_transactions.py @@ -56,8 +56,12 @@ def test_transaction(transaction_details): spk = vout[i]['scriptPubKey'] tx_pks = tx.outputs[i].pk_script assert spk['hex'] == tx_pks.hex() - assert coin.address_to_hashX(spk['address']) == \ - coin.hashX_from_script(tx_pks) + if "addresses" in spk: + assert len(spk["addresses"]) == 1 + address = spk["addresses"][0] + else: + address = spk["address"] + assert coin.address_to_hashX(address) == coin.hashX_from_script(tx_pks) if issubclass(coin, Namecoin): if "nameOp" not in spk or "name" not in spk["nameOp"]: assert coin.name_hashX_from_script(tx_pks) is None diff --git a/tests/transactions/xaya_mainnet_currency_bb65bf.json b/tests/transactions/xaya_mainnet_currency_bb65bf.json new file mode 100644 index 0000000..c4dd732 --- /dev/null +++ b/tests/transactions/xaya_mainnet_currency_bb65bf.json @@ -0,0 +1,66 @@ +{ + "txid": "bb65bfb6bb0bc032ddf5f086079bd54f44b51192c7dd2aaa96814557b4cedef6", + "hash": "478b0977178b3b251c059d7fd645d22776928f24d463d58bd952692b94011506", + "version": 2, + "size": 397, + "vsize": 315, + "weight": 1258, + "locktime": 1032236, + "vin": [ + { + "txid": "885759d86fc931fdc40e5ce2ea8d13d027265ba412cf6f53338ed079e117ecd0", + "vout": 1, + "scriptSig": { + "asm": "0014af22b818ed82241a25db8e0368246739cefff500", + "hex": "160014af22b818ed82241a25db8e0368246739cefff500" + }, + "txinwitness": [ + "30440220242ecc2974b06403d2c8082cac3757a66abdf1299896e81037b336d9d2114f60022070ed8076805e32e600d10338a57509bfe662951931d39312bb9121c8cc79987801", + "02caf14cea42ca04ec16b5a0486e8316f7ff9d1d497f05b6631eeae06a9e93c952" + ], + "sequence": 4294967293 + }, + { + "txid": "885759d86fc931fdc40e5ce2ea8d13d027265ba412cf6f53338ed079e117ecd0", + "vout": 0, + "scriptSig": { + "asm": "304402202b78c45be3876fa92bc5678096fc7a300c0b2eacbd6c63462b5e72634a0d8b34022017dbd5e71b09b2477db5ec9cfa242198d1439efaeae96827d4cc2a09291976e6[ALL] 02c5b65a15c335dede9899ca033a43cc6d4c669b904c344ecfccd6db6c0147226e", + "hex": "47304402202b78c45be3876fa92bc5678096fc7a300c0b2eacbd6c63462b5e72634a0d8b34022017dbd5e71b09b2477db5ec9cfa242198d1439efaeae96827d4cc2a09291976e6012102c5b65a15c335dede9899ca033a43cc6d4c669b904c344ecfccd6db6c0147226e" + }, + "sequence": 4294967293 + } + ], + "vout": [ + { + "value": 1000000000, + "n": 0, + "scriptPubKey": { + "asm": "OP_HASH160 0a28089f0e20df40287a050f44c17e46b5415fc7 OP_EQUAL", + "hex": "a9140a28089f0e20df40287a050f44c17e46b5415fc787", + "reqSigs": 1, + "type": "scripthash", + "addresses": [ + "D64oFmM1YJkNnJeuTDanLbV2fnkmE3RjHc" + ] + } + }, + { + "value": 982510000, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 cf42e4921cf6b13b2bd3d169b9e94f1447429dfc OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914cf42e4921cf6b13b2bd3d169b9e94f1447429dfc88ac", + "reqSigs": 1, + "type": "pubkeyhash", + "addresses": [ + "CbMnaYgwuPaZXJKsJfaaexpSMKyt1yCfHE" + ] + } + } + ], + "hex": "02000000000102d0ec17e179d08e33536fcf12a45b2627d0138deae25c0ec4fd31c96fd85957880100000017160014af22b818ed82241a25db8e0368246739cefff500fdffffffd0ec17e179d08e33536fcf12a45b2627d0138deae25c0ec4fd31c96fd8595788000000006a47304402202b78c45be3876fa92bc5678096fc7a300c0b2eacbd6c63462b5e72634a0d8b34022017dbd5e71b09b2477db5ec9cfa242198d1439efaeae96827d4cc2a09291976e6012102c5b65a15c335dede9899ca033a43cc6d4c669b904c344ecfccd6db6c0147226efdffffff0200ca9a3b0000000017a9140a28089f0e20df40287a050f44c17e46b5415fc787b0e98f3a000000001976a914cf42e4921cf6b13b2bd3d169b9e94f1447429dfc88ac024730440220242ecc2974b06403d2c8082cac3757a66abdf1299896e81037b336d9d2114f60022070ed8076805e32e600d10338a57509bfe662951931d39312bb9121c8cc799878012102caf14cea42ca04ec16b5a0486e8316f7ff9d1d497f05b6631eeae06a9e93c952002cc00f00", + "blockhash": "83acddd369b88e1a2d1fa506dcb717a1d883e45434d4ce080f10f3630e5ae957", + "confirmations": 1, + "time": 1564041243, + "blocktime": 1564041243 +}