def initiate_arbitration(request):
    user_id = request.POST.get('user_id')
    transaction_id = int(request.POST.get('transaction_id'))
    arbitration_reason = request.POST.get('arbitration_reason')

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(
        contract_address, contract_abi, "initiate_arbitration",
        [user_id, transaction_id, arbitration_reason])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        0: 0,  # success 
        -1: -1,  # user state error
        -2: -2,  # no such transaction
        -3: -3,  # unable to change state
        -4: -4,  # arbitration timeout
        -5: -5,  # unknown error
    }
    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
Beispiel #2
0
def print_output_and_input(logs, output, txinput, contract_name, contract_path):
    """
    parse_output_from_abi
    """
    abi_path = os.path.join(contract_path, contract_name + ".abi")
    if os.path.isfile(abi_path) is False:
        raise BcosException("parse outpt failed for {} doesn't exist"
                            .format(abi_path))
    try:
        dataParser = DatatypeParser(abi_path)
        # parse txinput
        input_result = dataParser.parse_transaction_input(txinput)
        if input_result is not None:
            print_info("txinput result", input_result)
            # get function name
            fn_name = input_result["name"]
            output_result = dataParser.parse_receipt_output(fn_name, output)
            if output_result is None:
                print_info("INFO", "empty return, output: {}".format(output))
                return
            print_info("output result", output_result)
        log_result = dataParser.parse_event_logs(logs)
        print_receipt_logs(log_result)
        # print_info("log result", log_result)

    except Exception as e:
        raise BcosException("parse output failed for reason: {}".format(e))
def down_commodity(request):
    user_id = request.POST.get('user_id')
    commodity_id = int(request.POST.get('commodity_id'))

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(contract_address,
                                                  contract_abi,
                                                  "putdown_commodity",
                                                  [user_id, commodity_id])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        1: 0,  # success 
        -1: -1,  # user state error
        -2: -2,  # unknown error
    }
    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
def buy_commodity(request):
    user_id = request.POST.get('user_id')
    commodity_id = int(request.POST.get('commodity_id'))
    transaction_desc = request.POST.get('transaction_desc', "")

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(
        contract_address, contract_abi, "buy_commodity",
        [user_id, commodity_id, transaction_desc])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        0: 0,  # success 
        -1: -1,  # user state error
        -2: -2,  # commodity state error
        -3: -3,  # no enough money
        -4: -4,  # unable to change owner of commodity
        -5: -5,  # ubable to generate transaction
    }
    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
Beispiel #5
0
def fisco_add_data_demo():
    try:
        client = BcosClient()
        print(client.getinfo())

        abi_file = os.path.join(settings.SITE_ROOT, "contracts",
                                "HelloWorld.abi")
        data_parser = DatatypeParser()
        data_parser.load_abi_file(abi_file)
        contract_abi = data_parser.contract_abi

        # 发送交易,调用一个改写数据的接口
        print(
            "\n>>sendRawTransaction:----------------------------------------------------"
        )
        to_address = '0x548fd1e8af9ca9131c04ab7e1031579f6498ddaf'  # use new deploy address
        args = ["xy1211ddd"]

        receipt = client.sendRawTransactionGetReceipt(to_address, contract_abi,
                                                      "set", args)
        print("receipt:", receipt)

        # 解析receipt里的log
        print(
            "\n>>parse receipt and transaction:--------------------------------------"
        )
        tx_hash = receipt['transactionHash']
        print("transaction hash: ", tx_hash)
        log_result = data_parser.parse_event_logs(receipt["logs"])
        i = 0
        for log in log_result:
            if 'eventname' in log:
                i = i + 1
                print("{}): log name: {} , data: {}".format(
                    i, log['eventname'], log['eventdata']))
        # 获取对应的交易数据,解析出调用方法名和参数

        tx_response = client.getTransactionByHash(tx_hash)
        input_result = data_parser.parse_transaction_input(
            tx_response['input'])
        print("transaction input parse:", tx_hash)
        print(input_result)

        # 解析该交易在receipt里输出的output,即交易调用的方法的return值
        output_result = data_parser.parse_receipt_output(
            input_result['name'], receipt['output'])
        print("receipt output :", output_result)

        # 调用一下call,获取数据
        print(
            "\n>>Call:------------------------------------------------------------------------"
        )
        res = client.call(to_address, contract_abi, "get")
        print("call get result:", res)

        # 关闭连接
        client.finish()

    except:
        pass
