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