async def handle_new_minor_block_header_list_command(self, _op, cmd, _rpc_id): # TODO: allow multiple headers if needed if len(cmd.minor_block_header_list) != 1: self.close_with_error("minor block header list must have only one header") return for m_header in cmd.minor_block_header_list: if m_header.branch != self.shard_state.branch: self.close_with_error("incorrect branch") return if self.best_root_block_header_observed: # check root header is not decreasing if ( cmd.root_block_header.total_difficulty < self.best_root_block_header_observed.total_difficulty ): return self.close_with_error( "best observed root header total_difficulty is decreasing {} < {}".format( cmd.root_block_header.total_difficulty, self.best_root_block_header_observed.total_difficulty, ) ) if ( cmd.root_block_header.total_difficulty == self.best_root_block_header_observed.total_difficulty ): if cmd.root_block_header != self.best_root_block_header_observed: return self.close_with_error( "best observed root header changed with same total_difficulty {}".format( self.best_root_block_header_observed.total_difficulty ) ) # check minor header is not decreasing if m_header.height < self.best_minor_block_header_observed.height: return self.close_with_error( "best observed minor header is decreasing {} < {}".format( m_header.height, self.best_minor_block_header_observed.height, ) ) self.best_root_block_header_observed = cmd.root_block_header self.best_minor_block_header_observed = m_header # Do not download if the new header is not higher than the current tip if self.shard_state.header_tip.height >= m_header.height: return Logger.info_every_sec( "[{}] received new tip with height {}".format( m_header.branch.to_str(), m_header.height ), 5 ) self.shard.synchronizer.add_task(m_header, self)
def _log_status(block: Block): is_root = isinstance(block, RootBlock) shard = "R" if is_root else block.header.branch.get_shard_id() count = len(block.minor_block_header_list) if is_root else len(block.tx_list) elapsed = time.time() - block.header.create_time Logger.info_every_sec( "[{}] {} [{}] ({:.2f}) {}".format( shard, block.header.height, count, elapsed, block.header.get_hash().hex(), ), 60, )