Browse Source

Add Xaya as new coin with basic chain handling (#889)

* Split out deserialisation of CAuxPow.

The current DeserializerAuxPow has code for reading a block header
including (potentially) an auxpow.  In this change, we split out the
logic for reading the actual CAuxPow instance to its own function.

This makes the code easier to read, as the different steps are more
clearly separated.  It will also be useful for working with CAuxPow
instances that are part of a different serialisation format (e.g.
for the Xaya blockchain).

* Add Xaya coin with deserialiser.

This defines a new coin for Xaya (https://github.com/xaya/xaya), with
the appropriate deserialiser methods.  Xaya is based on Namecoin, but
uses its own special twist on auxpow for the PoW, so we need to handle
that properly in block-header deserialisation.

Xaya also has names like Namecoin (but with slightly changed semantics),
but handling for them (i.e. building a name index in addition to the
address index) will be added later on.

* Keep more data in truncated Xaya headers.

When Xaya headers are truncated (because they are checkpointed), we still
need to send the algorithm and bits with them.  That is needed for the
difficulty retargeting of Xaya to work correctly.

* Define peers for Xaya.

We will run ElectrumX instances on the seeder VPSes.  Set those in PEERS
for mainnet (there are no peers for testnet).
patch-2
Daniel Kraft 5 years ago
committed by Neil
parent
commit
5584b68762
  1. 54
      electrumx/lib/coins.py
  2. 74
      electrumx/lib/tx.py
  3. 2
      electrumx/server/session.py
  4. 31
      tests/blocks/xaya_mainnet_neoscrypt_400021.json
  5. 103
      tests/blocks/xaya_mainnet_sha256d_100000.json
  6. 1
      tests/test_blocks.py
  7. 8
      tests/test_transactions.py
  8. 66
      tests/transactions/xaya_mainnet_currency_bb65bf.json

54
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

74
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)

2
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

31
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"
}

103
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"
}

1
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])

8
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

66
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
}
Loading…
Cancel
Save