Exemplo n.º 1
0
    async def test_bdn_performance_single_node(self):
        self.gateway_node.connection_pool.add(20,
                                              self.node_endpoint_1.ip_address,
                                              self.node_endpoint_1.port,
                                              self.blockchain_connection_1)
        gateway_bdn_performance_stats_service.set_node(self.gateway_node)
        gateway_bdn_performance_stats_service.log_block_from_bdn()
        gateway_bdn_performance_stats_service.log_block_from_bdn()
        gateway_bdn_performance_stats_service.log_block_from_blockchain_node(
            self.node_endpoint_1)
        gateway_bdn_performance_stats_service.log_tx_from_bdn()
        gateway_bdn_performance_stats_service.log_tx_from_blockchain_node(
            self.node_endpoint_1)
        gateway_bdn_performance_stats_service.log_tx_from_blockchain_node(
            self.node_endpoint_1)
        gateway_bdn_performance_stats_service.close_interval_data()

        result = await self.request(
            BxJsonRpcRequest("6", RpcRequestType.BDN_PERFORMANCE, None))
        self.assertEqual("6", result.id)
        self.assertIsNone(result.error)
        node_stats = result.result[str(self.node_endpoint_1)]
        self.assertEqual("66.67%", node_stats["blocks_from_bdn_percentage"])
        self.assertEqual("33.33%",
                         node_stats["transactions_from_bdn_percentage"])
        self.assertEqual(3, node_stats["total_blocks_seen"])
Exemplo n.º 2
0
    def process_msg_block(self,
                          msg: AbstractBlockMessage,
                          block_number: Optional[int] = None) -> None:
        block_hash = msg.block_hash()
        # if gateway is still syncing, skip this process
        if not self.node.should_process_block_hash(block_hash):
            return

        self.node.block_cleanup_service.on_new_block_received(
            block_hash, msg.prev_block_hash())
        block_stats.add_block_event_by_block_hash(
            block_hash,
            BlockStatEventType.BLOCK_RECEIVED_FROM_BLOCKCHAIN_NODE,
            network_num=self.connection.network_num,
            more_info="Protocol: {}, Network: {}".format(
                self.node.opts.blockchain_protocol,
                self.node.opts.blockchain_network, msg.extra_stats_data()))
        gateway_bdn_performance_stats_service.log_block_message_from_blockchain_node(
            self.connection.endpoint, True)
        if block_hash in self.node.blocks_seen.contents:
            self.node.on_block_seen_by_blockchain_node(
                block_hash, self.connection, msg, block_number=block_number)
            block_stats.add_block_event_by_block_hash(
                block_hash,
                BlockStatEventType.
                BLOCK_RECEIVED_FROM_BLOCKCHAIN_NODE_IGNORE_SEEN,
                network_num=self.connection.network_num)
            self.connection.log_info(
                "Discarding duplicate block {} from local blockchain node.",
                block_hash)
            self.node.log_blocks_network_content(self.node.network_num, msg)
            return

        if not self.is_valid_block_timestamp(msg):
            return

        gateway_bdn_performance_stats_service.log_block_from_blockchain_node(
            self.connection.endpoint)

        canceled_recovery = self.node.on_block_seen_by_blockchain_node(
            block_hash, self.connection, msg)
        if canceled_recovery:
            return

        self.node.track_block_from_node_handling_started(block_hash)
        self.node.on_block_seen_by_blockchain_node(block_hash,
                                                   self.connection,
                                                   msg,
                                                   block_number=block_number)
        self.node.block_processing_service.queue_block_for_processing(
            msg, self.connection)
        self.node.block_queuing_service_manager.push(
            block_hash, msg, node_received_from=self.connection)
        return
    def _process_ready_new_blocks(self):
        while self._ready_new_blocks:
            ready_block_hash = self._ready_new_blocks.pop()
            pending_new_block = self.pending_new_block_parts.contents[
                ready_block_hash]
            self.pending_new_block_parts.remove_item(ready_block_hash)

            if ready_block_hash in self.node.blocks_seen.contents:
                self.node.on_block_seen_by_blockchain_node(
                    ready_block_hash,
                    self.connection,
                    block_number=pending_new_block.block_number)
                self.connection.log_info(
                    "Discarding already seen block {} received in block bodies msg from local blockchain node.",
                    ready_block_hash)
                return

            last_known_total_difficulty = self.node.try_calculate_total_difficulty(
                ready_block_hash, pending_new_block)
            new_block_msg = InternalEthBlockInfo.from_new_block_parts(
                pending_new_block, last_known_total_difficulty)

            if self.is_valid_block_timestamp(new_block_msg):
                block_stats.add_block_event_by_block_hash(
                    ready_block_hash,
                    BlockStatEventType.BLOCK_RECEIVED_FROM_BLOCKCHAIN_NODE,
                    network_num=self.connection.network_num,
                    more_info="Protocol: {}, Network: {}. {}".format(
                        self.node.opts.blockchain_protocol,
                        self.node.opts.blockchain_network,
                        new_block_msg.extra_stats_data()),
                    block_height=new_block_msg.block_number(),
                )
                gateway_bdn_performance_stats_service.log_block_from_blockchain_node(
                    self.connection.endpoint)

                canceled_recovery = self.node.on_block_seen_by_blockchain_node(
                    ready_block_hash, self.connection, new_block_msg,
                    pending_new_block.block_number)
                if canceled_recovery:
                    return

                self.node.block_queuing_service_manager.push(
                    ready_block_hash,
                    new_block_msg,
                    node_received_from=self.connection)
                self.node.block_processing_service.queue_block_for_processing(
                    new_block_msg, self.connection)