def deal_arbitration(request):
    transaction_id = int(request.POST.get('transaction_id'))
    arbitration_valid = int(request.POST.get('arbitration_valid'))

    contract_name = "Admin"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(
        contract_address, contract_abi, "deal_arbitration",
        [transaction_id, arbitration_valid])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        0: 0,  # success
        -1: -1,  # no such transaction
        -2: -2,  # unable to undo transaction
        -3: -3,  # unable to change transaction state
        -4: -4,  # unable to change commodity state
        -5: 0,  # success
    }
    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
Beispiel #7
0
def print_receipt_logs_and_txoutput(client,
                                    receipt,
                                    contractname,
                                    parser=None):
    print("\nINFO >>  receipt logs : ")
    # 解析receipt里的log
    if parser is None and len(contractname) > 0:
        parser = DatatypeParser(default_abi_file(contractname))
    logresult = parser.parse_event_logs(receipt["logs"])
    # modified by Bodhi Wang
    # 2019.11.26
    """
    i = 0
    for log in logresult:
        if 'eventname' in log:
            i = i + 1
            print("{}): log name: {} , data: {}".format(i, log['eventname'], log['eventdata']))
    """
    for i, log in enumerate(
        [result for result in logresult if 'eventname' in result]):
        print("{}): log name: {} , data: {}".format(i, log['eventname'],
                                                    log['eventdata']))

    txhash = receipt["transactionHash"]
    txresponse = client.getTransactionByHash(txhash)
    inputdetail = print_parse_transaction(txresponse, "", parser)
    # 解析该交易在receipt里输出的output,即交易调用的方法的return值
    outputresult = parser.parse_receipt_output(inputdetail['name'],
                                               receipt['output'])
    print("receipt output :", outputresult)
Beispiel #8
0
class Client:
    def __init__(self,contract_name, contract_address):

        abi_file = os.path.join(settings.SITE_ROOT, "contracts", contract_name + ".abi")
        self.data_parser = DatatypeParser()
        self.data_parser.load_abi_file(abi_file)
        self.contract_abi = self.data_parser.contract_abi
        self.contract_address = contract_address
    def fisco_add_data(self, func_name, args):
        client = BcosClient()
        try:
            print('start')
            # 发送交易
            receipt = client.sendRawTransactionGetReceipt(self.contract_address, self.contract_abi, func_name, args)
            print("receipt:", receipt)
            # 解析receipt里的log
            print("parse receipt and transaction:--------------------------------------")
            tx_hash = receipt['transactionHash']
            print("transaction hash: ", tx_hash)
            log_result = self.data_parser.parse_event_logs(receipt["logs"])
            i = 0
            for log in log_result:
                if func_name in log:
                    i = i + 1
                    print("{}): log name: {} , data: {}".format(i, log[func_name], log['eventdata']))
            # 获取对应的交易数据,解析出调用方法名和参数
            tx_response = client.getTransactionByHash(tx_hash)
            input_result = self.data_parser.parse_transaction_input(tx_response['input'])
            print("transaction input parse:", tx_hash)
            print(input_result)
            # 解析该交易在receipt里输出的output,即交易调用的方法的return值
            output_result = self.data_parser.parse_receipt_output(input_result['name'], receipt['output'])
            print("receipt output :", output_result)
            return output_result,tx_hash
        except:
            pass
        finally:
            # 关闭连接
            client.finish()


    def fisco_select_data(self, func_name, args):
        client = BcosClient()
        try:
            print('start')
            res = client.call(self.contract_address, self.contract_abi, func_name, args)
            print("call get result:", res)
            # 关闭连接
            client.finish()
            return res
        except:
            return None
def print_receipt_logs_and_txoutput(client,
                                    receipt,
                                    contractname,
                                    parser=None):
    if parser is None and len(contractname) > 0:
        parser = DatatypeParser(default_abi_file(contractname))
    logresult = parser.parse_event_logs(receipt["logs"])
    txhash = receipt["transactionHash"]
    txresponse = client.getTransactionByHash(txhash)
    inputdetail = print_parse_transaction(txresponse, "", parser)
    # 解析该交易在receipt里输出的output,即交易调用的方法的return值
    outputresult = parser.parse_receipt_output(inputdetail['name'],
                                               receipt['output'])
    return outputresult
