def __precommit_block_request(self, peer_stub, last_block_height): """request precommit block by gRPC :param peer_stub: :param block_height: :return block, max_block_height, response_code """ response = peer_stub.GetPrecommitBlock( loopchain_pb2.PrecommitBlockRequest( last_block_height=last_block_height, channel=self.__channel_name), conf.GRPC_TIMEOUT) if response.block == b"": return None, response.response_code, response.response_message else: try: precommit_block = self.__blockchain.block_loads(response.block) except Exception as e: traceback.print_exc() raise exception.BlockError( f"Received block is invalid: original exception={e}") # util.logger.spam( # f"GetPrecommitBlock:response::{response.response_code}/{response.response_message}/" # f"{precommit_block}/{precommit_block.confirmed_transaction_list}") return precommit_block, response.response_code, response.response_message
def __block_request_by_voter(self, block_height, peer_stub): response = peer_stub.BlockSync( loopchain_pb2.BlockSyncRequest(block_height=block_height, channel=self.__channel_name), conf.GRPC_TIMEOUT) if response.response_code == message_code.Response.fail_no_confirm_info: raise NoConfirmInfo( f"The peer has not confirm_info of the block by height({block_height})." ) else: try: block = self.blockchain.block_loads(response.block) except Exception as e: traceback.print_exc() raise exception.BlockError( f"Received block is invalid: original exception={e}") votes_dumped: bytes = response.confirm_info try: votes_serialized = json.loads(votes_dumped) version = self.blockchain.block_versioner.get_version( block_height) votes = Votes.get_block_votes_class(version).deserialize_votes( votes_serialized) except json.JSONDecodeError: votes = votes_dumped return block, response.max_block_height, response.unconfirmed_block_height, votes, response.response_code
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, confirm_info, 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) try: block = self.__blockchain.block_loads(response.block) except Exception as e: traceback.print_exc() raise exception.BlockError( f"Received block is invalid: original exception={e}") return block, response.max_block_height, response.unconfirmed_block_height,\ response.confirm_info, response.response_code else: # request REST(json-rpc) way to RS peer return self.__block_request_by_citizen( block_height, ObjectManager().channel_service.radio_station_stub)