diff --git a/lib/coins.py b/lib/coins.py index 133a97f..82c48d6 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, DeserializerReddcoin 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") @@ -667,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 @@ -801,3 +803,80 @@ 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 + + +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 23aaea6..554f349 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,46 @@ 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]) + + +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/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")) 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/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 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)