def create_user(request):
    user_id = request.POST.get('user_id')
    user_password = request.POST.get('user_password')
    balance = int(request.POST.get('balance'))
    info = request.POST.get('info')

    contract_name = "Admin"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(
        contract_address, contract_abi, "create_user",
        [user_id, user_password, balance, info])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        0: 0,  # success 
        -1: -1,  # user already exists
        -2: -2,  # unknown error
    }
    ret_code = code_map[res[0]]

    if ret_code == 0:  # success create user
        contract_name = "Admin"
        contract_address = ContractNote.get_last(contract_name)

        abi_file = f"contracts/{contract_name}.abi"
        data_parser = DatatypeParser()
        data_parser.load_abi_file(abi_file)
        contract_abi = data_parser.contract_abi

        client = BcosClient()
        receipt = client.sendRawTransactionGetReceipt(contract_address,
                                                      contract_abi, "login",
                                                      [user_id, user_password])
        client.finish()

    return JsonResponse({"code": ret_code})
def create_commodity(request):
    user_id = request.POST.get('user_id')
    commodity_name = request.POST.get('commodity_name')
    commodity_desc = request.POST.get('commodity_desc')
    commodity_image = request.FILES.get('commodity_image')

    static_dir = settings.STATICFILES_DIRS[0]
    image_id = get_random_id(length=18)
    ext = os.path.splitext(commodity_image.name)[-1]
    image_name = image_id + ext
    image_save_path = os.path.join(static_dir, image_name)
    with open(image_save_path, 'wb') as f:
        for content in commodity_image.chunks():
            f.write(content)
    scale_image_too_big(image_save_path)
    commodity_image = "/static/" + image_name

    contract_name = "User"
    contract_address = ContractNote.get_last(contract_name)

    abi_file = f"contracts/{contract_name}.abi"
    data_parser = DatatypeParser()
    data_parser.load_abi_file(abi_file)
    contract_abi = data_parser.contract_abi

    client = BcosClient()
    receipt = client.sendRawTransactionGetReceipt(
        contract_address, contract_abi, "create_commodity",
        [user_id, commodity_name, commodity_image, commodity_desc])
    txhash = receipt['transactionHash']
    txresponse = client.getTransactionByHash(txhash)
    inputresult = data_parser.parse_transaction_input(txresponse['input'])
    res = data_parser.parse_receipt_output(inputresult['name'],
                                           receipt['output'])
    client.finish()

    code_map = {
        1: 0,  # success 
        -1: -1,  # user state error
        -2: -2,  # unknown error
    }

    ret_code = code_map[res[0]]

    return JsonResponse({"code": ret_code})
def print_receipt_logs_and_txoutput(client,
                                    receipt,
                                    contractname,
                                    parser=None):
    print("INFO >>  receipt logs : ")
    # 解析receipt里的log
    if parser is None and len(contractname) > 0:
        parser = DatatypeParser(default_abi_file(contractname))
    logresult = parser.parse_event_logs(receipt["logs"])
    i = 0
    # print(json.dumps(logresult,indent=4))
    for log in logresult:
        if "eventname" in log:
            i = i + 1
            print("{}): log name: {} , data: {} , topic: {}".format(
                i, log["eventname"], log["eventdata"], log["topic"]))
    inputdetail = print_parse_transaction(receipt, "", parser)
    # 解析该交易在receipt里输出的output,即交易调用的方法的return值
    outputresults = parser.parse_receipt_output(inputdetail["name"],
                                                receipt["output"])
    common.print_tx_result(outputresults)
print("transaction hash: " ,txhash)
logresult = data_parser.parse_event_logs(receipt["logs"])
i = 0
for log in logresult:
    if 'eventname' in log:
        i = i + 1
        print("{}): log name: {} , data: {}".format(i,log['eventname'],log['eventdata']))
#获取对应的交易数据,解析出调用方法名和参数

txresponse = client.getTransactionByHash(txhash)
inputresult = data_parser.parse_transaction_input(txresponse['input'])
print("transaction input parse:",txhash)
print(inputresult)

#解析该交易在receipt里输出的output,即交易调用的方法的return值
outputresult  = data_parser.parse_receipt_output(inputresult['name'], receipt['output'])
print("receipt output :",outputresult)


