async def announce_unconfirmed_block(self, block_pickled) -> None:
        unconfirmed_block = util.block_loads(block_pickled)

        logging.debug(f"#block \n"
                      f"peer_id({unconfirmed_block.header.peer_id.hex()})\n"
                      f"height({unconfirmed_block.header.height})\n"
                      f"hash({unconfirmed_block.header.hash.hex()})")

        self._channel_service.block_manager.add_unconfirmed_block(
            unconfirmed_block)
        self._channel_service.state_machine.vote()

        is_vote_block = not conf.ALLOW_MAKE_EMPTY_BLOCK and len(
            unconfirmed_block.body.transactions) == 0
        if is_vote_block:
            util.logger.spam(
                f"channel_inner_service:AnnounceUnconfirmedBlock try self.peer_service.reset_leader"
                f"\nnext_leader_peer({unconfirmed_block.header.next_leader.hex()}, "
                f"channel({ChannelProperty().name}))")

            if self._channel_service.peer_manager.get_leader_id(
                    conf.ALL_GROUP_ID
            ) != unconfirmed_block.header.next_leader.hex_hx():
                await self._channel_service.reset_leader(
                    unconfirmed_block.header.next_leader.hex_hx())
    async def announce_unconfirmed_block(self, block_pickled) -> None:
        unconfirmed_block = util.block_loads(block_pickled)

        logging.debug(
            f"#block \n"
            f"peer_id({unconfirmed_block.peer_id})\n"
            f"height({unconfirmed_block.height})\n"
            f"hash({unconfirmed_block.block_hash})\n"
            f"made_block_count({unconfirmed_block.made_block_count})\n"
            f"block_type({unconfirmed_block.block_type})\n"
            f"is_divided_block({unconfirmed_block.is_divided_block})\n")

        loop = asyncio.get_event_loop()
        await loop.run_in_executor(
            self._thread_pool,
            self._channel_service.block_manager.add_unconfirmed_block,
            unconfirmed_block)

        if unconfirmed_block.made_block_count >= conf.LEADER_BLOCK_CREATION_LIMIT \
                and unconfirmed_block.block_type is BlockType.vote \
                and unconfirmed_block.is_divided_block is False:
            util.logger.spam(
                f"channel_inner_service:AnnounceUnconfirmedBlock try self.peer_service.reset_leader"
                f"\nnext_leader_peer({unconfirmed_block.next_leader_peer}, "
                f"channel({ChannelProperty().name}))")

            # (hotfix-81) 자기가 다음 리더 일때만 AnnounceUnconfirmedBlock 메시지에서 reset leader 를 호출한다.
            if ChannelProperty().peer_id == unconfirmed_block.next_leader_peer:
                await self._channel_service.reset_leader(
                    unconfirmed_block.next_leader_peer)
Beispiel #3
0
    def __block_request(self, peer_stub, block_height):
        """request block by gRPC or REST

        :param peer_stub:
        :param block_height:
        :return block, max_block_height, response_code
        """
        if ObjectManager().channel_service.is_support_node_function(
                conf.NodeFunction.Vote):
            response = peer_stub.BlockSync(
                loopchain_pb2.BlockSyncRequest(block_height=block_height,
                                               channel=self.__channel_name),
                conf.GRPC_TIMEOUT)
            return util.block_loads(
                response.block
            ), response.max_block_height, response.response_code
        else:
            # request REST(json-rpc) way to radiostation (mother peer)
            return self.__block_request_by_citizen(
                block_height,
                ObjectManager().channel_service.radio_station_stub)