예제 #1
0
    def msg_new_block_hashes(self, msg: NewBlockHashesEthProtocolMessage):
        if not self.node.should_process_block_hash(msg.block_hash()):
            return

        block_hash_number_pairs = []
        for block_hash, block_number in msg.get_block_hash_number_pairs():
            block_stats.add_block_event_by_block_hash(
                block_hash,
                BlockStatEventType.BLOCK_ANNOUNCED_BY_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()),
                block_height=block_number,
            )
            gateway_bdn_performance_stats_service.log_block_message_from_blockchain_node(
                False)

            if block_hash in self.node.blocks_seen.contents:
                self.node.on_block_seen_by_blockchain_node(
                    block_hash, 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,
                    block_height=block_number,
                )
                self.connection.log_info(
                    "Ignoring duplicate block {} from local blockchain node.",
                    block_hash)
                continue

            recovery_cancelled = self.node.on_block_seen_by_blockchain_node(
                block_hash, block_number=block_number)
            if recovery_cancelled:
                continue

            self.node.track_block_from_node_handling_started(block_hash)
            block_hash_number_pairs.append((block_hash, block_number))

            self.connection.log_info(
                "Fetching block {} from local Ethereum node.", block_hash)

        if not block_hash_number_pairs:
            return

        for block_hash, block_number in block_hash_number_pairs:
            # pyre-fixme[6]: Expected `memoryview` for 1st param but got `None`.
            self.pending_new_block_parts.add(
                block_hash, NewBlockParts(None, None, block_number))
            self.connection.enqueue_msg(
                GetBlockHeadersEthProtocolMessage(None, block_hash.binary, 1,
                                                  0, False))

        self.request_block_body(
            [block_hash for block_hash, _ in block_hash_number_pairs])
예제 #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