From 1e9a65dccb33d8f115fc834cc9ab5ec7e9b81645 Mon Sep 17 00:00:00 2001 From: "John L. Jegutanis" Date: Sat, 10 Jun 2017 19:41:44 +0300 Subject: [PATCH 1/4] Handle legacy daemon RPCs Add support for daemons that don't have the new 'getblock' RPC call that returns the block in hex, the workaround is to manually recreate the block bytes. The recreated block bytes may not be the exact ones as in the underlying blockchain but it is good enough for our indexing purposes. --- lib/tx.py | 31 ++++++++++++++++++++---- lib/util.py | 15 ++++++++++++ server/daemon.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 5 deletions(-) diff --git a/lib/tx.py b/lib/tx.py index 23aaea6..7ed30ba 100644 --- a/lib/tx.py +++ b/lib/tx.py @@ -123,6 +123,11 @@ class Deserializer(object): self._read_varbytes(), # pk_script ) + def _read_byte(self): + cursor = self.cursor + self.cursor += 1 + return self.binary[cursor] + def _read_nbytes(self, n): cursor = self.cursor self.cursor = end = cursor + n @@ -182,11 +187,6 @@ class DeserializerSegWit(Deserializer): # https://bitcoincore.org/en/segwit_wallet_dev/#transaction-serialization - def _read_byte(self): - cursor = self.cursor - self.cursor += 1 - return self.binary[cursor] - def _read_witness(self, fields): read_witness_field = self._read_witness_field return [read_witness_field() for i in range(fields)] @@ -290,3 +290,24 @@ class DeserializerZcash(Deserializer): self.cursor += 32 # joinSplitPubKey self.cursor += 64 # joinSplitSig return base_tx, double_sha256(self.binary[start:self.cursor]) + + +class TxTime(namedtuple("Tx", "version time inputs outputs locktime")): + '''Class representing transaction that has a time field.''' + + @cachedproperty + def is_coinbase(self): + return self.inputs[0].is_coinbase + + +class DeserializerTxTime(Deserializer): + def read_tx(self): + start = self.cursor + + return TxTime( + self._read_le_int32(), # version + self._read_le_uint32(), # time + self._read_inputs(), # inputs + self._read_outputs(), # outputs + self._read_le_uint32(), # locktime + ), double_sha256(self.binary[start:self.cursor]) diff --git a/lib/util.py b/lib/util.py index 78006b9..2c09127 100644 --- a/lib/util.py +++ b/lib/util.py @@ -34,6 +34,7 @@ import logging import re import sys from collections import Container, Mapping +from struct import pack class LoggedClass(object): @@ -156,6 +157,20 @@ def int_to_bytes(value): return value.to_bytes((value.bit_length() + 7) // 8, 'big') +def int_to_varint(value): + '''Converts an integer to a Bitcoin-like varint bytes''' + if value < 0: + raise Exception("attempt to write size < 0") + elif value < 253: + return pack(' 0: + transactions = await self.getrawtransactions(b.get('tx'), False) + + raw_block = header + num_txs = len(transactions) + if num_txs > 0: + raw_block += util.int_to_varint(num_txs) + raw_block += b''.join(transactions) + else: + raw_block += b'\x00' + + return raw_block + + def timestamp_safe(self, t): + return t if isinstance(t, int) else timegm(strptime(t, "%Y-%m-%d %H:%M:%S %Z")) From 74f899e54469a18940822ae878ca933debffd11f Mon Sep 17 00:00:00 2001 From: "John L. Jegutanis" Date: Sat, 10 Jun 2017 19:44:30 +0300 Subject: [PATCH 2/4] Add support for Blackcoin and Peercoin --- lib/coins.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/lib/coins.py b/lib/coins.py index 133a97f..60af405 100644 --- a/lib/coins.py +++ b/lib/coins.py @@ -39,9 +39,10 @@ from hashlib import sha256 import lib.util as util from lib.hash import Base58, hash160, double_sha256, hash_to_str from lib.script import ScriptPubKey -from lib.tx import Deserializer, DeserializerSegWit, DeserializerAuxPow, DeserializerZcash +from lib.tx import Deserializer, DeserializerSegWit, DeserializerAuxPow, \ + DeserializerZcash, DeserializerTxTime from server.block_processor import BlockProcessor -from server.daemon import Daemon +from server.daemon import Daemon, LegacyRPCDaemon from server.session import ElectrumX Block = namedtuple("Block", "header transactions") @@ -801,3 +802,60 @@ class Einsteinium(Coin): IRC_PREFIX = "E_" IRC_CHANNEL = "#electrum-emc2" RPC_PORT = 41879 + REORG_LIMIT = 2000 + + +class Blackcoin(Coin): + NAME = "Blackcoin" + SHORTNAME = "BLK" + NET = "mainnet" + XPUB_VERBYTES = bytes.fromhex("0488B21E") + XPRV_VERBYTES = bytes.fromhex("0488ADE4") + P2PKH_VERBYTE = bytes.fromhex("19") + P2SH_VERBYTES = [bytes.fromhex("55")] + WIF_BYTE = bytes.fromhex("99") + GENESIS_HASH = ('000001faef25dec4fbcf906e6242621d' + 'f2c183bf232f263d0ba5b101911e4563') + DESERIALIZER = DeserializerTxTime + DAEMON = LegacyRPCDaemon + TX_COUNT = 4594999 + TX_COUNT_HEIGHT = 1667070 + TX_PER_BLOCK = 3 + IRC_PREFIX = "E_" + IRC_CHANNEL = "#electrum-blk" + RPC_PORT = 15715 + REORG_LIMIT = 5000 + HEADER_HASH = None + + @classmethod + def header_hash(cls, header): + '''Given a header return the hash.''' + if cls.HEADER_HASH is None: + import scrypt + cls.HEADER_HASH = lambda x: scrypt.hash(x, x, 1024, 1, 1, 32) + + version, = struct.unpack(' 6: + return super().header_hash(header) + else: + return cls.HEADER_HASH(header); + + +class Peercoin(Coin): + NAME = "Peercoin" + SHORTNAME = "PPC" + NET = "mainnet" + P2PKH_VERBYTE = bytes.fromhex("37") + P2SH_VERBYTES = [bytes.fromhex("75")] + WIF_BYTE = bytes.fromhex("b7") + GENESIS_HASH = ('0000000032fe677166d54963b62a4677' + 'd8957e87c508eaa4fd7eb1c880cd27e3') + DESERIALIZER = DeserializerTxTime + DAEMON = LegacyRPCDaemon + TX_COUNT = 1207356 + TX_COUNT_HEIGHT = 306425 + TX_PER_BLOCK = 4 + IRC_PREFIX = "E_" + IRC_CHANNEL = "#electrum-ppc" + RPC_PORT = 9902 + REORG_LIMIT = 5000 From fe3008679596eed56382a9f0becc3ea426a99d1e Mon Sep 17 00:00:00 2001 From: "John L. Jegutanis" Date: Sat, 10 Jun 2017 19:26:06 +0300 Subject: [PATCH 3/4] Digibyte switched to SegWit --- lib/coins.py | 1 + tests/blocks/digibyte_mainnet_4394891.json | 19 +++++++++++++++++++ tests/test_blocks.py | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 tests/blocks/digibyte_mainnet_4394891.json diff --git a/lib/coins.py b/lib/coins.py index 60af405..3f45230 100644 --- a/lib/coins.py +++ b/lib/coins.py @@ -668,6 +668,7 @@ class DigiByte(Coin): WIF_BYTE = bytes.fromhex("80") GENESIS_HASH = ('7497ea1b465eb39f1c8f507bc877078f' 'e016d6fcb6dfad3a64c98dcc6e1e8496') + DESERIALIZER = DeserializerSegWit TX_COUNT = 1046018 TX_COUNT_HEIGHT = 1435000 TX_PER_BLOCK = 1000 diff --git a/tests/blocks/digibyte_mainnet_4394891.json b/tests/blocks/digibyte_mainnet_4394891.json new file mode 100644 index 0000000..7616b5c --- /dev/null +++ b/tests/blocks/digibyte_mainnet_4394891.json @@ -0,0 +1,19 @@ +{ + "hash": "00000000000000360f1e38ab606450cb321ee7ccd1749f0aa9717e81bdc88a4f", + "size": 2662, + "height": 4394891, + "merkleroot": "92cfbbc21caf5cd9158f608f6e021cf31ee02ca5d80a2ad441ad3a1968a36df4", + "tx": [ + "84013cf078d219325319ee26606f238f5d43d2a64b8b9eb0668aa36ff9f1497d", + "5a13a021223ba10d6bb45b6f0099222befae21ba5e94da45083e9a4d44208431", + "7c2de0d50ea330ea77a3ede88c1ea3ad5512a90d23c3ed440b8244d380c8f5f6", + "44c97671699cc8e33ed227dc2d083d728c21a98943e10dea0cf1fd4f39138401", + "3f5791d2a0feb15502e04ff50b357e2434ff7795e8bdf655d7bc052a31d09c6c", + "0f1420b301192ee97e27f3365db71d2e54c8bb14636a84adf7f8298b37439c3c" + ], + "time": 1493396706, + "nonce": 1152585183, + "bits": "197c6507", + "previousblockhash": "e0e151dc61399a257de7721df34af1d80caf4e2373e182ee1889356f047aef22", + "block": "0202002022ef7a046f358918ee82e173234eaf0cd8f14af31d72e77d259a3961dc51e1e0f46da368193aad41d42a0ad8a52ce01ef31c026e8f608f15d95caf1cc2bbcf92e26c035907657c19df0db34406010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff48038b0f4304e26c035904fabe6d6d7b2cb15c6afb3358bc138b2c5d3ea77029a79ba2a160eb0de64fb086dbdb86d6800000000000000087225c010d2f6e6f64655374726174756d2f00000000020000000000000000266a24aa21a9edc7679d2b2c8d87b91aa75fdc86ebad16f55cc3e7f30ba8ab3243a9aa27ae71a83d5bc6fb140000001976a914818dd7c871d1da14dff3a1ef0a1774720892d9d188ac01200000000000000000000000000000000000000000000000000000000000000000000000000100000001ce9be9710120296f8b0256ca87ad6b6da454a3f3bcd18ae2b0c04dbcafe8747a000000006a47304402206383b0eef3291a0c6721c06bc87544f9e3430f53ac7b14514491f4ca17e4e51c0220202cbdc050de073eeac995dd66222cea3c6c1ca08d17f4923f2caac547603e33012103fee47ef038c3acd7ee6ad449ce0316dcfab5bb6ec10adf89f8949f1bf3f5c117ffffffff02172e5cfc060000001976a914e2a12c65e85e07df375a4ffa01dd6f00a3e6f9b088acc6bb04f0000000001976a9142f8d7af63909d15011316795f1d760864b40590888ac8a0f43000100000001ccb42e3d95f72cb3298ff956b0b3f7e3eea1894ea341762584128506818c40b5000000006a47304402200b7bc22449dd31382af4df432a814030f0a90bc2557581d2672db577ee3b7dbd02200d794170b920cb46d757778331d6423c5ee40ddfd4ac13bfe61a7062656ddaec012103f475fe4752b8a241d346a226c186fa87861c92c1a60910d9547c32802236f233ffffffff02387a19e0070000001976a91443e4c5bcde490084b44d8b0ef8e632ab613f2f3588ac37ddfcb2020000001976a9148733c0565ff4d6d1700fb295e1e2ee54fc89a90088ac8a0f4300010000000843a4b739d09bd762bfb4db75e3302c3181233d90ecea1882d6c63ba4141960e0010000006a47304402202870f430fa9afb1cf641e03a6375fb6dc29649796112059965636ed03ba26e63022022d2f336a29d5e5883794c4dc834cd2d0cb2b0f6e7b555a635c2c1b9c1844eb90121029ecc902531c7c82051d05fb6150bda05e6d3a9ec5e5d745f2157e9a7199a5cfeffffffff889e5bd9c8546d8a7712059a49e98546f1900307ed1a4c5747c8d1ea4c613063010000006a47304402200741e47d3487e493326ef8d252b8b22ccadd3b3c8e8c6298193b490b9c157e1d02207fc176923fd23ef46adc2881565c6b59deca7b38a999bd25ad844f51ae7f87450121029ecc902531c7c82051d05fb6150bda05e6d3a9ec5e5d745f2157e9a7199a5cfeffffffffdb03f33eff3f40ec58ed398f71e9c6fbfebc5f8ce11dc0ad564c4acad260d896010000006a47304402202cdf16c328728860a3e9b9ea77f33b57cec899dfaa092c647355910cd49c5e75022073737ccda4faf99b9121c9bfc3c8519bba8a62870afaa8a7fdcd1d1233ead9c40121029ecc902531c7c82051d05fb6150bda05e6d3a9ec5e5d745f2157e9a7199a5cfeffffffff185c9f4cbd72e3393d11b38f52a4180ea9569e1e4c941735118b94a065748ee7010000006b483045022100b067da4c46680fac6e4cc5d596e9a519a10980a83fa00bca9ae700596ae02bb4022038daa9540fdba04f0d2e0e6b8ae252abb2524ce6bc35f99423db3b0fc0e3d6660121029ecc902531c7c82051d05fb6150bda05e6d3a9ec5e5d745f2157e9a7199a5cfeffffffff7ba77d5b20b9c847f36bcf91378514feccf269501bff9c03d1ee040e4576d10c010000006b48304502210082d7d3feeb0834e840b83078e6a1e877a39a4bea478b1e6a092ac258610fc075022027f02e1b4b928fc6b87d2c4cd1c38b04d4e0f8849c20cec56515f163c71e34b10121029ecc902531c7c82051d05fb6150bda05e6d3a9ec5e5d745f2157e9a7199a5cfeffffffff679991e83b2eda22969ff4e8d744d6a61a2564dfbd93e2268cebed66e3c89090010000006a47304402207464320ec4d46258311db47c7d288065e43a06f5e8ec57462d00e0107ac1f3dd02207195da6de457572ad2a859795c384fa9586a746f069b04fb2cf402e8b6761f020121029ecc902531c7c82051d05fb6150bda05e6d3a9ec5e5d745f2157e9a7199a5cfeffffffff99cceb882ff6dac25e4ed3b1544bdb1a86ea131c85a35affadac5b7d364af243010000006b483045022100c1b8bcdb3d7e1ddbc5139f0f7e3421595725341cc1c5fac100c37ff26bcc22ce0220206eb9ac6cc6f2274b73fe57a710d7c10357effa11d18ed5c1152ac0cf7883630121029ecc902531c7c82051d05fb6150bda05e6d3a9ec5e5d745f2157e9a7199a5cfefffffffffb859d8ef6107164fad5d4cf5b66b33c28fae160f5a8d0c7b581da7529c3b330010000006b483045022100810389a67e78a1ea701395cd7309d117df4da74f08494d72ed85068eb1390321022004967309f94749f7c509e58bd8e8a9a4e5e22bfe1e633c49860708ee6138a16f0121029ecc902531c7c82051d05fb6150bda05e6d3a9ec5e5d745f2157e9a7199a5cfeffffffff0222c39e2c0f0000001976a914058fe22860de1e0f920000474b75ed1f1921715488ac963677b1980000001976a91433411cfe6fd4b0711178aa01b766768f225f49e988ac8a0f430001000000027f96093f8cf13a06874e51eb746fe3abf417ae7d2112bde00500862cee7b61fd010000006b4830450221008a9b35de0e1ad798718181fc87f2e9df1e6014935184b477b039c64b202da16302200710b078f9af82730a790371e344e990808d7ad4baa2c22afee665fafbc1b48401210292f4522efa5e69119d2e730e693c044b8bba5ad903a19bc2005828e34a92fc1effffffffb96dee16abb340cbf94a82d4483fd352f07957d4a8c0af7b15152d8a9d27f5c6010000006a473044022028c09e38d44c7840cf7b27aa467172f8b1fbe563c215dbf9fa634eabf3ae7b1602202165c094826d09b5902e4e0ab1176f3842dca5df62006b5cdcd53bc181b8fac401210292f4522efa5e69119d2e730e693c044b8bba5ad903a19bc2005828e34a92fc1effffffff0316d09911140000001976a9142a33a4af7bd5ec3527d15fa2641238dc17bca9af88acb0a34d00000000001976a91499e1d69a1a492f91b5881378f12e1f04490cc38388ac266570cc130000001976a914b9dffedfa8b5de19d112062c41fe8df2f3314d3e88ac220f43000100000001620c30d8caf8a899b1cb5b8a08f68ef25900ff0457416fc9d593a1e4766e429b010000006b483045022100f217c1d780c4c38c267b715fd6605479def6f46e854dade7693ca30dde841f8e0220152434c8a50b00f0346c545551117a6edff9c1557b7fcf69216c91d795c5377f012102b11355a89c8fba57d2630ea6e83613c5a3faf19affcf66b166034969ca3520a5ffffffff026164b729010000001976a914fe59bacd86811cb31e06385d746d31b7062c1cfc88ac96bbc3a10b0000001976a91409e590d5122a22c14a737320fc7da480149b84f588ac8a0f4300" +} \ No newline at end of file diff --git a/tests/test_blocks.py b/tests/test_blocks.py index ff8b756..769a4c5 100644 --- a/tests/test_blocks.py +++ b/tests/test_blocks.py @@ -47,7 +47,7 @@ for name in os.listdir(BLOCKS_DIR): with open(os.path.join(BLOCKS_DIR, name)) as f: blocks.append((coin, json.load(f))) except Exception as e: - blocks.append(pytest.mark.skip(name)) + blocks.append(pytest.fail(name)) @pytest.fixture(params=blocks) From b48465a065ca082e940524e636d731f57ab145a9 Mon Sep 17 00:00:00 2001 From: "John L. Jegutanis" Date: Sat, 10 Jun 2017 19:30:52 +0300 Subject: [PATCH 4/4] Add Reddcoin support --- lib/coins.py | 22 +++++++++++++++++++++- lib/tx.py | 22 ++++++++++++++++++++++ tests/blocks/reddcoin_mainnet_1200000.json | 15 +++++++++++++++ tests/blocks/reddcoin_mainnet_8000.json | 20 ++++++++++++++++++++ 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 tests/blocks/reddcoin_mainnet_1200000.json create mode 100644 tests/blocks/reddcoin_mainnet_8000.json diff --git a/lib/coins.py b/lib/coins.py index 3f45230..82c48d6 100644 --- a/lib/coins.py +++ b/lib/coins.py @@ -40,7 +40,7 @@ import lib.util as util from lib.hash import Base58, hash160, double_sha256, hash_to_str from lib.script import ScriptPubKey from lib.tx import Deserializer, DeserializerSegWit, DeserializerAuxPow, \ - DeserializerZcash, DeserializerTxTime + DeserializerZcash, DeserializerTxTime, DeserializerReddcoin from server.block_processor import BlockProcessor from server.daemon import Daemon, LegacyRPCDaemon from server.session import ElectrumX @@ -860,3 +860,23 @@ class Peercoin(Coin): IRC_CHANNEL = "#electrum-ppc" RPC_PORT = 9902 REORG_LIMIT = 5000 + + +class Reddcoin(Coin): + NAME = "Reddcoin" + SHORTNAME = "RDD" + NET = "mainnet" + XPUB_VERBYTES = bytes.fromhex("0488B21E") + XPRV_VERBYTES = bytes.fromhex("0488ADE4") + P2PKH_VERBYTE = bytes.fromhex("3d") + P2SH_VERBYTES = [bytes.fromhex("05")] + WIF_BYTE = bytes.fromhex("bd") + GENESIS_HASH = ('b868e0d95a3c3c0e0dadc67ee587aaf9' + 'dc8acbf99e3b4b3110fad4eb74c1decc') + DESERIALIZER = DeserializerReddcoin + TX_COUNT = 5413508 + TX_COUNT_HEIGHT = 1717382 + TX_PER_BLOCK = 3 + IRC_PREFIX = "E_" + IRC_CHANNEL = "#electrum-rdd" + RPC_PORT = 45443 diff --git a/lib/tx.py b/lib/tx.py index 7ed30ba..554f349 100644 --- a/lib/tx.py +++ b/lib/tx.py @@ -311,3 +311,25 @@ class DeserializerTxTime(Deserializer): self._read_outputs(), # outputs self._read_le_uint32(), # locktime ), double_sha256(self.binary[start:self.cursor]) + + +class DeserializerReddcoin(Deserializer): + def read_tx(self): + start = self.cursor + + version = self._read_le_int32() + inputs = self._read_inputs() + outputs = self._read_outputs() + locktime = self._read_le_uint32() + if version > 1: + time = self._read_le_uint32() + else: + time = 0 + + return TxTime( + version, + time, + inputs, + outputs, + locktime, + ), double_sha256(self.binary[start:self.cursor]) diff --git a/tests/blocks/reddcoin_mainnet_1200000.json b/tests/blocks/reddcoin_mainnet_1200000.json new file mode 100644 index 0000000..cc7b723 --- /dev/null +++ b/tests/blocks/reddcoin_mainnet_1200000.json @@ -0,0 +1,15 @@ +{ + "hash": "bea68724bfcdc5d35bf9bbf9cb6680e196e5661afe95b2a205e74a2fe175ac79", + "size": 443, + "height": 1200000, + "merkleroot": "504b073c16d872d24f2c3de8a4c2c76d08df5056f3a4a8d0e32ff4220215a250", + "tx": [ + "6aaad9725ae7beb40d80dac9c5300a8e1cf8783adb0ea41da4988b3476bda9b8", + "4a949402995c11b3306c0c91fd85edf0d3eb8dee4bf6bd07a241fa170156cd3c" + ], + "time": 1463612841, + "nonce": 0, + "bits": "1c0a4691", + "previousblockhash": "438b564171da6fbbe6fd9d52c16ea2b1aa8c169951822225cf097d5da7cdba76", + "block": "0300000076bacda75d7d09cf2522825199168caab1a26ec1529dfde6bb6fda7141568b4350a2150222f42fe3d0a8a4f35650df086dc7c2a4e83d2c4fd272d8163c074b50a9f53c5791460a1c000000000202000000010000000000000000000000000000000000000000000000000000000000000000ffffffff020000ffffffff0100000000000000000000000000a9f53c570200000001a40cad8a9afe2888f746d762cb36649b5afd4e8ce4468fd8d08fc296d26dc4840100000048473044022036392ee6eb58c5a9a2a681692cabdc2b00166c374cfb711055bc2c4d6c61a1d40220475728eed260bf972ef44909f0d6fa282f17e92b5e57ee383c7171e8a3baee1f01ffffffff030000000000000000000056b12a38720000232102bee8ce24a99260fbb6c10f0b904498fa71ec08e51b531878d3f6568ef09acb91ac0ad6b22a38720000232102bee8ce24a99260fbb6c10f0b904498fa71ec08e51b531878d3f6568ef09acb91ac00000000a9f53c57473045022100fe801bae06c9db3076fad2f72930f76dbe1cae29a162447b13d0df749e5913df02203621013f87da4dbca08702d8c7975f702bad9df40902038b93e622a0dd9c0896" +} \ No newline at end of file diff --git a/tests/blocks/reddcoin_mainnet_8000.json b/tests/blocks/reddcoin_mainnet_8000.json new file mode 100644 index 0000000..4149476 --- /dev/null +++ b/tests/blocks/reddcoin_mainnet_8000.json @@ -0,0 +1,20 @@ +{ + "hash": "4889bb7d1ba24cc66c2d903f6643b0ade243aca5101a8aff87ab4c2ab2a15ec5", + "size": 1560, + "height": 80000, + "merkleroot": "193313cfa4d8a4bc15fb5526b69a87c922e0f6520295f66165358f0af6b5d637", + "tx": [ + "ad01e368a301b855d5f4499bc787b161428d6994c4847c0b2813950630a73950", + "1799481d7fed61c029159d314f75f3d6f69a7f8c237443470394085307802782", + "8db4b2c62fca987462c482d24ce0b78d2a3dd3928d5d99112ccad75deb6ff7de", + "ab0a1e66e54c737be6ea2be2c61cd55879d33c0fc5d35aa6389487e06c809cfc", + "1bb3854ed7fe9905b5637d405cd0715e5cb6f5fe233304a1588c53bdcf60f593", + "08d3ccf77f30e62d8773669adea730698806516239933ac7c4285bcacdb37989", + "19cbdc4acfb07dc29c73f039d8f5db967ce30c0667fda60babc700a7c53c0b5f" + ], + "time": 1396181239, + "nonce": 1368399360, + "bits": "1c0cc111", + "previousblockhash": "e34cfbf84095c64276ee098de50c3a1f863df9336968e9fb8a973bdd52e3ed04", + "block": "0200000004ede352dd3b978afbe9686933f93d861f3a0ce58d09ee7642c69540f8fb4ce337d6b5f60a8f356561f6950252f6e022c9879ab62655fb15bca4d8a4cf133319f708385311c10c1c001e90510701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2703803801062f503253482f04f608385308f800f159010000000d2f7374726174756d506f6f6c2f000000000100e63572180900001976a9148d41bc27ab2cc999338750edd4b0012bdb36f70288ac0000000001000000014b1a8085e29ca8ef2bf1de5f0637c6ef597b67223a087458e51e21168a0e44a3000000006b48304502200b781c255481e90f0e1d2fedbc1ffb42562434c324566444da8718a8a2c5182d022100f50faa7a9f7b90b4b805050c9731a79fb9c599ddfb3d84449d0cff7ee216bf59012103d7ab8ea88d09589410bdb93cd466d92f56985a3cff6d74dce3f033500135f0c5ffffffff02d72ea96581330e001976a91422758e8f790ea0e4ab87ad3990e8af86c77375c088ac1c1cab70190000001976a91434e880ed4cb32ebb1e0842b4f05efe562724f08788ac000000000100000001616c5b1a7ee823fa2d5347011b34e1ea027f9494823d37fb175eece8f852f987000000006a473044022000be9cf6677d879d170c597b8a465137577119ebc7d01773dc13df7af7e0bf1102202acfce90f478c0d179ab98d708f1e24f6dab4fe60c75893f8bad12991b30f41301210355dad820f63f1c315dc16c5afd9782e4d0b225ea29320a85576bc2c82fde6e7effffffff02ceb618fa97ac10001976a914e14548bfd2e14e0cabaf535c7c80a227238b35e188ac1c1cab70190000001976a914d2046a1ad1dbc32e69dae4da0a8730379105936e88ac000000000100000001a6b3081431b43c3247df88b3b6d123d2f2d7ba2095c6ef4f6532feb2c45f9210010000006b4830450221008fb902cc4130bae26439c47c13467a7d8a8c52ac2d88a200548f1e8f8b100b910220125b45cee0765389a59d4cca65482bdf79d3bc8fdaa5a0142e7829e4a2568124012103cdece1576249c8e05fb0aa2cbe61aa959330ff2f9e3c5cd2e5152e90650d9386ffffffff02bbba56d0d88606001976a91407499b20688a0b61b4a526681647de739dab818e88ac1c1cab70190000001976a9147085556af12556138277188e3958a869eeced02088ac000000000100000001fc9c806ce0879438a65ad3c50f3cd37958d51cc6e22beae67b734ce5661e0aab000000006c493046022100dca959b02a4dde588b3e5c3e71877797b97d7094a82cdd6b6b52c3d04a8c17c3022100938b2f70eed007d20ef9d7d055fc9b8785e71e3f0981558503fb3635b08aa6d40121039d216b71bad34246ceff262afe6df520761fc696fd9862c3f2f7e337ad93d881ffffffff0202386cc4f57e06001976a914ee343e816e6782262c3f6b1b9ec8f8c17d47a88c88acb9a1f405e30700001976a914ba81e33df7ba3d18728c6c206f8ad0b30b83b71988ac00000000010000000193f560cfbd538c58a1043323fef5b65c5e71d05c407d63b50599fed74e85b31b000000006a4730440220153f0a0a16e13943c4869e8f768c64e9f1844d14823f80878a6e44752a041c49022036ec13a307bafee74387048c3772cfb5ebdc138d70d6b4c256788a86db93ab5801210281232e155b37ebd64759ee4983962e9f8ccfd95e302d828de1406549e7c327a4ffffffff029014fad0166506001976a914b05959ea5dd831fd082488298466c9307a46f55b88ac72427cedde1900001976a914c2e3e90990f452c19ccef5df1cc3711c2e5d448288ac0000000001000000018979b3cdca5b28c4c73a9339625106886930a7de9a6673872de6307ff7ccd308000000006b483045022100ec50258bfec642e6c986192f338b7a1eec84c872d9b51ccc6f1c7329da20af77022047a6836d7c5f416c2eef6ef59fae9cc627ff80882897fe3eabd775e2a4a08533012102240bb70ae679cb25d60e2e0f90f98017eac7b6abbf1e00797ef930f02f0b98eeffffffff029e75ab66cd6306001976a9144c9ef3b178febefc62a0067e67e8434afe864a6788acf2bd5864490100001976a9143cde6d950e730b199c5857564afe7f222e139ead88ac00000000" +} \ No newline at end of file