Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. import binascii
  2. from layerthree import ioc
  3. from layerthree.utils import deserialize_header, header_to_hash, get_merkle_tree
  4.  
  5.  
  6. class Block:
  7. TYPE = 1
  8.  
  9. def __init__(self, blockhash: str):
  10. self.blockhash = blockhash
  11. self._verbose = None
  12. self._serialized_blockheader = None
  13.  
  14. @property
  15. def verbose(self):
  16. if not self._verbose:
  17. self._verbose = ioc.bitcoin_rpc_client.getblock(self.blockhash, verbose=True)
  18. return self._verbose
  19.  
  20. @verbose.setter
  21. def verbose(self, value):
  22. self._verbose = value
  23.  
  24. @property
  25. def txids_blob(self):
  26. data = b''
  27. for tx in self.verbose.get('tx'):
  28. data += binascii.unhexlify(tx)
  29. return data
  30.  
  31. @property
  32. def serialized_blockheader(self):
  33. if not self._serialized_blockheader:
  34. hex_header = ioc.bitcoin_rpc_client.getblockheader(self.blockhash, verbose=False)
  35. self._serialized_blockheader = hex_header and binascii.unhexlify(hex_header)
  36. return self._serialized_blockheader
  37.  
  38. @serialized_blockheader.setter
  39. def serialized_blockheader(self, value):
  40. self._serialized_blockheader = value
  41.  
  42. def serialize(self):
  43. header = self.serialized_blockheader
  44. data = self.txids_blob
  45. prefix = self.TYPE.to_bytes(2, 'little')
  46. block_size = self.verbose['size'].to_bytes(4, 'little')
  47. txs_count = len(self.verbose['tx']).to_bytes(2, 'little')
  48. return prefix + header + block_size + txs_count + data
  49.  
  50. @classmethod
  51. def deserialize(cls, data: bytes, verify_merkle_tree=True):
  52. data_type = int.from_bytes(data[:2], 'little')
  53. assert data_type == cls.TYPE
  54. header = data[2:82]
  55. block_size = int.from_bytes(data[82:86], 'little')
  56. txs_count = int.from_bytes(data[86:88], 'little')
  57. block_hash = header_to_hash(header)
  58. instance = cls(block_hash)
  59. instance.serialized_blockheader = header
  60. i = 0
  61. txids = []
  62. while i < txs_count:
  63. txids.append(
  64. binascii.hexlify(data[88+(i*32):120+(i*32)]).decode()
  65. )
  66. i += 1
  67. _deserialized_header = deserialize_header(header)
  68. cls.verbose = {
  69. "hash": block_hash,
  70. "version": _deserialized_header['version'],
  71. "versionHex": "",
  72. "merkleroot": _deserialized_header['merkle_root'],
  73. "time": _deserialized_header['timestamp'],
  74. "mediantime": _deserialized_header['timestamp'],
  75. "nonce": _deserialized_header['nonce'],
  76. "bits": str(_deserialized_header['bits']),
  77. "difficulty": 0,
  78. "chainwork": '00'*32,
  79. "previousblockhash": _deserialized_header['prev_block_hash'],
  80. "size": block_size,
  81. "weight": 0,
  82. "tx": txids
  83. }
  84. if verify_merkle_tree:
  85. merkle_tree = get_merkle_tree(txids)
  86. if binascii.hexlify(merkle_tree.root.val[::-1]).decode() != instance.verbose['merkleroot']:
  87. raise ValueError('verify_merkle_tree failed')
  88. return instance
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement