async def async_getheaders(self, param): """ Async. Return 20 latest block headers. :param param: (string) empty: last 20 blocks headers. start_height,count or ,count (last N headers) :return: """ try: protocmd = commands_pb2.Command() protocmd.Clear() protocmd.command = commands_pb2.Command.getheaders if param is None or param == 'None': param = '' if param == '': blocks = await self.async_fetchall(SQL_BLOCKS_LAST, (config.BLOCK_SYNC_COUNT,)) else: start, count = param.split(',') if '' == start: blocks = await self.async_fetchall(SQL_BLOCKS_LAST, (count,)) else: blocks = await self.async_fetchall(SQL_BLOCKS_SYNC, (start, count)) for block in blocks: block = PosBlock().from_dict(dict(block)) block.add_to_proto(protocmd) return protocmd except Exception as e: self.app_log.error("SRV: async_getheaders: Error {}".format(e)) exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] self.app_log.error('detail {} {} {}'.format(exc_type, fname, exc_tb.tb_lineno)) raise
async def async_getblock(self, a_height): """ Command id 14 returns the block of the given height. :param a_height: int :return: protocmd with the block if exists or None """ try: protocmd = commands_pb2.Command() protocmd.Clear() protocmd.command = commands_pb2.Command.getblock block = await self.async_fetchone(SQL_HEIGHT_BLOCK, (a_height,), as_dict=True) if not block: return protocmd block = PosBlock().from_dict(dict(block)) # Add the block txs txs = await self.async_fetchall(SQL_TXS_FOR_HEIGHT, (block.height,)) for tx in txs: tx = PosMessage().from_dict(dict(tx)) block.txs.append(tx) block.add_to_proto(protocmd) return protocmd except Exception as e: self.app_log.error("SRV: async_getblock: Error {}".format(e)) exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] self.app_log.error('detail {} {} {}'.format(exc_type, fname, exc_tb.tb_lineno)) raise
async def async_roundblocks(self, a_round): """ Command id 13 returns all blocks of the given round. FR: Harmonize. this one needs a proto as output (proto command with list of blocks) :param a_round: :return: protocmd with all blocks """ try: protocmd = commands_pb2.Command() protocmd.Clear() protocmd.command = commands_pb2.Command.roundblocks blocks = await self.async_fetchall(SQL_ROUND_BLOCKS, (a_round, )) for block in blocks: block = PosBlock().from_dict(dict(block)) # Add the block txs txs = await self.async_fetchall(SQL_TXS_FOR_HEIGHT, (block.height, )) for tx in txs: tx = PosMessage().from_dict(dict(tx)) block.txs.append(tx) block.add_to_proto(protocmd) # check block integrity if len(txs) != block.msg_count: self.app_log.error( "Only {} tx for block {} instead of {} announced". format(len(txs), block.height, block.msg_count)) com_helpers.MY_NODE.stop() return protocmd except Exception as e: self.app_log.error("SRV: async_roundblocks: Error {}".format(e)) exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] self.app_log.error('detail {} {} {}'.format( exc_type, fname, exc_tb.tb_lineno)) raise
async def async_blocksync(self, height): """ returns N blocks starting with the given height. FR: Harmonize. this one needs a proto as output (proto command with list of blocks) :param height: :return: """ try: protocmd = commands_pb2.Command() protocmd.Clear() protocmd.command = commands_pb2.Command.blocksync blocks = await self.async_fetchall( SQL_BLOCKS_SYNC, (height, config.BLOCK_SYNC_COUNT)) for block in blocks: block = PosBlock().from_dict(dict(block)) # Add the block txs txs = await self.async_fetchall(SQL_TXS_FOR_HEIGHT, (block.height, )) for tx in txs: tx = PosMessage().from_dict(dict(tx)) block.txs.append(tx) # check block integrity if len(txs) != block.msg_count: self.app_log.error( "Only {} tx for block {} instead of {} announced". format(len(txs), height, block.msg_count)) com_helpers.MY_NODE.stop() block.add_to_proto(protocmd) #print(protocmd) return protocmd except Exception as e: self.app_log.error("SRV: async_blocksync: Error {}".format(e)) exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] self.app_log.error('detail {} {} {}'.format( exc_type, fname, exc_tb.tb_lineno)) raise