def test_parse_message_success_all_types(self): # TODO: pull these numbers into constants, along with all the BTC messages self.create_message_successfully(self.VERSION_BTC_MESSAGE, VersionBtcMessage) self.create_message_successfully(VerAckBtcMessage(self.MAGIC), VerAckBtcMessage) self.create_message_successfully(PingBtcMessage(self.MAGIC), PingBtcMessage) self.create_message_successfully(PongBtcMessage(self.MAGIC, 123), PongBtcMessage) self.create_message_successfully(GetAddrBtcMessage(self.MAGIC), GetAddrBtcMessage) self.create_message_successfully( AddrBtcMessage(self.MAGIC, [(int(time.time()), "127.0.0.1", 8000)]), AddrBtcMessage) inv_vector = [(1, self.HASH), (2, self.HASH)] self.create_message_successfully(InvBtcMessage(self.MAGIC, inv_vector), InvBtcMessage) self.create_message_successfully( GetDataBtcMessage(self.MAGIC, inv_vector), GetDataBtcMessage) self.create_message_successfully( NotFoundBtcMessage(self.MAGIC, inv_vector), NotFoundBtcMessage) hashes = [self.HASH, self.HASH] self.create_message_successfully( GetHeadersBtcMessage(self.MAGIC, self.VERSION, hashes, self.HASH), GetHeadersBtcMessage) self.create_message_successfully( GetBlocksBtcMessage(self.MAGIC, self.VERSION, hashes, self.HASH), GetBlocksBtcMessage) self.create_message_successfully( TxBtcMessage(self.MAGIC, self.VERSION, [], [], 0), TxBtcMessage) txs = [TxIn(buf=bytearray(10), length=10, off=0).rawbytes()] * 5 self.create_message_successfully( BlockBtcMessage(self.MAGIC, self.VERSION, self.HASH, self.HASH, 0, 0, 0, txs), BlockBtcMessage) self.create_message_successfully( HeadersBtcMessage(self.MAGIC, [helpers.generate_bytearray(81)] * 2), HeadersBtcMessage) self.create_message_successfully( RejectBtcMessage(self.MAGIC, b"a message", RejectBtcMessage.REJECT_MALFORMED, b"test break", helpers.generate_bytearray(10)), RejectBtcMessage) self.create_message_successfully(SendHeadersBtcMessage(self.MAGIC), SendHeadersBtcMessage) self.create_message_successfully( FeeFilterBtcMessage(self.MAGIC, fee_rate=100), FeeFilterBtcMessage) self.create_message_successfully( BtcMessage(self.MAGIC, b'xversion', 0, bytearray(30)), XversionBtcMessage)
def bx_tx_to_tx(self, tx_msg): if not isinstance(tx_msg, TxMessage): raise TypeError("tx_msg is expected to be of type TxMessage") buf = bytearray(btc_constants.BTC_HDR_COMMON_OFF) + tx_msg.tx_val() raw_btc_tx_msg = BtcMessage(self._btc_magic, TxBtcMessage.MESSAGE_TYPE, len(tx_msg.tx_val()), buf) btc_tx_msg = TxBtcMessage(buf=raw_btc_tx_msg.buf) return btc_tx_msg
def setUp(self): super().setUp() self.node1.alarm_queue = AlarmQueue() self.node2.alarm_queue = AlarmQueue() self.network_num = 1 self.magic = 12345 self.version = 23456 self.prev_block_hash = bytearray(crypto.double_sha256(b"123")) self.prev_block = BtcObjectHash(self.prev_block_hash, length=crypto.SHA256_HASH_LEN) self.merkle_root_hash = bytearray(crypto.double_sha256(b"234")) self.merkle_root = BtcObjectHash(self.merkle_root_hash, length=crypto.SHA256_HASH_LEN) self.bits = 2 self.nonce = 3 opts = self.gateway_1_opts() if opts.use_extensions: helpers.set_extensions_parallelism() self.btc_message_converter = btc_message_converter_factory.create_btc_message_converter( self.magic, opts) self.btc_transactions = [ TxBtcMessage(self.magic, self.version, [], [], i) for i in range(self.TRANSACTIONS_COUNT) ] self.btc_transactions_for_block = [ tx_btc_message.rawbytes()[btc_constants.BTC_HDR_COMMON_OFF:] for tx_btc_message in self.btc_transactions ] self.transactions = [ self.btc_message_converter.tx_to_bx_txs(tx_btc_message, self.network_num)[0][0] for tx_btc_message in self.btc_transactions ] self.transactions_with_short_ids = [ TxMessage(tx_message.tx_hash(), tx_message.network_num(), "", i + 1, tx_message.tx_val()) for i, tx_message in enumerate(self.transactions) ] self.transactions_with_no_content = [ TxMessage(tx_message.tx_hash(), tx_message.network_num(), "", i + 1) for i, tx_message in enumerate(self.transactions) ] self.transactions_by_short_id = { tx_message.short_id(): tx_message for tx_message in self.transactions_with_short_ids } self.block = BlockBtcMessage(self.magic, self.version, self.prev_block, self.merkle_root, int(time.time()), self.bits, self.nonce, self.btc_transactions_for_block)
def setUp(self): self.local_node_fileno = 1 self.remote_node_fileno = 2 self.gateway_node = spies.make_spy_node(BtcGatewayNode, 8000, include_default_btc_args=True) self.btc_node_connection = spies.make_spy_connection( BtcNodeConnection, self.local_node_fileno, 8001, self.gateway_node) self.btc_remote_node_connection = spies.make_spy_connection( BtcRemoteConnection, self.remote_node_fileno, 8002, self.gateway_node) self.gateway_node.sdn_connection = MagicMock() self.gateway_node.node_conn = self.btc_node_connection self.gateway_node.remote_node_conn = self.btc_remote_node_connection self.gateway_node.connection_pool.add(self.local_node_fileno, LOCALHOST, 8001, self.btc_node_connection) self.gateway_node.connection_pool.add(self.remote_node_fileno, LOCALHOST, 8002, self.btc_remote_node_connection) self.gateway_node.account_id = "1234" self.handshake = \ bytearray(VersionBtcMessage(100, 1000, "127.0.0.1", 8333, "0.0.0.0", 8333, 13, 0, bytearray("hello", "utf-8"), 0).rawbytes()) + \ bytearray(VerAckBtcMessage(100).rawbytes()) inps = [ TxIn(prev_outpoint_hash=bytearray("0" * 32, "utf-8"), prev_out_index=10, sig_script=bytearray(1000), sequence=32) ] outs = [TxOut(value=10, pk_script=bytearray(1000))] self.txmsg = bytearray( TxBtcMessage(magic=100, version=0, tx_in=inps, tx_out=outs, lock_time=12345).rawbytes()) self.blockmsg = bytearray( BlockBtcMessage(magic=100, version=0, prev_block=get_object_hash(bytearray(32)), merkle_root=get_object_hash(bytearray(32)), timestamp=1023, bits=1, txns=[bytearray(64)] * 32000, nonce=34).rawbytes()) self.transform = MessageTransformations()
def test_msg_block_too_old(self): block_timestamp = int( time.time() ) - 1 - self.node.opts.blockchain_ignore_block_interval_count * self.node.opts.blockchain_block_interval txns = [ TxBtcMessage(0, 0, [], [], i).rawbytes()[BTC_HDR_COMMON_OFF:] for i in range(10) ] message = BlockBtcMessage(0, 0, self.HASH, self.HASH, 0, block_timestamp, 0, txns) self.sut.msg_block(message) self.node.block_processing_service.queue_block_for_processing.assert_not_called( )
def generate_btc_tx() -> TxBtcMessage: inps = [ TxIn(prev_outpoint_hash=bytearray("0" * 32, "utf-8"), prev_out_index=10, sig_script=bytearray(1000), sequence=32) ] outs = [TxOut(value=10, pk_script=bytearray(1000))] return TxBtcMessage(magic=100, version=1, tx_in=inps, tx_out=outs, lock_time=12345)
def run_multi_setup(instance): if self.txns: instance.txns = [ TxBtcMessage( instance.magic, instance.version, [], [], i ).rawbytes()[BTC_HDR_COMMON_OFF:] for i in range(10) ] else: instance.txns = [] normal_tx_service, normal_converter = instance.init(False) extension_tx_service, extension_converter = instance.init(True) instance.btc_message_converter = normal_converter instance.tx_service = normal_tx_service func(instance) instance.btc_message_converter = extension_converter instance.tx_service = extension_tx_service func(instance)
def btc_block(timestamp=None, real_block=None): if real_block is not None: return BlockBtcMessage(buf=bytearray(convert.hex_to_bytes(real_block))) if timestamp is None: timestamp = int(time.time()) magic = 12345 version = 23456 prev_block_hash = bytearray(crypto.double_sha256(b"123")) prev_block = BtcObjectHash(prev_block_hash, length=SHA256_HASH_LEN) merkle_root_hash = bytearray(crypto.double_sha256(b"234")) merkle_root = BtcObjectHash(merkle_root_hash, length=SHA256_HASH_LEN) bits = 2 nonce = 3 txns = [ TxBtcMessage(magic, version, [], [], i).rawbytes()[BTC_HDR_COMMON_OFF:] for i in range(10) ] return BlockBtcMessage(magic, version, prev_block, merkle_root, timestamp, bits, nonce, txns)
def btc_transactions(self): return [TxBtcMessage(self.MAGIC, self.VERSION, [], [], i) for i in range(10)]