Example #1
0
 def call(self, to_address, contract_abi, fn_name, args=None):
     cmd = "call"
     if to_address != "":
         common.check_and_format_address(to_address)
     if self.client_account is None:
         self.load_default_account()
     functiondata = encode_transaction_data(fn_name, contract_abi, None,
                                            args)
     callmap = dict()
     callmap["data"] = functiondata
     callmap["from"] = self.client_account.address
     callmap["to"] = to_address
     callmap["value"] = 0
     # send transaction to the given group
     params = [client_config.groupid, callmap]
     # 发送
     response = self.common_request(cmd, params)
     if "output" in response.keys():
         outputdata = response["output"]
         # 取得方法的abi,签名,参数 和返回类型,进行call返回值的解析
         fn_abi, fn_selector, fn_arguments = get_function_info(
             fn_name,
             contract_abi,
             None,
             args,
             None,
         )
         # print("fn_selector",fn_selector)
         # print("fn_arguments",fn_arguments)
         fn_output_types = get_fn_abi_types_single(fn_abi, "outputs")
         # print("output types str:", fn_output_types)
         decoderesult = decode_single(fn_output_types,
                                      decode_hex(outputdata))
         return decoderesult
     return response
Example #2
0
 def call(self, to_address, contract_abi, fn_name, args=None):
     cmd = "call"
     if self.client_account == None:
         self.load_default_account()
     functiondata = encode_transaction_data(fn_name, contract_abi, None,
                                            args)
     callmap = dict()
     callmap["data"] = functiondata
     callmap["from"] = self.client_account.address
     callmap["to"] = to_address
     callmap["value"] = 0
     params = [1, callmap]
     # 发送
     response = self.common_request(cmd, params)
     outputdata = response["output"]
     #取得方法的abi,签名,参数 和返回类型,进行call返回值的解析
     fn_abi, fn_selector, fn_arguments = get_function_info(
         fn_name,
         contract_abi,
         None,
         args,
         None,
     )
     #print("fn_selector",fn_selector)
     #print("fn_arguments",fn_arguments)
     fn_output_types = get_fn_abi_types_single(fn_abi, "outputs")
     #print("output types str:", fn_output_types)
     decoderesult = decode_single(fn_output_types, decode_hex(outputdata))
     return decoderesult
    def call(self, to_address, contract_abi, fn_name, args=None):
        cmd = "call"
        if to_address != "":
            common.check_and_format_address(to_address)

        self.load_default_account()
        functiondata = encode_transaction_data(fn_name, contract_abi, None,
                                               args)
        callmap = dict()
        callmap["data"] = functiondata
        callmap["from"] = self.default_from_account_signer.get_keypair(
        ).address
        callmap["to"] = to_address
        callmap["value"] = 0

        # send transaction to the given group
        params = [client_config.groupid, callmap]
        # 发送
        response = self.common_request(cmd, params)
        #print("response : ",response)
        # check status
        if "status" in response.keys():
            status = int(response["status"], 16)
            error_message = transaction_status_code.TransactionStatusCode.get_error_message(
                status)
            if error_message is not None:
                raise BcosException(
                    "call error, error message: {}".format(error_message))
        if "output" in response.keys():
            outputdata = response["output"]
            # 取得方法的abi,签名,参数 和返回类型,进行call返回值的解析
            fn_abi, fn_selector, fn_arguments = get_function_info(
                fn_name,
                contract_abi,
                None,
                args,
                None,
            )
            # print("fn_selector",fn_selector)
            # print("fn_arguments",fn_arguments)
            #fn_output_types = get_fn_abi_types_single(fn_abi, "outputs")
            fn_output_types = get_abi_output_types(fn_abi)
            try:
                #decoderesult = decode_single(fn_output_types, decode_hex(outputdata))
                #print("fn_output_types",fn_output_types)
                decoderesult = decode_abi(fn_output_types,
                                          decode_hex(outputdata))
                return decoderesult
            except BaseException as e:
                return response
        return response
Example #4
0
def parse_output(output, fn_name, contract_abi, args):
    fn_abi, fn_selector, fn_arguments = fn_abi, fn_selector, fn_arguments = get_function_info(
        fn_name, contract_abi, None, args, None)
    fn_output_types = get_fn_abi_types_single(fn_abi, "outputs")
    decoderesult = decode_single(fn_output_types, decode_hex(output))
    return decoderesult
Example #5
0
    # 发送
    response = rpc.make_request("call", param)
    print(response)
    outputdata = response["result"]["output"]
    retabi = "(int256,uint256,address)"

    print("data:", outputdata)
    decoderesult = decode_single(retabi, decode_hex(outputdata))
    print(decoderesult)
    from utils.contracts import get_function_info
    from utils.abi import *

    fn_abi, fn_selector, fn_arguments = get_function_info(
        "select",
        contract_abi,
        None,
        ['string'],
        None,
    )
    print("fn_abi: ", fn_abi)
    print("fn_selector: ", fn_selector)
    print("fn_arguments: ", fn_arguments)
    outputs = fn_abi["outputs"]
    print("outputs:", outputs)
    fn_output_types = get_fn_abi_types_single(fn_abi, "outputs")
    print("output types str:", fn_output_types)
    decoderesult = decode_single(fn_output_types, decode_hex(outputdata))
    print(decoderesult)

    fn_output_types = get_fn_abi_types(fn_abi, "outputs")
    decoderesult = decode_abi(fn_output_types, decode_hex(outputdata))
    print("test from key")
    print("read from file: address", ac3.address)
    print("pubkey: ", ac3.publickey)
    print("privkey: ", encode_hex(ac3.key))
    # 实际上只需要用sign_transaction就可以获得rawTransaction的编码数据了,input :txmap,私钥
    signedTxResult = Account.sign_transaction(txmap, ac3.privateKey)
    print(signedTxResult)
    print(encode_hex(signedTxResult["rawTransaction"]))
    if False:
        #call encode
        fn_name = "get"
        contract_abi = parser.contract_abi
        args = []
        res = encode_transaction_data(fn_name, contract_abi, None, args)
        print("tx data:", res)
        outputdata = "08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000364572726f7220616464726573733a6635656338656232623962666333386161656335616430303438643936663463343134306437333600000000000000000000"
        fn_abi, fn_selector, fn_arguments = get_function_info(
            fn_name,
            contract_abi,
            None,
            args,
            None,
        )
        fn_output_types = get_fn_abi_types_single(fn_abi, "outputs")
        try:
            decoderesult = decode_single(fn_output_types,
                                         decode_hex(outputdata))
            print(decoderesult)
        except BaseException as e:
            print("passerror : ", e)