def find_invoke_result_by_tx_hash(self, tx_hash: Union[str, Hash32]): """find invoke result matching tx_hash and return result if not in blockchain return code delay :param tx_hash: tx_hash :return: {"code" : "code", "error_message" : "error_message if not fail this is not exist"} """ if isinstance(tx_hash, Hash32): tx_hash = tx_hash.hex() try: tx_info = self.find_tx_info(tx_hash) except KeyError as e: block_manager = ObjectManager().channel_service.block_manager if tx_hash in block_manager.get_tx_queue(): # this case is tx pending logging.debug( f"blockchain:find_invoke_result_by_tx_hash pending tx({tx_hash})" ) return {'code': ScoreResponse.NOT_INVOKED} else: logging.debug("blockchain::find invoke_result KeyError: " + str(e)) # This transaction is considered a failure. return {'code': ScoreResponse.NOT_EXIST} return tx_info['result']
def __add_tx_to_block_db(self, block, invoke_results): """block db 에 block_hash - block_object 를 저장할때, tx_hash - block_hash 를 저장한다. get tx by tx_hash 시 해당 block 을 효율적으로 찾기 위해서 :param block: """ # loop all tx in block logging.debug("try add all tx in block to block db, block hash: " + block.header.hash.hex()) block_manager = ObjectManager().channel_service.block_manager tx_queue = block_manager.get_tx_queue() # util.logger.spam(f"blockchain:__add_tx_to_block_db::tx_queue : {tx_queue}") # util.logger.spam( # f"blockchain:__add_tx_to_block_db::confirmed_transaction_list : {block.confirmed_transaction_list}") tx_hash_version = conf.CHANNEL_OPTION[ self.__channel_name]["tx_hash_version"] for index, tx in enumerate(block.body.transactions.values()): tx_hash = tx.hash.hex() invoke_result = invoke_results[tx_hash] tx_serializer = TransactionSerializer.new(tx.version, tx_hash_version) tx_info = { 'block_hash': block.header.hash.hex(), 'block_height': block.header.height, 'tx_index': hex(index), 'transaction': tx_serializer.to_raw_data(tx), 'result': invoke_result } self.__confirmed_block_db.Put( tx_hash.encode(encoding=conf.HASH_KEY_ENCODING), json.dumps(tx_info).encode(encoding=conf.PEER_DATA_ENCODING)) # try: # util.logger.spam( # f"blockchain:__add_tx_to_block_db::{tx_hash}'s status : {tx_queue.get_item_status(tx_hash)}") # except KeyError as e: # util.logger.spam(f"__add_tx_to_block_db :: {e}") tx_queue.pop(tx_hash, None) # util.logger.spam(f"pop tx from queue:{tx_hash}") if block.header.height > 0: self.__save_tx_by_address_strategy(tx) self.__save_invoke_result_block_height(block.header.height)