def generate_signed_deploy_transaction(hex_avm_code: str, project_path: str = '', wallet_file_name: str = ''): wallet_dir_path = os.path.join(project_path, 'wallet') wallet_manager = read_wallet(wallet_dir_path, wallet_file_name) deploy_dir_path = os.path.join(project_path, 'contracts') deploy_information = handle_deploy_config(deploy_dir_path) need_storage = deploy_information.get('needStorage', True) name = deploy_information.get('name', os.path.split(project_path)[1]) version = deploy_information.get('version', '0.0.1') author = deploy_information.get('author', '') email = deploy_information.get('email', '') desc = deploy_information.get('desc', '') b58_payer_address = deploy_information.get( 'payer', wallet_manager.get_default_account().get_address()) gas_limit = deploy_information.get('gasLimit', 21000000) gas_price = deploy_information.get('gasPrice', 500) ontology = OntologySdk() tx = ontology.neo_vm().make_deploy_transaction(hex_avm_code, need_storage, name, version, author, email, desc, b58_payer_address, gas_limit, gas_price) password = getpass.getpass('\tPlease input payer account password: ') payer_acct = wallet_manager.get_account(b58_payer_address, password) ontology.sign_transaction(tx, payer_acct) return tx
def generate_signed_deploy_transaction(hex_avm_code: str, project_path: str = '', wallet_file_name: str = '', config: str = ''): wallet_file, deploy_information, password_information = handle_deploy_config( project_path, config) if wallet_file_name != '': wallet_manager = read_wallet(project_path, wallet_file_name) else: wallet_manager = read_wallet(project_path, wallet_file) need_storage = deploy_information.get('needStorage', True) name = deploy_information.get('name', os.path.split(project_path)[1]) version = deploy_information.get('version', '0.0.1') author = deploy_information.get('author', '') email = deploy_information.get('email', '') desc = deploy_information.get('desc', '') b58_payer_address = deploy_information.get('payer', '') if b58_payer_address == '': b58_payer_address = wallet_manager.get_default_account( ).get_address() if b58_payer_address == '': raise PunicaException( PunicaError.other_error('payer address should not be None')) gas_limit = deploy_information.get('gasLimit', 21000000) gas_price = deploy_information.get('gasPrice', 500) ontology = OntologySdk() tx = ontology.neo_vm().make_deploy_transaction(hex_avm_code, need_storage, name, version, author, email, desc, b58_payer_address, gas_limit, gas_price) password = password_information.get(b58_payer_address, '') if password == '': password = getpass.getpass( '\tPlease input payer account password: '******' not found')) ontology.sign_transaction(tx, payer_acct) return tx
def test_new_approve_transaction(self): rpc_address = 'http://polaris3.ont.io:20336' sdk = OntologySdk() sdk.rpc.set_address(rpc_address) private_key = '523c5fcf74823831756f0bcb3634234f10b3beb1c05595058534577752ad2d9f' sender = Account(private_key, SignatureScheme.SHA256withECDSA) b58_send_address = sender.get_address_base58() b58_payer_address = sender.get_address_base58() b58_recv_address = 'AazEvfQPcQ2GEFFPLF1ZLwQ7K5jDn81hve' amount = 5 gas_price = 500 gas_limit = 20000 tx = Asset.new_approve_transaction('ont', b58_send_address, b58_recv_address, amount, b58_payer_address, gas_limit, gas_price) tx = sdk.sign_transaction(tx, sender) tx_hash = sdk.rpc.send_raw_transaction(tx) self.assertEqual(64, len(tx_hash))
def main(argv): try: opts, args = getopt.getopt(argv, "hm:i:", ["migrate=", "invoke="]) except getopt.GetoptError: print('test.py [-m|--migrate] [-i|--invoke] ') sys.exit(2) m = {} for opt, arg in opts: if opt == '-h': print('test.py [-m|--migrate] [-i|--invoke] ') sys.exit() elif opt in ("-m", "--migrate"): m["func"] = "migrate" if "json" in str(arg): with open(arg, "r") as f: r = json.load( f, object_hook=lambda d: namedtuple('X', d.keys()) (*d.values())) m["rpc_address"] = r.rpc_address m["need_storage"] = r.need_storage m["name"] = r.name m["code_version"] = r.code_version m["author"] = r.author m["email"] = r.email m["desp"] = r.desp m["payer_address"] = r.payer_address m["payer_password"] = r.payer_password m["wallet_file_path"] = r.wallet_file_path m["gas_limit"] = r.gas_limit m["gas_price"] = r.gas_price m["save_file"] = r.save_file if ".avm" in r.code: with open(r.code, "r") as f2: m["code"] = f2.read() else: m["code"] = r.code m["contract_address"] = Address.address_from_vm_code( m["code"]).to_hex_str() else: temp = str(arg).split(",") for i in temp: t = str(i).split("=") m[t[0]] = t[1] elif opt in ("-i", "--invoke"): m["func"] = "invoke" if "json" in str(arg): with open(arg, "r") as f: r = json.load( f, object_hook=lambda d: namedtuple('X', d.keys()) (*d.values())) m["rpc_address"] = r.rpc_address m["acct_address"] = r.acct_address m["acct_password"] = r.acct_password m["payer_address"] = r.payer_address m["payer_password"] = r.payer_password m["wallet_file_path"] = r.wallet_file_path m["gas_limit"] = r.gas_limit m["gas_price"] = r.gas_price m["abi_path"] = r.abi_path m["save_file"] = r.save_file m["function"] = r.function else: temp = str(arg).split(",") for i in temp: t = str(i).split("=") m[t[0]] = t[1] else: print('test.py [-m|--migrate] [-i|--invoke] ') sys.exit() sdk = OntologySdk() sdk.set_rpc(m["rpc_address"]) if m["func"] is "migrate": need_storage = False if m["need_storage"] is 'true': need_storage = True tx = sdk.neo_vm().make_deploy_transaction( m["code"], need_storage, m["name"], m["code_version"], m["author"], m["email"], m["desp"], m["payer_address"], m["gas_limit"], m["gas_price"]) sdk.wallet_manager.open_wallet(m["wallet_file_path"]) acct = sdk.wallet_manager.get_account(m["payer_address"], m["payer_password"]) sdk.sign_transaction(tx, acct) sdk.set_rpc(m["rpc_address"]) try: print("deploying,please waiting ...") res = sdk.rpc.send_raw_transaction(tx) print("txhash:", res) for i in range(10): time.sleep(1) res = sdk.rpc.get_smart_contract(m["contract_address"]) if res == "": continue else: print("deploy success") break save_file(m, "success") except Exception as e: print(e) save_file(m, e) elif m["func"] is "invoke": func_map = {} t = 0 for i in list(m["function"]): func_list = [] func_list.append(i.function_name) func_list.append(i.pre_exec) for j in list(i.function_param): func_list.append(j) func_map["function" + str(t)] = func_list t = t + 1 with open(str(m["abi_path"]), "r") as f: abi = json.loads(f.read(), object_hook=lambda d: namedtuple('X', d.keys()) (*d.values())) abi_info = AbiInfo(abi.hash, abi.entrypoint, abi.functions, abi.events) contract_address = bytearray.fromhex(str(abi.hash)[2:]) m["contract_address"] = contract_address.hex() contract_address.reverse() sdk.wallet_manager.open_wallet(m["wallet_file_path"]) acct = sdk.wallet_manager.get_account(m["acct_address"], m["acct_password"]) payer = sdk.wallet_manager.get_account(m["payer_address"], m["payer_password"]) func_l = [] for func_info in func_map.values(): func = abi_info.get_function(func_info[0]) params = [] l = [] l.append(func_info[0]) l.append(func_info[1]) temp_l = "" for i in range(len(func_info)): if i == 0 or i == 1: continue temp_l += func_info[i] + ":" if func.parameters[i - 2].type == "String": params.append(str(func_info[i])) if func.parameters[i - 2].type == "ByteArray": params.append(bytearray(func_info[i].encode())) if func.parameters[i - 2].type == "Integer": params.append(func_info[i]) l.append(temp_l[:len(temp_l) - 1]) if len(params) == 1: func.set_params_value(params[0]) elif len(params) == 2: func.set_params_value(params[0], params[1]) elif len(params) == 3: func.set_params_value(params[0], params[1], params[2]) elif len(params) == 4: func.set_params_value(params[0], params[1], params[2], params[3]) elif len(params) == 5: func.set_params_value(params[0], params[1], params[2], params[3], params[4]) elif len(params) == 6: func.set_params_value(params[0], params[1], params[2], params[3], params[4], params[5]) elif len(params) == 7: func.set_params_value(params[0], params[1], params[2], params[3], params[4], params[5], params[6]) pre_exec = False if func_info[1] == "true": pre_exec = True try: print("") print("invoking, please waiting ...") print("method: " + func_info[0]) res = sdk.neo_vm().send_transaction( contract_address, acct, payer, m["gas_limit"], m["gas_price"], func, pre_exec) if not pre_exec: time.sleep(6) print("txhash:", res) print("Event:", sdk.rpc.get_smart_contract_event_by_tx_hash(res)) l.append(res) else: print(res) print("res:", (bytearray.fromhex(res)).decode('utf-8')) l.append((bytearray.fromhex(res)).decode('utf-8')) except Exception as e: print("Error:", e) l.append(e) func_l.append(l) save_file(m, "", func_l) else: print("only support migrate and invoke")
class DemoClient(object): """ """ def __init__(self, rpc_addr: str, wallet_file: str, is_maker: bool, pwd, avm_file, abi_file): self.sdk = OntologySdk() self.sdk.rpc.set_address(rpc_addr) self.sdk.open_wallet(wallet_file) self.is_maker = is_maker # 可以查询一个合约存不存在,存在就可以让maker是True,而不必自己指定了 self.__pwd = pwd self.__get_code_from_avm(avm_file) self.__get_abi_from_file(abi_file) @staticmethod def is_transaction_success(txid): if len(txid) != 64: return False return True def start_game(self, acc_index): if not self.is_maker: return acc = self.get_account_by_index(acc_index) txid = self.deploy_contract(need_storage=True, name="sixsixsix", code_ver="1.0", author="tomzou", email="*****@*****.**", desp="demo", acc=acc, gas_limit=20200000, gas_price=500) if not self.is_transaction_success(txid): raise Exception(txid) return txid def get_account_by_index(self, acc_index): wm = self.sdk.get_wallet_manager() return wm.get_account( wm.get_wallet().get_account_by_index(acc_index).get_address(), self.__pwd[acc_index]) def deploy_contract(self, need_storage, name, code_ver, author, email, desp, acc, gas_limit, gas_price): tx = self.sdk.neo_vm().make_deploy_transaction( self.code, need_storage=need_storage, name=name, code_version=code_ver, author=author, email=email, desp=desp, payer=acc.get_address_base58(), gas_limit=gas_limit, gas_price=gas_price) self.sdk.sign_transaction(tx, acc) return self.sdk.get_rpc().send_raw_transaction(tx) def __get_code_from_avm(self, avm_file): f = open(avm_file) self.code = f.readline() code_addr_obj = Address.address_from_vm_code(self.code) self.code_addr = code_addr_obj.to_reverse_hex_str() self.contract_acc = code_addr_obj.to_base58() self.contract_addr = code_addr_obj.to_byte_array() f.close() def __get_abi_from_file(self, abi_file): f = open(abi_file) abi_str = f.readline() abi = json.loads(abi_str, object_hook=lambda d: namedtuple('X', d.keys()) (*d.values())) self.abi_info = AbiInfo("0x" + self.code_addr, "main", abi.functions, []) def luck_roll(self, amount, acc_index): """ 玩家通过本方法参与游戏 :param amount: :param acc_index: :return: """ self.join_game(amount, acc_index) if self.bet(amount, acc_index) is True: print('I win, you bitch') else: print('Go back and work, FOOL') def join_game(self, amount, acc_index): acc = self.get_account_by_index(acc_index) # 调用相应的函数,需写完合约再回头搞 func_join = self.abi_info.get_function("join") func_join.set_params_value(acc.get_address_base58(), amount) func_read_res = self.abi_info.get_function("is_game_ready") txid = self.sdk.neo_vm().send_transaction(self.contract_addr, acc, acc, 2000000, 500, func_join, False) print(txid) if not self.is_transaction_success(txid): raise Exception(txid) before = time.time() tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash(txid) while tx_info == 'unknown transaction' or tx_info is None: tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash( txid) print('cost %f seconds to confirm tx' % (time.time() - before)) try: notify_info = tx_info['Notify'][0]['States'] except Exception: raise Exception(tx_info) print(notify_info) if notify_info == '4e6f206d6f72652073656174': raise Exception("No more seat") elif notify_info == '6a6f696e207375636365737366756c6c79': # 等待游戏结束,不停滴向合约pull结果 while True: time.sleep(1) res = self.sdk.neo_vm().send_transaction( self.contract_addr, acc, acc, 2000000, 500, func_read_res, True) if res is True: print(res) break def bet(self, amount, acc_index): """ 人都坐好了,开赌! 掷出骰子并等待结果,返回输赢 :param amount: 需与join相同 :param acc_index: 使用钱包中第几个账户,需和join方法统一 :return: True代表胜利,False代表输了。。 """ acc = self.get_account_by_index(acc_index) tx = self.sdk.native_vm().asset().new_transfer_transaction( 'ont', acc.get_address_base58(), self.contract_acc, amount, acc.get_address_base58(), 2000000, 500) self.sdk.sign_transaction(tx, acc) txid = self.sdk.get_rpc().send_raw_transaction(tx) if not self.is_transaction_success(txid): raise Exception('Some thing wrong with tx:%s' % txid) func_get_amounts = self.abi_info.get_function('get_amounts') sum_amounts = self.sdk.neo_vm().send_transaction( self.contract_addr, acc, acc, 2000000, 500, func_get_amounts, True) contract_balance = self.sdk.get_rpc().get_balance(self.contract_acc) while sum_amounts > contract_balance: contract_balance = self.sdk.get_rpc().get_balance( self.contract_acc) time.sleep(0.5) # 直接开始游戏,获取随机数 func_roll_dice = self.abi_info.get_function('roll_dice') func_roll_dice.set_params_value(acc.get_address_base58()) txid = self.sdk.neo_vm().send_transaction(self.contract_addr, acc, acc, 2000000, 500, func_roll_dice, False) if not self.is_transaction_success(txid): raise Exception('Some thing wrong with tx:%s' % txid) before = time.time() tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash(txid) while tx_info == 'unknown transaction' or tx_info is None: tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash( txid) print('cost %f seconds to confirm tx' % (time.time() - before)) try: notify_info = tx_info['Notify'][0]['States'] except Exception: raise Exception(tx_info) if type(notify_info) is int: print('your game is done and your dice number is %d' % notify_info) else: raise Exception(bytes.fromhex(notify_info).decode()) func_get_res = self.abi_info.get_function('get_res') res = self.sdk.neo_vm().send_transaction(self.contract_addr, acc, acc, 2000000, 500, func_get_res, True) while res is False: res = self.sdk.neo_vm().send_transaction(self.contract_addr, acc, acc, 2000000, 500, func_get_res, True) time.sleep(0.5) if res == acc.get_address_base58(): return True else: return False
def test_new_transfer_transaction(self): rpc_address = 'http://polaris3.ont.io:20336' sdk = OntologySdk() sdk.rpc.set_address(rpc_address) asset = sdk.native_vm().asset() private_key1 = '523c5fcf74823831756f0bcb3634234f10b3beb1c05595058534577752ad2d9f' private_key2 = '75de8489fcb2dcaf2ef3cd607feffde18789de7da129b5e97c81e001793cb7cf' from_acct = Account(private_key1, SignatureScheme.SHA256withECDSA) to_acct = Account(private_key2, SignatureScheme.SHA256withECDSA) b58_from_address = from_acct.get_address_base58() b58_to_address = to_acct.get_address_base58() b58_payer_address = b58_from_address balance_1 = sdk.rpc.get_balance(b58_from_address) balance_2 = sdk.rpc.get_balance(b58_to_address) old_ont_balance_1 = 0 old_ont_balance_2 = 0 old_ong_balance_1 = 0 old_ong_balance_2 = 0 try: old_ont_balance_1 = balance_1['ont'] old_ont_balance_2 = balance_2['ont'] except KeyError: raised = True self.assertFalse(raised, 'Exception raised') try: old_ong_balance_1 = balance_1['ong'] old_ong_balance_2 = balance_2['ong'] except KeyError: raised = True self.assertFalse(raised, 'Exception raised') amount = 1 gas_price = 500 gas_limit = 20000 tx = asset.new_transfer_transaction('ont', b58_from_address, b58_to_address, amount, b58_payer_address, gas_limit, gas_price) tx = sdk.sign_transaction(tx, from_acct) tx = sdk.add_sign_transaction(tx, to_acct) tx_hash = sdk.rpc.send_raw_transaction(tx) self.assertEqual(64, len(tx_hash)) time.sleep(6) balance_1 = sdk.rpc.get_balance(b58_from_address) balance_2 = sdk.rpc.get_balance(b58_to_address) new_ont_balance_1 = 0 new_ont_balance_2 = 0 new_ong_balance_1 = 0 new_ong_balance_2 = 0 try: new_ont_balance_1 = balance_1['ont'] new_ont_balance_2 = balance_2['ont'] except KeyError: raised = True self.assertFalse(raised, 'Exception raised') try: new_ong_balance_1 = balance_1['ong'] new_ong_balance_2 = balance_2['ong'] except KeyError: raised = True self.assertFalse(raised, 'Exception raised') gas = gas_limit * gas_price self.assertEqual(int(old_ont_balance_1) - 1, int(new_ont_balance_1)) self.assertEqual(int(old_ont_balance_2) + 1, int(new_ont_balance_2)) self.assertEqual((int(old_ong_balance_1) - int(new_ong_balance_1)), gas) self.assertEqual(int(old_ong_balance_2), int(new_ong_balance_2))
class DemoClient(object): """ """ def __init__(self, rpc_addr: str, wallet_file: str, is_maker: bool, pwd, avm_file, abi_file): self.sdk = OntologySdk() self.sdk.rpc.set_address(rpc_addr) self.sdk.open_wallet(wallet_file) self.is_maker = is_maker # 可以查询一个合约存不存在,存在就可以让maker是True,而不必自己指定了 self.__pwd = pwd self.__get_code_from_avm(avm_file) self.__get_abi_from_file(abi_file) @staticmethod def is_transaction_success(txid): if len(txid) != 64: return False return True def start_game(self, acc_index): if not self.is_maker: return acc = self.get_account_by_index(acc_index) txid = self.deploy_contract(need_storage=True, name="sixsixsix", code_ver="1.0", author="tomzou", email="*****@*****.**", desp="demo", acc=acc, gas_limit=20200000, gas_price=500) if not self.is_transaction_success(txid): raise Exception(txid) return txid def get_account_by_index(self, acc_index): wm = self.sdk.get_wallet_manager() return wm.get_account(wm.get_wallet().get_account_by_index(acc_index).get_address(), self.__pwd[acc_index]) def deploy_contract(self, need_storage, name, code_ver, author, email, desp, acc, gas_limit, gas_price): tx = self.sdk.neo_vm().make_deploy_transaction(self.code, need_storage=need_storage, name=name, code_version=code_ver, author=author, email=email, desp=desp, payer=acc.get_address_base58(), gas_limit=gas_limit, gas_price=gas_price) self.sdk.sign_transaction(tx, acc) return self.sdk.get_rpc().send_raw_transaction(tx) def __get_code_from_avm(self, avm_file): f = open(avm_file) self.code = f.readline() code_addr_obj = Address.address_from_vm_code(self.code) self.code_addr = code_addr_obj.to_reverse_hex_str() self.contract_acc = code_addr_obj.to_base58() self.contract_addr = code_addr_obj.to_byte_array() # 应该是这个地址 f.close() def __get_abi_from_file(self, abi_file): f = open(abi_file) abi_str = f.readline() abi = json.loads(abi_str, object_hook=lambda d: namedtuple('X', d.keys())(*d.values())) self.abi_info = AbiInfo("0x" + self.code_addr, "main", abi.functions, []) def luck_roll(self, amount, acc_index): """ 玩家通过本方法参与游戏 :param amount: :param acc_index: :return: """ self.join_game(amount, acc_index) def join_game(self, amount, acc_index): acc = self.get_account_by_index(acc_index) func_join = self.abi_info.get_function("join") func_join.set_params_value(acc.get_address().to_byte_array(), amount) txid = self.sdk.neo_vm().send_transaction(self.contract_addr, acc, acc, 2000000, 500, func_join, False) if not self.is_transaction_success(txid): raise Exception(txid) before = time.time() tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash(txid) while tx_info == 'unknown transaction' or tx_info is None: tx_info = self.sdk.get_rpc().get_smart_contract_event_by_txhash(txid) print('cost %f seconds to confirm tx' %(time.time() - before)) try: notify_info = tx_info['Notify'][0]['States'] except Exception: raise Exception(tx_info) if notify_info == '626574207472616e666572206661696c6564': raise Exception('bet tranfer failed') elif notify_info == '736574746c65207472616e73666572206661696c6564': raise Exception('settle transfer failed') else: print(bytes.fromhex(notify_info).decode())
def main(argv): try: opts, args = getopt.getopt(argv, "-h-m:-i:-p", [ "migrate=", "invoke=", ]) except getopt.GetoptError: print('test.py [-m|--migrate] [-i|--invoke] ') sys.exit(2) m = {} invoke_func_name = "" pre_exec = False for opt, arg in opts: if opt == '-h': print('test.py [-m|--migrate] [-i|--invoke] ') sys.exit() elif opt in ("-m", "--migrate"): m["func"] = "migrate" if "json" in str(arg): with open(arg, "r") as f: r = json.load( f, object_hook=lambda d: namedtuple('X', d.keys()) (*d.values())) #print("r_json_content is ", r) m["rpc_address"] = r.rpc_address m["need_storage"] = r.need_storage m["name"] = r.name m["code_version"] = r.code_version m["author"] = r.author m["email"] = r.email m["desp"] = r.desp m["payer_address"] = r.payer_address m["payer_password"] = r.payer_password m["wallet_file_path"] = r.wallet_file_path m["gas_limit"] = r.gas_limit m["gas_price"] = r.gas_price m["save_file"] = r.save_file if ".avm" in r.code: with open(r.code, "r") as f2: m["code"] = f2.read() else: m["code"] = r.code m["contract_address"] = Address.address_from_vm_code( m["code"]).to_hex_str() else: temp = str(arg).split(",") for i in temp: t = str(i).split("=") m[t[0]] = t[1] elif opt in ("-i", "--invoke"): invoke_func_name = arg print('invoke_function is ', invoke_func_name) m["func"] = "invoke" invoke_json_path = './invoke.json' if "json" in str(invoke_json_path): with open(invoke_json_path, "r") as f: r = json.load( f, object_hook=lambda d: namedtuple('X', d.keys()) (*d.values())) m["rpc_address"] = r.rpc_address m["acct_address"] = r.acct_address m["acct_password"] = r.acct_password m["payer_address"] = r.payer_address m["payer_password"] = r.payer_password m["wallet_file_path"] = r.wallet_file_path m["gas_limit"] = r.gas_limit m["gas_price"] = r.gas_price #m["abi_path"] = r.abi_path m["save_file"] = r.save_file print('m_save_file is ', m["save_file"]) #m["function"] = r.function if "abi.json" in r.abi: with open(r.abi, "r") as f: m["abi"] = f.read() else: m["abi"] = r.abi else: temp = str(invoke_json_path).split(",") for i in temp: t = str(i).split("=") m[t[0]] = t[1] elif opt in ("-p", "--pre"): pre_exec = True print('pre_exec is True') else: print('test.py [-m|--migrate] [-i|--invoke] ') sys.exit() sdk = OntologySdk() sdk.set_rpc(m["rpc_address"]) if m["func"] is "migrate": need_storage = False if m["need_storage"] is 'true': need_storage = True tx = sdk.neo_vm().make_deploy_transaction( m["code"], need_storage, m["name"], m["code_version"], m["author"], m["email"], m["desp"], m["payer_address"], m["gas_limit"], m["gas_price"]) sdk.wallet_manager.open_wallet(m["wallet_file_path"]) acct = sdk.wallet_manager.get_account(m["payer_address"], m["payer_password"]) print('acct.address', acct.get_address_base58()) sdk.sign_transaction(tx, acct) sdk.set_rpc(m["rpc_address"]) try: print("deploying,please waiting ...") r = sdk.rpc.send_raw_transaction(tx) print("txhash:", r) for i in range(10): time.sleep(1) r = sdk.rpc.get_smart_contract(m["contract_address"]) if r == "": continue else: print("deploy success") break save_file(m, "success") except Exception as e: print(e) save_file(m, e) elif m["func"] is "invoke": res_abi = json.loads(m["abi"], object_hook=lambda d: namedtuple('X', d.keys()) (*d.values())) abi_info = AbiInfo(res_abi.hash, res_abi.entrypoint, res_abi.functions, res_abi.events) contract_address = bytearray.fromhex(str(res_abi.hash)[2:]) contract_address.reverse() #print("contract_address is ", contract_address) sdk.wallet_manager.open_wallet(m["wallet_file_path"]) acct = sdk.wallet_manager.get_account(m["acct_address"], m["acct_password"]) payer = sdk.wallet_manager.get_account(m["payer_address"], m["payer_password"]) print('res_abi.hash is ', res_abi.hash) #print('res_abi.entrypoint is ', res_abi.entrypoint) #print('res_abi.function is ', res_abi.functions, type(res_abi.functions), len(res_abi.functions)) invoke_func = abi_info.get_function(invoke_func_name) func_params = {} for function in res_abi.functions: if function.name == invoke_func_name: func_params = function.parameters func_params_map = {} for param in func_params: hinter = 'Pls input ' + param.name + ' (' + param.type + ')' + ': ' raw_input = input(hinter) if param.type == 'String': invoke_func.parameters.append(str(raw_input)) if param.type == 'ByteArray': invoke_func.parameters.append(bytearray(raw_input)) if param.type == 'Integer': invoke_func.parameters.append(int(raw_input)) try: print("") print("invoking '" + invoke_func_name + "', please waiting ...") #print("method: " + invoke_func_name) res = sdk.neo_vm().send_transaction(contract_address, acct, payer, m["gas_limit"], m["gas_price"], invoke_func, pre_exec) if not pre_exec: time.sleep(6) print("txhash:", res) print("Event:", sdk.rpc.get_smart_contract_event_by_tx_hash(res)) else: print(res) print("res:", (bytearray.fromhex(res)).decode('utf-8')) #l.append((bytearray.fromhex(res)).decode('utf-8')) except Exception as e: print("Error:", e) #l.append(e) #func_l.append(l) else: print('only support migrate and invoke')
def execute(m:[], function_name=None): sdk = OntologySdk() sdk.set_rpc(m["rpc_address"]) if m["func"] is "migrate": # 判断是否已经部署 code = sdk.rpc.get_smart_contract(m["contract_address"]) if code != "unknow contract": print("contract have been deployed") print("contract_address:", m["contract_address"]) return need_storage = False if m["need_storage"] is 'true': need_storage = True tx = sdk.neo_vm().make_deploy_transaction(m["code"], need_storage, m["name"], m["code_version"], m["author"] , m["email"], m["desp"], m["payer_address"], m["gas_limit"], m["gas_price"]) sdk.wallet_manager.open_wallet(m["wallet_file_path"]) acct = sdk.wallet_manager.get_account(m["payer_address"], m["payer_password"]) sdk.sign_transaction(tx, acct) sdk.set_rpc(m["rpc_address"]) try: print("deploying,please waiting ...") res = sdk.rpc.send_raw_transaction(tx) print("txhash:", res) for i in range(10): time.sleep(1) res = sdk.rpc.get_smart_contract(m["contract_address"]) if res == "unknow contract" or res == "": continue else: print("deploy success") save_file(m, "success") return print("deployed failed") save_file(m, "deployed failed") except Exception as e: print(e) save_file(m, e) elif m["func"] is "invoke": func_maps = {} for i in list(m["function"]): func_map = {} param_list = [] func_map["function_name"] = i.function_name func_map["pre_exec"] = i.pre_exec try: for j in list(i.function_param): param_list.append(j) func_map["param_list"] = param_list except Exception as e: pass if not i.pre_exec: try: func_map["signers"] = i.signers except AttributeError as e: func_map["signers"] = None func_maps[i.function_name] = func_map with open(str(m["abi_path"]), "r") as f: abi = json.loads(f.read(), object_hook=lambda d: namedtuple('X', d.keys())(*d.values())) abi_info = AbiInfo(abi.hash, abi.entrypoint, abi.functions, abi.events) contract_address = bytearray.fromhex(str(abi.hash)[2:]) m["contract_address"] = contract_address.hex() contract_address.reverse() sdk.wallet_manager.open_wallet(m["wallet_file_path"]) payer = sdk.wallet_manager.get_account(m["payer_address"], m["payer_password"]) func_l = [] no = 0 for func_map in func_maps.values(): if function_name is not None: if function_name != func_map["function_name"]: continue func = abi_info.get_function(func_map["function_name"]) func_map["return_type"] = func.return_type params = [] l = [] l.append(no) no = no + 1 l.append(func_map["function_name"]) l.append(func_map["pre_exec"]) temp_l = "" # 用来放参数 for i in range(len(func_map["param_list"])): temp_l = "" if type(func_map["param_list"][i]) is int: temp_l += str(func_map["param_list"][i]) + ":" else: temp_l += func_map["param_list"][i] + ":" if func.parameters[i].type == "String": params.append(str(func_map["param_list"][i])) if func.parameters[i].type == "ByteArray": if func_map["param_list"][i].startswith("A"): params.append(Address.b58decode(func_map["param_list"][i], False).to_array()) else: params.append(bytearray(func_map["param_list"][i].encode())) if func.parameters[i].type == "Integer": params.append(func_map["param_list"][i]) l.append(temp_l[:len(temp_l) - 1]) if len(params) == 1: func.set_params_value(params[0]) elif len(params) == 2: func.set_params_value(params[0], params[1]) elif len(params) == 3: func.set_params_value(params[0], params[1], params[2]) elif len(params) == 4: func.set_params_value(params[0], params[1], params[2], params[3]) elif len(params) == 5: func.set_params_value(params[0], params[1], params[2], params[3], params[4]) elif len(params) == 6: func.set_params_value(params[0], params[1], params[2], params[3], params[4], params[5]) elif len(params) == 7: func.set_params_value(params[0], params[1], params[2], params[3], params[4], params[5], params[6]) try: print("") print("invoking, please waiting ...") print("method: " + func_map["function_name"]) if func_map["pre_exec"]: res = sdk.neo_vm().send_transaction(contract_address, None, None, 0, 0, func, True) if res["error"] != 0: print(res["desc"]) l.append(res["desc"]) else: if res["result"]["Result"] == None or res["result"]["Result"] == "": print("res:", res["result"]["Result"]) l.append("") else: if func_map["return_type"] == "Integer": value = bytearray.fromhex(res["result"]["Result"]) value.reverse() print("res:", int(value.hex(), 16)) l.append(int(value.hex(), 16)) else: print("res:", (bytearray.fromhex(res["result"]["Result"])).decode('utf-8')) l.append((bytearray.fromhex(res["result"]["Result"])).decode('utf-8')) else: res = "" if func_map["signers"] != None: wm = WalletManager() wm.open_wallet(func_map["signers"].signer.walletpath) signer = wm.get_account(func_map["signers"].signer.address, func_map["signers"].signer.password) print(wm.wallet_in_mem.accounts[0].address) print(signer) res = sdk.neo_vm().send_transaction(contract_address, signer, payer, m["gas_limit"], m["gas_price"], func, False) else: res = sdk.neo_vm().send_transaction(contract_address, payer, payer, m["gas_limit"], m["gas_price"], func, False) for i in range(10): time.sleep(1) event = sdk.rpc.get_smart_contract_event_by_tx_hash(res) if event != None: print("txhash:", res) print("event:", event) break l.append(res) except Exception as e: print("Error:", e) l.append(e) func_l.append(l) save_file(m, "", func_l) else: print("only support migrate and invoke")