Beispiel #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
 def parse_receipt_output(self, name, outputdata):
     if name not in self.func_abi_map_by_name:
         return None
     func_abi = self.func_abi_map_by_name[name]
     output_args = get_fn_abi_types_single(func_abi, "outputs")
     # print(output_args)
     result = decode_single(output_args, decode_hex(outputdata))
     return result
 def parse_transaction_input(self, inputdata):
     selector = inputdata[0:10]
     argsdata = inputdata[10:]
     # print(selector)
     # print(self.func_abi_map_by_selector.keys())
     if selector not in self.func_abi_map_by_selector:
         return None
     func_abi = self.func_abi_map_by_selector[selector]
     # print(func_abi)
     args_abi = get_fn_abi_types_single(func_abi, "inputs")
     args = decode_single(args_abi, decode_hex(argsdata))
     result = dict()
     result['name'] = func_abi["name"]
     result['args'] = args
     result['signature'] = abi_to_signature(func_abi)
     return result
Beispiel #4
0
    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)
        # 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")
            try:
                decoderesult = decode_single(fn_output_types,
                                             decode_hex(outputdata))
                return decoderesult
            except BaseException:
                return response
        return response
Beispiel #5
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
    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)