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
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
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)