diff --git a/electrumx/lib/coins.py b/electrumx/lib/coins.py index 8d1f601..6eb7e47 100644 --- a/electrumx/lib/coins.py +++ b/electrumx/lib/coins.py @@ -709,6 +709,109 @@ class Namecoin(AuxPowMixin, Coin): PEERS = [ 'elec.luggs.co s446', ] + BLOCK_PROCESSOR = block_proc.NamecoinBlockProcessor + + @classmethod + def split_name_script(cls, script): + from electrumx.lib.script import _match_ops, Script, ScriptError + + try: + ops = Script.get_ops(script) + except ScriptError: + return None, script + + match = _match_ops + + # Name opcodes + OP_NAME_NEW = OpCodes.OP_1 + OP_NAME_FIRSTUPDATE = OpCodes.OP_2 + OP_NAME_UPDATE = OpCodes.OP_3 + + # Opcode sequences for name operations + NAME_NEW_OPS = [OP_NAME_NEW, -1, OpCodes.OP_2DROP] + NAME_FIRSTUPDATE_OPS = [OP_NAME_FIRSTUPDATE, -1, -1, -1, + OpCodes.OP_2DROP, OpCodes.OP_2DROP] + NAME_UPDATE_OPS = [OP_NAME_UPDATE, -1, -1, OpCodes.OP_2DROP, + OpCodes.OP_DROP] + + name_script_op_count = None + name_pushdata = None + + # Detect name operations; determine count of opcodes. + # Also extract the name field -- we might use that for something in a + # future version. + if match(ops[:len(NAME_NEW_OPS)], NAME_NEW_OPS): + name_script_op_count = len(NAME_NEW_OPS) + elif match(ops[:len(NAME_FIRSTUPDATE_OPS)], NAME_FIRSTUPDATE_OPS): + name_script_op_count = len(NAME_FIRSTUPDATE_OPS) + name_pushdata = ops[1] + elif match(ops[:len(NAME_UPDATE_OPS)], NAME_UPDATE_OPS): + name_script_op_count = len(NAME_UPDATE_OPS) + name_pushdata = ops[1] + + if name_script_op_count is None: + return None, script + + # Find the end position of the name data + n = 0 + for i in range(name_script_op_count): + # Content of this loop is copied from Script.get_ops's loop + op = script[n] + n += 1 + + if op <= OpCodes.OP_PUSHDATA4: + # Raw bytes follow + if op < OpCodes.OP_PUSHDATA1: + dlen = op + elif op == OpCodes.OP_PUSHDATA1: + dlen = script[n] + n += 1 + elif op == OpCodes.OP_PUSHDATA2: + dlen, = struct.unpack(' len(script): + raise IndexError + op = (op, script[n:n + dlen]) + n += dlen + # Strip the name data to yield the address script + address_script = script[n:] + + if name_pushdata is None: + return None, address_script + + normalized_name_op_script = bytearray() + normalized_name_op_script.append(OP_NAME_UPDATE) + normalized_name_op_script.extend(Script.push_data(name_pushdata[1])) + normalized_name_op_script.extend(Script.push_data(bytes([]))) + normalized_name_op_script.append(OpCodes.OP_2DROP) + normalized_name_op_script.append(OpCodes.OP_DROP) + normalized_name_op_script.append(OpCodes.OP_RETURN) + + return bytes(normalized_name_op_script), address_script + + @classmethod + def hashX_from_script(cls, script): + name_op_script, address_script = cls.split_name_script(script) + + return super().hashX_from_script(address_script) + + @classmethod + def address_from_script(cls, script): + name_op_script, address_script = cls.split_name_script(script) + + return super().address_from_script(address_script) + + @classmethod + def name_hashX_from_script(cls, script): + name_op_script, address_script = cls.split_name_script(script) + + if name_op_script is None: + return None + + return super().hashX_from_script(name_op_script) class NamecoinTestnet(Namecoin): diff --git a/electrumx/server/block_processor.py b/electrumx/server/block_processor.py index dcf071f..f346321 100644 --- a/electrumx/server/block_processor.py +++ b/electrumx/server/block_processor.py @@ -681,3 +681,33 @@ class DecredBlockProcessor(BlockProcessor): start -= 1 count += 1 return start, count + + +class NamecoinBlockProcessor(BlockProcessor): + def advance_txs(self, txs): + result = super().advance_txs(txs) + + tx_num = self.tx_count - len(txs) + script_name_hashX = self.coin.name_hashX_from_script + update_touched = self.touched.update + hashXs_by_tx = [] + append_hashXs = hashXs_by_tx.append + + for tx, tx_hash in txs: + hashXs = [] + append_hashX = hashXs.append + + # Add the new UTXOs and associate them with the name script + for idx, txout in enumerate(tx.outputs): + # Get the hashX of the name script. Ignore non-name scripts. + hashX = script_name_hashX(txout.pk_script) + if hashX: + append_hashX(hashX) + + append_hashXs(hashXs) + update_touched(hashXs) + tx_num += 1 + + self.db.history.add_unflushed(hashXs_by_tx, self.tx_count - len(txs)) + + return result diff --git a/tests/test_transactions.py b/tests/test_transactions.py index d91a65c..731012d 100644 --- a/tests/test_transactions.py +++ b/tests/test_transactions.py @@ -11,8 +11,9 @@ from binascii import unhexlify import pytest -from electrumx.lib.coins import Coin +from electrumx.lib.coins import Coin, Namecoin from electrumx.lib.hash import hash_to_hex_str +from electrumx.lib.script import OpCodes, Script TRANSACTION_DIR = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'transactions') @@ -57,3 +58,16 @@ def test_transaction(transaction_details): assert spk['hex'] == tx_pks.hex() assert coin.address_to_hashX(spk['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 + else: + OP_NAME_UPDATE = OpCodes.OP_3 + normalized_name_op_script = bytearray() + normalized_name_op_script.append(OP_NAME_UPDATE) + normalized_name_op_script.extend(Script.push_data(spk["nameOp"]["name"].encode("ascii"))) + normalized_name_op_script.extend(Script.push_data(bytes([]))) + normalized_name_op_script.append(OpCodes.OP_2DROP) + normalized_name_op_script.append(OpCodes.OP_DROP) + normalized_name_op_script.append(OpCodes.OP_RETURN) + assert coin.name_hashX_from_script(tx_pks) == Coin.hashX_from_script(normalized_name_op_script) diff --git a/tests/transactions/namecoin_mainnet_037339.json b/tests/transactions/namecoin_mainnet_037339.json new file mode 100644 index 0000000..467039e --- /dev/null +++ b/tests/transactions/namecoin_mainnet_037339.json @@ -0,0 +1,62 @@ +{ + "txid": "037339b97cf38d0fd8d68046c0ce7661a3d0117fac1da802c1d4c13056a74096", + "hash": "037339b97cf38d0fd8d68046c0ce7661a3d0117fac1da802c1d4c13056a74096", + "version": 28928, + "size": 568, + "vsize": 568, + "locktime": 411806, + "vin": [ + { + "txid": "4e6adc779e9d6d359c131a6c162fda9ab6822c829ed85e6461eca09a7f2da860", + "vout": 0, + "scriptSig": { + "asm": "30450221009934d4cef1c24141e5d74d825f1d50cc199bd9daf76e15024ff6119bc86fb8da02200d648a0c0dff5b4d091fdd8562a2f4a4cde243d460708565c1c96b2a3c1db786[ALL] 02beb88ae836bc254ef277e0911c8affe248d1e6a893bba6ce7da6cd9aee6079e4", + "hex": "4830450221009934d4cef1c24141e5d74d825f1d50cc199bd9daf76e15024ff6119bc86fb8da02200d648a0c0dff5b4d091fdd8562a2f4a4cde243d460708565c1c96b2a3c1db786012102beb88ae836bc254ef277e0911c8affe248d1e6a893bba6ce7da6cd9aee6079e4" + }, + "sequence": 4294967294 + }, + { + "txid": "d269af00988e45ed9a5fe085884b8f729afac4a5ccaaf8e1ee601439e7bcc125", + "vout": 1, + "scriptSig": { + "asm": "3045022100d2c96c88ceff7653e741c40e011d0253a7426f29af68097f6c0af45878f83bc8022008908f2a63ab0230caec18443c034478ce32367fcdcf810998293f6bb6808225[ALL] 02d514d8b84fe28a4f5b998fb15d931456dd98365df9576dbcc47f787412eec1a6", + "hex": "483045022100d2c96c88ceff7653e741c40e011d0253a7426f29af68097f6c0af45878f83bc8022008908f2a63ab0230caec18443c034478ce32367fcdcf810998293f6bb6808225012102d514d8b84fe28a4f5b998fb15d931456dd98365df9576dbcc47f787412eec1a6" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 1477675940, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 224538b431f8deb3fddccc433ebc1327017634e7 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914224538b431f8deb3fddccc433ebc1327017634e788ac", + "reqSigs": 1, + "type": "pubkeyhash", + "address": "Myha6mFMZV7u9Yvj6X43cidZocas5Xhq3E" + } + }, + { + "value": 1000000, + "n": 1, + "scriptPubKey": { + "nameOp": { + "op": "name_update", + "name": "dd/domob", + "value": "{\"ip\":\"176.31.184.255\",\"map\":{\"*\":{\"ip\":\"176.31.184.255\",\"tor\":\"wivfwn64tm3uaeig.onion\"}},\"fingerprint\":[\"6969C8037D2318BEDBC8111474B0A6E66E73BDB9\"],\"tor\":\"wivfwn64tm3uaeig.onion\"}" + }, + "asm": "OP_NAME_UPDATE 64642f646f6d6f62 7b226970223a223137362e33312e3138342e323535222c226d6170223a7b222a223a7b226970223a223137362e33312e3138342e323535222c22746f72223a2277697666776e3634746d3375616569672e6f6e696f6e227d7d2c2266696e6765727072696e74223a5b2236393639433830333744323331384245444243383131313437344230413645363645373342444239225d2c22746f72223a2277697666776e3634746d3375616569672e6f6e696f6e227d OP_2DROP OP_DROP OP_DUP OP_HASH160 57fd3c4a6a417c17f8d902e90e2bfb97b1a12e11 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "530864642f646f6d6f624cb47b226970223a223137362e33312e3138342e323535222c226d6170223a7b222a223a7b226970223a223137362e33312e3138342e323535222c22746f72223a2277697666776e3634746d3375616569672e6f6e696f6e227d7d2c2266696e6765727072696e74223a5b2236393639433830333744323331384245444243383131313437344230413645363645373342444239225d2c22746f72223a2277697666776e3634746d3375616569672e6f6e696f6e227d6d7576a91457fd3c4a6a417c17f8d902e90e2bfb97b1a12e1188ac", + "reqSigs": 1, + "type": "pubkeyhash", + "address": "N4bcMSxUL7jNDAJa34DpkdZPp9faHRJeaP" + } + } + ], + "hex": "007100000260a82d7f9aa0ec61645ed89e822c82b69ada2f166c1a139c356d9d9e77dc6a4e000000006b4830450221009934d4cef1c24141e5d74d825f1d50cc199bd9daf76e15024ff6119bc86fb8da02200d648a0c0dff5b4d091fdd8562a2f4a4cde243d460708565c1c96b2a3c1db786012102beb88ae836bc254ef277e0911c8affe248d1e6a893bba6ce7da6cd9aee6079e4feffffff25c1bce7391460eee1f8aacca5c4fa9a728f4b8885e05f9aed458e9800af69d2010000006b483045022100d2c96c88ceff7653e741c40e011d0253a7426f29af68097f6c0af45878f83bc8022008908f2a63ab0230caec18443c034478ce32367fcdcf810998293f6bb6808225012102d514d8b84fe28a4f5b998fb15d931456dd98365df9576dbcc47f787412eec1a6feffffff02a48b1358000000001976a914224538b431f8deb3fddccc433ebc1327017634e788ac40420f0000000000db530864642f646f6d6f624cb47b226970223a223137362e33312e3138342e323535222c226d6170223a7b222a223a7b226970223a223137362e33312e3138342e323535222c22746f72223a2277697666776e3634746d3375616569672e6f6e696f6e227d7d2c2266696e6765727072696e74223a5b2236393639433830333744323331384245444243383131313437344230413645363645373342444239225d2c22746f72223a2277697666776e3634746d3375616569672e6f6e696f6e227d6d7576a91457fd3c4a6a417c17f8d902e90e2bfb97b1a12e1188ac9e480600", + "blockhash": "1453f1744573abc329a116d071f9041bea5639f51c6e9bb2463fcb21f0638d2c", + "confirmations": 10342, + "time": 1533902501, + "blocktime": 1533902501 +} diff --git a/tests/transactions/namecoin_mainnet_0c6867.json b/tests/transactions/namecoin_mainnet_0c6867.json new file mode 100644 index 0000000..6c7b912 --- /dev/null +++ b/tests/transactions/namecoin_mainnet_0c6867.json @@ -0,0 +1,52 @@ +{ + "txid": "0c686779a1dcc867039a3c71934d6cde487c4eabd9cd2efd0bdcf15262ed9886", + "hash": "0c686779a1dcc867039a3c71934d6cde487c4eabd9cd2efd0bdcf15262ed9886", + "version": 28928, + "size": 280, + "vsize": 280, + "locktime": 421976, + "vin": [ + { + "txid": "0b9468e87947debbf999ac9290fcd25af7eff5f4d6df4773be2a89fd31009078", + "vout": 1, + "scriptSig": { + "asm": "304402203b3d10f8ba91fb477fdcbeb0354016bce97fcdf7d050191c7958a7d174ae4e76022064bd96fb14fcfc535320dd9eafd9a6c6dd9410937afa4fdb1064e2d8cc1110fa[ALL] 0421c34686d12da7331dcf876a61b58cdfa9bb892120fa8e699daac1333ad7325ed09a37432a414ccc2bed6506b3badd0413cd35469dcfda23ebadca86929f59c1", + "hex": "47304402203b3d10f8ba91fb477fdcbeb0354016bce97fcdf7d050191c7958a7d174ae4e76022064bd96fb14fcfc535320dd9eafd9a6c6dd9410937afa4fdb1064e2d8cc1110fa01410421c34686d12da7331dcf876a61b58cdfa9bb892120fa8e699daac1333ad7325ed09a37432a414ccc2bed6506b3badd0413cd35469dcfda23ebadca86929f59c1" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 280480622, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 b7db2908b47c32f4b8864caf2522d2eb1ed3d50b OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a914b7db2908b47c32f4b8864caf2522d2eb1ed3d50b88ac", + "reqSigs": 1, + "type": "pubkeyhash", + "address": "NDLWQGyHyhneB7ySsL6na2QBPK1T2i1WSQ" + } + }, + { + "value": 1000000, + "n": 1, + "scriptPubKey": { + "nameOp": { + "op": "name_new", + "hash": "2dbe200657c5c3cce22f0637480865d5db3aaaac" + }, + "asm": "OP_NAME_NEW 2dbe200657c5c3cce22f0637480865d5db3aaaac OP_2DROP OP_DUP OP_HASH160 6985a7f580409d4fdaf223f34848212955d371eb OP_EQUALVERIFY OP_CHECKSIG", + "hex": "51142dbe200657c5c3cce22f0637480865d5db3aaaac6d76a9146985a7f580409d4fdaf223f34848212955d371eb88ac", + "reqSigs": 1, + "type": "pubkeyhash", + "address": "N6CKGNr6iBDriS6iwZBAFswM2auAQnjd5K" + } + } + ], + "hex": "007100000178900031fd892abe7347dfd6f4f5eff75ad2fc9092ac99f9bbde4779e868940b010000008a47304402203b3d10f8ba91fb477fdcbeb0354016bce97fcdf7d050191c7958a7d174ae4e76022064bd96fb14fcfc535320dd9eafd9a6c6dd9410937afa4fdb1064e2d8cc1110fa01410421c34686d12da7331dcf876a61b58cdfa9bb892120fa8e699daac1333ad7325ed09a37432a414ccc2bed6506b3badd0413cd35469dcfda23ebadca86929f59c1feffffff026ecbb710000000001976a914b7db2908b47c32f4b8864caf2522d2eb1ed3d50b88ac40420f00000000003051142dbe200657c5c3cce22f0637480865d5db3aaaac6d76a9146985a7f580409d4fdaf223f34848212955d371eb88ac58700600", + "blockhash": "15b3979258287d26becc021b265bcccc964b9863d44a8a5802b9f6ce53d9509d", + "confirmations": 170, + "time": 1539845549, + "blocktime": 1539845549 +} diff --git a/tests/transactions/namecoin_mainnet_460f2b.json b/tests/transactions/namecoin_mainnet_460f2b.json new file mode 100644 index 0000000..e22d578 --- /dev/null +++ b/tests/transactions/namecoin_mainnet_460f2b.json @@ -0,0 +1,58 @@ +{ + "txid": "460f2b0a6f480b0d16b99fd4ea55afbf7ee628365a2a32d54b56422163e7660b", + "hash": "460f2b0a6f480b0d16b99fd4ea55afbf7ee628365a2a32d54b56422163e7660b", + "version": 28928, + "size": 688, + "vsize": 688, + "locktime": 422150, + "vin": [ + { + "txid": "33991d6cc33c2f9d85484086d0e9dcb93717be11e89bb315c5f0233d0fc0fc01", + "vout": 1, + "scriptSig": { + "asm": "3045022100c26ad0e826c1759a02a4bb3a8f816841b6330b44d3bba5ace371af7aeb736cae02205e6e9927d5e8279d32e741fbcd567c08f6dda8bdd0e3597c85b85831c3a73090[ALL] 03a7c03fa10f4ffa393a2e90ba098bf1f9b5d0cf84f83bc006fc9902884f22a5b5", + "hex": "483045022100c26ad0e826c1759a02a4bb3a8f816841b6330b44d3bba5ace371af7aeb736cae02205e6e9927d5e8279d32e741fbcd567c08f6dda8bdd0e3597c85b85831c3a73090012103a7c03fa10f4ffa393a2e90ba098bf1f9b5d0cf84f83bc006fc9902884f22a5b5" + }, + "sequence": 4294967293 + }, + { + "txid": "4632320203dddc75cac6e0078a040b6601de73b95d0069c8ef37f34e085f883c", + "vout": 0, + "scriptSig": { + "asm": "304402205bf9d8fe538d18d2f589f818acfc66efb3d7c563a6d0ce94379761e3ad5de4bb02204841c4f51cdb4433991f73fcff41fc82afd0a4411a89b09de30e6fb603ddf5a1[ALL] 0284741f8ca6ab581a46ae0ba5edfbfd134378c41e576c9267ca99054ecdf121cb", + "hex": "47304402205bf9d8fe538d18d2f589f818acfc66efb3d7c563a6d0ce94379761e3ad5de4bb02204841c4f51cdb4433991f73fcff41fc82afd0a4411a89b09de30e6fb603ddf5a101210284741f8ca6ab581a46ae0ba5edfbfd134378c41e576c9267ca99054ecdf121cb" + }, + "sequence": 4294967293 + } + ], + "vout": [ + { + "value": 1000000, + "n": 0, + "scriptPubKey": { + "nameOp": { + "op": "name_update", + "name": "test/6", + "value": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + }, + "asm": "OP_NAME_UPDATE 746573742f36 787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 OP_2DROP OP_DROP OP_DUP OP_HASH160 734b00d1b31f3c3a89bcd6d302b820d4c0459fc1 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "5306746573742f364d2c017878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878786d7576a914734b00d1b31f3c3a89bcd6d302b820d4c0459fc188ac", + "reqSigs": 1, + "type": "pubkeyhash", + "address": "N75ym2CibThuKTtR4eRRZAMvkcLybL77fS" + } + }, + { + "value": 354398, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 3b9cde2101e9da0fbf47d98ed859b0ad8fa886b5 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a9143b9cde2101e9da0fbf47d98ed859b0ad8fa886b588ac", + "reqSigs": 1, + "type": "pubkeyhash", + "address": "N21ZzKiuLLQ5pZnoJrqaSNZSbipQUtAaGt" + } + } + ], + "hex": "007100000201fcc00f3d23f0c515b39be811be1737b9dce9d0864048859d2f3cc36c1d9933010000006b483045022100c26ad0e826c1759a02a4bb3a8f816841b6330b44d3bba5ace371af7aeb736cae02205e6e9927d5e8279d32e741fbcd567c08f6dda8bdd0e3597c85b85831c3a73090012103a7c03fa10f4ffa393a2e90ba098bf1f9b5d0cf84f83bc006fc9902884f22a5b5fdffffff3c885f084ef337efc869005db973de01660b048a07e0c6ca75dcdd0302323246000000006a47304402205bf9d8fe538d18d2f589f818acfc66efb3d7c563a6d0ce94379761e3ad5de4bb02204841c4f51cdb4433991f73fcff41fc82afd0a4411a89b09de30e6fb603ddf5a101210284741f8ca6ab581a46ae0ba5edfbfd134378c41e576c9267ca99054ecdf121cbfdffffff0240420f0000000000fd52015306746573742f364d2c017878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878786d7576a914734b00d1b31f3c3a89bcd6d302b820d4c0459fc188ac5e680500000000001976a9143b9cde2101e9da0fbf47d98ed859b0ad8fa886b588ac06710600" +} diff --git a/tests/transactions/namecoin_mainnet_5e3495.json b/tests/transactions/namecoin_mainnet_5e3495.json new file mode 100644 index 0000000..209f857 --- /dev/null +++ b/tests/transactions/namecoin_mainnet_5e3495.json @@ -0,0 +1,63 @@ +{ + "txid": "5e349540789309a088f9ede78c2e42e233e670aabbbd79886adc541389cfa4fa", + "hash": "5e349540789309a088f9ede78c2e42e233e670aabbbd79886adc541389cfa4fa", + "version": 28928, + "size": 478, + "vsize": 478, + "locktime": 421921, + "vin": [ + { + "txid": "4748ec1d3acad8bdb357b5499530ce1c3ada97ae9952475e3901e8f75dd55506", + "vout": 1, + "scriptSig": { + "asm": "30450221008eff8db772c8018181ccb1355d29e32436982f13d032d6ad72191139f7d9790402201a98c67c368b2c389156cb20b88aef251ec4e22535d830cea7986bcf62815059[ALL] 04e1c4b9e1cb0090fb6f55b98da47ed030a9e6383f6dd7d17089237abf10e5d939147dae8da00fc0840cf452c0e1a1001a56691abaa2cf07dc03c5477a586be6e2", + "hex": "4830450221008eff8db772c8018181ccb1355d29e32436982f13d032d6ad72191139f7d9790402201a98c67c368b2c389156cb20b88aef251ec4e22535d830cea7986bcf62815059014104e1c4b9e1cb0090fb6f55b98da47ed030a9e6383f6dd7d17089237abf10e5d939147dae8da00fc0840cf452c0e1a1001a56691abaa2cf07dc03c5477a586be6e2" + }, + "sequence": 4294967294 + }, + { + "txid": "0c686779a1dcc867039a3c71934d6cde487c4eabd9cd2efd0bdcf15262ed9886", + "vout": 1, + "scriptSig": { + "asm": "3045022100d242038864fc1b09ccdf4707b4ba828289c946c1c8681cff6347708332b9f6630220425d2dc3e4bd608efa82c6392e9732502ccffeba8c037ebf22ba035fc959cda6[ALL] 046cd0bf29656995ca841923f30f4b7ac9ae7cb4265da65ca8bd38363387b9317449cb1a0d6a11bc71d70a571ca7ee5b6a5dfe37cac10ccb4ed5cdb82751ceaa4b", + "hex": "483045022100d242038864fc1b09ccdf4707b4ba828289c946c1c8681cff6347708332b9f6630220425d2dc3e4bd608efa82c6392e9732502ccffeba8c037ebf22ba035fc959cda60141046cd0bf29656995ca841923f30f4b7ac9ae7cb4265da65ca8bd38363387b9317449cb1a0d6a11bc71d70a571ca7ee5b6a5dfe37cac10ccb4ed5cdb82751ceaa4b" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 280384718, + "n": 0, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 9a52d8b8f425031b6ef40a847e771f6134af9804 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a9149a52d8b8f425031b6ef40a847e771f6134af980488ac", + "reqSigs": 1, + "type": "pubkeyhash", + "address": "NAeMWUDKZAjbDXM7BryV3Wa9Lp3C3aG7oq" + } + }, + { + "value": 1000000, + "n": 1, + "scriptPubKey": { + "nameOp": { + "op": "name_firstupdate", + "name": "d/heretostay", + "value": "{}", + "rand": "ca7d07e0aa9d23c2dc7efe5f2902f0e2ec22fe7c" + }, + "asm": "OP_NAME_FIRSTUPDATE 642f68657265746f73746179 ca7d07e0aa9d23c2dc7efe5f2902f0e2ec22fe7c 32123 OP_2DROP OP_2DROP OP_DUP OP_HASH160 ce26e759dbb966466446aab6e48cf39a23badd75 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "520c642f68657265746f7374617914ca7d07e0aa9d23c2dc7efe5f2902f0e2ec22fe7c027b7d6d6d76a914ce26e759dbb966466446aab6e48cf39a23badd7588ac", + "reqSigs": 1, + "type": "pubkeyhash", + "address": "NFNQ1Ez6ZYVQpvsWcePBQMSiA3LB4BT9o1" + } + } + ], + "hex": "00710000020655d55df7e801395e475299ae97da3a1cce309549b557b3bdd8ca3a1dec4847010000008b4830450221008eff8db772c8018181ccb1355d29e32436982f13d032d6ad72191139f7d9790402201a98c67c368b2c389156cb20b88aef251ec4e22535d830cea7986bcf62815059014104e1c4b9e1cb0090fb6f55b98da47ed030a9e6383f6dd7d17089237abf10e5d939147dae8da00fc0840cf452c0e1a1001a56691abaa2cf07dc03c5477a586be6e2feffffff8698ed6252f1dc0bfd2ecdd9ab4e7c48de6c4d93713c9a0367c8dca17967680c010000008b483045022100d242038864fc1b09ccdf4707b4ba828289c946c1c8681cff6347708332b9f6630220425d2dc3e4bd608efa82c6392e9732502ccffeba8c037ebf22ba035fc959cda60141046cd0bf29656995ca841923f30f4b7ac9ae7cb4265da65ca8bd38363387b9317449cb1a0d6a11bc71d70a571ca7ee5b6a5dfe37cac10ccb4ed5cdb82751ceaa4bfeffffff02ce54b610000000001976a9149a52d8b8f425031b6ef40a847e771f6134af980488ac40420f000000000041520c642f68657265746f7374617914ca7d07e0aa9d23c2dc7efe5f2902f0e2ec22fe7c027b7d6d6d76a914ce26e759dbb966466446aab6e48cf39a23badd7588ac21700600", + "blockhash": "5b8c0254e59018d9cba170efccec0e1909898b8552ab581ba73a482d5693d25b", + "confirmations": 145, + "time": 1539853690, + "blocktime": 1539853690 +} diff --git a/tests/transactions/namecoin_mainnet_cfc5d7.json b/tests/transactions/namecoin_mainnet_cfc5d7.json new file mode 100644 index 0000000..eca550d --- /dev/null +++ b/tests/transactions/namecoin_mainnet_cfc5d7.json @@ -0,0 +1,62 @@ +{ + "txid": "cfc5d7e6280af21ce96f016826080490106dbf53f12ed1e38737595564b125c1", + "hash": "cfc5d7e6280af21ce96f016826080490106dbf53f12ed1e38737595564b125c1", + "version": 28928, + "size": 513, + "vsize": 513, + "locktime": 422067, + "vin": [ + { + "txid": "29c4c6c3443395a675111f7d809f192874d574425c014bb30ba8b6d4958fce2a", + "vout": 1, + "scriptSig": { + "asm": "30440220545b4eb23ddd3053580b58ef445092135a39a102cd858c3f46a8e3bbd68c0bb302200eb29decfaf4d189ca6dcae6cf4d86ddee5a2e2122fc504179e84c119873b014[ALL] 04d9fb2666d199134a53392189011a1aac0942d21299d338c274ae46f35cbeb631f4a413810d43fc1f968d7abc07b4181e56a5042e9f134538f8208b648d3bc5c7", + "hex": "4730440220545b4eb23ddd3053580b58ef445092135a39a102cd858c3f46a8e3bbd68c0bb302200eb29decfaf4d189ca6dcae6cf4d86ddee5a2e2122fc504179e84c119873b014014104d9fb2666d199134a53392189011a1aac0942d21299d338c274ae46f35cbeb631f4a413810d43fc1f968d7abc07b4181e56a5042e9f134538f8208b648d3bc5c7" + }, + "sequence": 4294967294 + }, + { + "txid": "5e349540789309a088f9ede78c2e42e233e670aabbbd79886adc541389cfa4fa", + "vout": 1, + "scriptSig": { + "asm": "3045022100f446e902ad3218d9d14ea2328f3ee5432b8f3a20224c2fc5fd9919b1c3d4362f022072fa9b4f840f53795f96336fadb79af2fb8c1e750a6cd84a5189fc381b5d8d56[ALL] 040df31f5db8614a8178e6d0785a56118c4f7d8fed10e80156e47934bd486f71ad1e81da5fbca360507eadc12e6c6b082bc6bee9f30fe64e235ea1127e28dfdf9c", + "hex": "483045022100f446e902ad3218d9d14ea2328f3ee5432b8f3a20224c2fc5fd9919b1c3d4362f022072fa9b4f840f53795f96336fadb79af2fb8c1e750a6cd84a5189fc381b5d8d560141040df31f5db8614a8178e6d0785a56118c4f7d8fed10e80156e47934bd486f71ad1e81da5fbca360507eadc12e6c6b082bc6bee9f30fe64e235ea1127e28dfdf9c" + }, + "sequence": 4294967294 + } + ], + "vout": [ + { + "value": 1000000, + "n": 0, + "scriptPubKey": { + "nameOp": { + "op": "name_update", + "name": "d/heretostay", + "value": "{\"ip\":\"185.234.217.36\",\"map\":{\"*\":{\"ip\":\"185.234.217.36\"}}}" + }, + "asm": "OP_NAME_UPDATE 642f68657265746f73746179 7b226970223a223138352e3233342e3231372e3336222c226d6170223a7b222a223a7b226970223a223138352e3233342e3231372e3336227d7d7d OP_2DROP OP_DROP OP_DUP OP_HASH160 584e13c024ce2eac261902a3c9508731a3dfa143 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "530c642f68657265746f737461793b7b226970223a223138352e3233342e3231372e3336222c226d6170223a7b222a223a7b226970223a223138352e3233342e3231372e3336227d7d7d6d7576a914584e13c024ce2eac261902a3c9508731a3dfa14388ac", + "reqSigs": 1, + "type": "pubkeyhash", + "address": "N4dHCRYVP8oQa6ZXLC1DPnzbvuvq29hy6v" + } + }, + { + "value": 279093004, + "n": 1, + "scriptPubKey": { + "asm": "OP_DUP OP_HASH160 09804e98bc777f101343fcd3c67044742e785bf6 OP_EQUALVERIFY OP_CHECKSIG", + "hex": "76a91409804e98bc777f101343fcd3c67044742e785bf688ac", + "reqSigs": 1, + "type": "pubkeyhash", + "address": "MwSbzJTK1Dc2dBcE4u6nLJ95ZmEnzPUtSE" + } + } + ], + "hex": "00710000022ace8f95d4b6a80bb34b015c4274d57428199f807d1f1175a6953344c3c6c429010000008a4730440220545b4eb23ddd3053580b58ef445092135a39a102cd858c3f46a8e3bbd68c0bb302200eb29decfaf4d189ca6dcae6cf4d86ddee5a2e2122fc504179e84c119873b014014104d9fb2666d199134a53392189011a1aac0942d21299d338c274ae46f35cbeb631f4a413810d43fc1f968d7abc07b4181e56a5042e9f134538f8208b648d3bc5c7fefffffffaa4cf891354dc6a8879bdbbaa70e633e2422e8ce7edf988a00993784095345e010000008b483045022100f446e902ad3218d9d14ea2328f3ee5432b8f3a20224c2fc5fd9919b1c3d4362f022072fa9b4f840f53795f96336fadb79af2fb8c1e750a6cd84a5189fc381b5d8d560141040df31f5db8614a8178e6d0785a56118c4f7d8fed10e80156e47934bd486f71ad1e81da5fbca360507eadc12e6c6b082bc6bee9f30fe64e235ea1127e28dfdf9cfeffffff0240420f000000000065530c642f68657265746f737461793b7b226970223a223138352e3233342e3231372e3336222c226d6170223a7b222a223a7b226970223a223138352e3233342e3231372e3336227d7d7d6d7576a914584e13c024ce2eac261902a3c9508731a3dfa14388ac0c9fa210000000001976a91409804e98bc777f101343fcd3c67044742e785bf688acb3700600", + "blockhash": "182f4fbdac2309b8f3333802ff81008178661662bf2d7bd385a2e93d3ac493a4", + "confirmations": 3, + "time": 1539945678, + "blocktime": 1539945678 +}