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 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
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
# 发送 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)