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])
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