Exemplo n.º 4
0
    async def test_bdn_performance(self):
        gateway_bdn_performance_stats_service.set_node(self.gateway_node)
        gateway_bdn_performance_stats_service.log_block_from_bdn()
        gateway_bdn_performance_stats_service.log_block_from_bdn()
        gateway_bdn_performance_stats_service.log_block_from_blockchain_node()
        gateway_bdn_performance_stats_service.log_tx_from_bdn()
        gateway_bdn_performance_stats_service.log_tx_from_blockchain_node()
        gateway_bdn_performance_stats_service.log_tx_from_blockchain_node()
        gateway_bdn_performance_stats_service.close_interval_data()

        result = await self.request(
            BxJsonRpcRequest("6", RpcRequestType.BDN_PERFORMANCE, None))
        self.assertEqual("6", result.id)
        self.assertIsNone(result.error)
        self.assertEqual("66.67%", result.result["blocks_from_bdn_percentage"])
        self.assertEqual("33.33%",
                         result.result["transactions_from_bdn_percentage"])
Exemplo n.º 5
0
    async def test_bdn_performance_multi_node(self):
        self.gateway_node.connection_pool.add(20,
                                              self.node_endpoint_1.ip_address,
                                              self.node_endpoint_1.port,
                                              self.blockchain_connection_1)

        blockchain_connection_2 = EthNodeConnection(
            MockSocketConnection(1,
                                 node=self.gateway_node,
                                 ip_address="127.0.0.1",
                                 port=333), self.gateway_node)
        blockchain_connection_2.on_connection_established()
        self.gateway_node.mock_add_blockchain_peer(blockchain_connection_2)
        node_endpoint_2 = IpEndpoint("127.0.0.1", 333)
        self.gateway_node.connection_pool.add(21, node_endpoint_2.ip_address,
                                              node_endpoint_2.port,
                                              blockchain_connection_2)

        gateway_bdn_performance_stats_service.set_node(self.gateway_node)
        gateway_bdn_performance_stats_service.log_block_from_bdn()
        gateway_bdn_performance_stats_service.log_block_from_bdn()
        gateway_bdn_performance_stats_service.log_block_from_blockchain_node(
            self.node_endpoint_1)
        gateway_bdn_performance_stats_service.log_tx_from_bdn()
        gateway_bdn_performance_stats_service.log_tx_from_blockchain_node(
            self.node_endpoint_1)
        gateway_bdn_performance_stats_service.log_tx_from_blockchain_node(
            self.node_endpoint_1)
        gateway_bdn_performance_stats_service.close_interval_data()

        result = await self.request(
            BxJsonRpcRequest("6", RpcRequestType.BDN_PERFORMANCE, None))
        self.assertEqual("6", result.id)
        self.assertIsNone(result.error)
        node_stats = result.result[str(self.node_endpoint_1)]
        self.assertEqual("66.67%", node_stats["blocks_from_bdn_percentage"])
        self.assertEqual("33.33%",
                         node_stats["transactions_from_bdn_percentage"])
        self.assertEqual(3, node_stats["total_blocks_seen"])

        node_stats_2 = result.result[str(node_endpoint_2)]
        self.assertEqual("100.00%", node_stats_2["blocks_from_bdn_percentage"])
        self.assertEqual("100.00%",
                         node_stats_2["transactions_from_bdn_percentage"])
        self.assertEqual(3, node_stats_2["total_blocks_seen"])
Exemplo n.º 6
0
    def msg_block(self, msg: AbstractBlockMessage):
        """
        Handle a block message. Sends to node for encryption, then broadcasts.
        """
        block_hash = msg.block_hash()
        node = self.connection.node
        # if gateway is still syncing, skip this process
        if not node.should_process_block_hash(block_hash):
            return

        node.block_cleanup_service.on_new_block_received(block_hash, msg.prev_block_hash())
        block_stats.add_block_event_by_block_hash(block_hash, BlockStatEventType.BLOCK_RECEIVED_FROM_BLOCKCHAIN_NODE,
                                                  network_num=self.connection.network_num,
                                                  more_info="Protocol: {}, Network: {}".format(
                                                      node.opts.blockchain_protocol,
                                                      node.opts.blockchain_network,
                                                      msg.extra_stats_data()
                                                  )
                                                  )
        if block_hash in self.connection.node.blocks_seen.contents:
            node.on_block_seen_by_blockchain_node(block_hash)
            block_stats.add_block_event_by_block_hash(block_hash,
                                                      BlockStatEventType.BLOCK_RECEIVED_FROM_BLOCKCHAIN_NODE_IGNORE_SEEN,
                                                      network_num=self.connection.network_num)
            self.connection.log_info(
                "Discarding duplicate block {} from local blockchain node.",
                block_hash
            )
            return

        if not self.is_valid_block_timestamp(msg):
            return

        node.track_block_from_node_handling_started(block_hash)
        node.on_block_seen_by_blockchain_node(block_hash, msg)
        node.block_processing_service.queue_block_for_processing(msg, self.connection)
        gateway_bdn_performance_stats_service.log_block_from_blockchain_node()
        node.block_queuing_service.store_block_data(block_hash, msg)
        return