コード例 #1
0
 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
コード例 #2
0
 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
コード例 #3
0
 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))
コード例 #4
0
ファイル: demo.py プロジェクト: skyinglyh1/pythontest
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")
コード例 #5
0
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
コード例 #6
0
    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))
コード例 #7
0
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())
コード例 #8
0
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')
コード例 #9
0
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")