#调用一下call,获取数据
print("\n>>Call:------------------------------------------------------------------------")
res = client.call(to_address,contract_abi,"getbalance")
print("call getbalance result:",res)
res = client.call(to_address,contract_abi,"getbalance1",[100])
print("call getbalance1 result:",res)
res = client.call(to_address,contract_abi,"getname")
print("call getname:",res)
res = client.call(to_address,contract_abi,"getall")
print("call getall result:",res)
print("demo_tx,total req {}".format(client.request_counter))
client.finish()
'''
from client.datatype_parser import DatatypeParser

import json

if (True):
    parser = DatatypeParser()
    parser.load_abi_file("sample/SimpleInfo.abi")
    parser.parse_abi()

    with open("sample/receipt.json", "r") as f:
        receipt = json.load(f)
        f.close()
    logs = receipt["logs"]
    parser.parse_event_logs(logs)
    print("parse result")
    for log in logs:
        print(log)
    result = parser.parse_receipt_output("set", receipt['output'])
    print("output :", result)

if True:
    parser = DatatypeParser()
    parser.load_abi_file("sample/SimpleInfo.abi")
    parser.parse_abi()
    with open("sample/tx_simpleinfo_set.json", "r") as f:
        tx = json.load(f)
        f.close()
    result = parser.parse_transaction_input(tx["input"])
    print(result)
Beispiel #15
0
class TransactionCommon(bcosclient.BcosClient):
    """
    define common functions
    """
    def __init__(self, contract_addr, contract_path, contract_name):
        """
        init client to send transactions
        """
        bcosclient.BcosClient.__init__(self)
        self.contract_addr = contract_addr
        self.contract_path = contract_path
        (fname, extname) = os.path.splitext(contract_name)
        if extname.endswith("wasm"):
            # deal with wasm , not compile in this version, todo list
            self.contract_abi_path = contract_path + "/" + fname + ".abi"
            self.contract_bin_path = contract_path + "/" + contract_name
            self.sol_path = contract_path + "/" + contract_name
        else:
            # deal with sol files ,may be force re compile sol file ,so set the sol filename
            self.contract_abi_path = contract_path + "/" + contract_name + ".abi"
            self.contract_bin_path = contract_path + "/" + contract_name + ".bin"
            self.sol_path = contract_path + "/" + contract_name + ".sol"
            if os.path.exists(self.sol_path) is False:
                raise BcosException(("contract {} not exists,"
                                     " please put {}.sol into {}").format(
                                         contract_name, contract_name,
                                         contract_path))
        print("contract_abi_path {}, contract_bin_path {}".format(
            self.contract_abi_path, self.contract_bin_path))
        self.dataparser = None
        if os.path.exists(self.contract_bin_path):
            self.dataparser = DatatypeParser(self.contract_abi_path)

    def __del__(self):
        super().finish()

    def set_contract_addr(self, contractAddress):
        self.contract_addr = contractAddress

    def gen_contract_abi(self, needCover=False):
        """
        get contract abi according to contract_abi_path
        """
        if needCover is False and os.path.exists(
                self.contract_abi_path) is True:
            return
        # backup the abi and bin
        else:
            force_write = common.backup_file(self.contract_abi_path)
            if force_write is False:
                return
            force_write = common.backup_file(self.contract_bin_path)
            if force_write is False:
                return
        Compiler.compile_file(self.sol_path, self.contract_path)

    def send_transaction_getReceipt(self,
                                    fn_name,
                                    fn_args,
                                    gasPrice=30000000,
                                    isdeploy=False,
                                    from_account_signer=None):
        """
        send transactions to CNS contract with the givn function name and args
        """
        try:
            contract_abi, args = self.format_abi_args(fn_name, fn_args,
                                                      isdeploy)
            contract_bin = None
            if isdeploy is True and os.path.exists(
                    self.contract_bin_path) is True:
                with open(self.contract_bin_path, "rb") as f:
                    contract_bin = f.read()
                    f.close()
                    # print(contract_bin)
                    if self.contract_bin_path.endswith("wasm"):
                        contract_bin = encode_hex(contract_bin)
                    else:
                        contract_bin = bytes.decode(contract_bin, "utf-8")

                if contract_bin is not None and len(contract_bin) > 0x40000:
                    raise BcosException(
                        ("contract bin size overflow,"
                         " limit: 0x40000(256K), size: {})").format(
                             len(contract_bin), 16))

            receipt = super().sendRawTransactionGetReceipt(
                self.contract_addr,
                contract_abi,
                fn_name,
                args,
                contract_bin,
                gasPrice,
                from_account_signer=from_account_signer)
            # check status
            if "status" not in receipt.keys() or \
                    "output" not in receipt.keys():
                raise BcosError(-1, None,
                                ("send transaction failed"
                                 "for empty status and output,"
                                 "transaction receipt:{}").format(receipt))
            status = receipt["status"]
            status_code = int(status, 16)
            error_message = transaction_status_code.TransactionStatusCode.get_error_message(
                status_code)
            if error_message is not None:
                raise BcosException(
                    "call error, error message: {}".format(error_message))

            if receipt["output"] is None:
                raise TransactionException(receipt,
                                           ("send transaction failed,"
                                            "status: {}, gasUsed: {}").format(
                                                status, receipt["gasUsed"]))
            if fn_name is not None and fn_args is not None and self.dataparser is not None:
                output = self.dataparser.parse_receipt_output(
                    fn_name, receipt["output"])
            else:
                output = None
            return (receipt, output)
        except BcosError as e:
            self.logger.error(
                "send transaction failed, fn_name: {}, fn_args:{}, error_info:{}"
                .format(fn_name, fn_args, e))
            raise e
        except CompileError as e:
            self.logger.error(
                ("send transaction failed for compile soldity failed,"
                 "contract_path {}, error_info:{}").format(self.sol_path, e))
            raise e

    def format_abi_args(self, fn_name: str, fn_args, needCover=False):
        """
        format args
        """
        if not self.contract_bin_path.endswith(".wasm"):
            self.gen_contract_abi(needCover)
        data_parser = DatatypeParser(self.contract_abi_path)
        contract_abi = data_parser.contract_abi
        self.dataparser = data_parser
        args = None
        if fn_args is None:
            return (contract_abi, fn_args)
        if fn_name in data_parser.func_abi_map_by_name.keys() is None:
            raise BcosException(
                "invalid function: {}, the right function list:".format(
                    fn_name, ''.join(data_parser.func_abi_map_by_name.keys())))
        if fn_name is not None:
            fn_abi = data_parser.func_abi_map_by_name[fn_name]
            inputabi = data_parser.get_function_inputs_abi(fn_name)
            #inputabi = data_parser.get_function_abi(fn_name)

            args = format_args_by_function_abi(fn_args, inputabi)
            #print("args after format:",args)
        # the constructor with params
        elif fn_args is not None and contract_abi is not None:
            abidata = get_constructor_abi(contract_abi)
            if abidata is not None:
                inputabi = abidata["inputs"]
                args = format_args_by_function_abi(fn_args, inputabi)
        return (contract_abi, args)

    def call_and_decode(self, fn_name, fn_args=None):
        """
        call and get the output
        """
        contract_abi, args = self.format_abi_args(fn_name, fn_args, False)
        result = super().call(self.contract_addr, contract_abi, fn_name, args)
        return result
Beispiel #16
0
def fisco_add_data_demo1():
    try:
        client = BcosClient()
        print(client.getinfo())
        print(client.client_account)
        abi_file = os.path.join(settings.SITE_ROOT, "contracts",
                                "UserTempInfo.abi")
        data_parser = DatatypeParser()
        data_parser.load_abi_file(abi_file)
        contract_abi = data_parser.contract_abi

        # 发送交易,调用一个改写数据的接口
        # print("\n>>sendRawTransaction:----------------------------------------------------")
        to_address = '0x2b042831e72894e292507629bec3ae4886f6fe06'  # use new deploy address
        args = ['99999', '武汉', '38.9度', 20000]

        receipt = client.sendRawTransactionGetReceipt(to_address, contract_abi,
                                                      "insert", args)
        print("receipt:", receipt)

        # # 调用一下call,获取数据
        # args = ['99']
        # print("\n>>Call:------------------------------------------------------------------------")
        # res = client.call(to_address, contract_abi, "select", args)
        # print("call get result:", res)

        # 解析receipt里的log
        print(
            "\n>>parse receipt and transaction:--------------------------------------"
        )
        tx_hash = receipt['transactionHash']
        print("transaction hash: ", tx_hash)
        log_result = data_parser.parse_event_logs(receipt["logs"])
        i = 0
        for log in log_result:
            if 'eventname' in log:
                i = i + 1
                print("{}): log name: {} , data: {}".format(
                    i, log['eventname'], log['eventdata']))
        # 获取对应的交易数据,解析出调用方法名和参数

        tx_response = client.getTransactionByHash(tx_hash)
        input_result = data_parser.parse_transaction_input(
            tx_response['input'])
        print("transaction input parse:", tx_hash)
        print(input_result)

        # 解析该交易在receipt里输出的output,即交易调用的方法的return值
        output_result = data_parser.parse_receipt_output(
            input_result['name'], receipt['output'])
        print("receipt output :", output_result)

        # 调用一下call,获取数据
        args = ['99999']
        print(
            "\n>>Call:------------------------------------------------------------------------"
        )
        res = client.call(to_address, contract_abi, "select", args)
        print("call get result:", res)

        print(
            "\n>>Call:------------------------------------------------------------------------"
        )
        res = client.call(to_address, contract_abi, "selectLatest", args)
        print("call get result:", res)

        # 关闭连接
        client.finish()

    except:
        pass