コード例 #1
0
    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)
コード例 #2
0
 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,
     )