Esempio n. 1
0
# GLOBAL SETTINGS
# -------------------------------------------
rpc_addr = 'http://polaris3.ont.io:20336'
sdk = OntologySdk()
sdk.set_rpc(rpc_addr)
sdk.open_wallet('/Users/zou/PycharmProjects/ont_test/ont_contrast/demo/cli/wallet.json')

code = ''
addr = Address.address_from_vm_code(code)
contract_addr = addr.to_array()

abi = '{"functions":[{"name":"main","parameters":[{"name":"op","type":""},{"name":"args","type":""}],"returntype":""},{"name":"init","parameters":[{"name":"seed","type":""}],"returntype":""},{"name":"next_round","parameters":[{"name":"seed","type":""}],"returntype":""},{"name":"shoot","parameters":[{"name":"off_player","type":""},{"name":"def_player","type":""},{"name":"seconds","type":""},{"name":"team","type":""}],"returntype":""},{"name":"pass_ball","parameters":[{"name":"holder","type":""},{"name":"def_player","type":""},{"name":"team","type":""}],"returntype":""},{"name":"get_scores","parameters":[{"name":"","type":""}],"returntype":""},{"name":"get_curr_time","parameters":[{"name":"","type":""}],"returntype":""},{"name":"get_team_scores","parameters":[{"name":"","type":""}],"returntype":""},{"name":"pick_ball_holder","parameters":[{"name":"team","type":""},{"name":"is_first","type":""}],"returntype":""},{"name":"jump_ball","parameters":[{"name":"","type":""}],"returntype":""},{"name":"rand_player","parameters":[{"name":"team","type":""}],"returntype":""},{"name":"random_int_from_zero","parameters":[{"name":"num","type":""},{"name":"seed","type":""}],"returntype":""}]}'
abi = json.loads(abi)
abi_info = AbiInfo('0x' + addr.to_reverse_hex_str(), 'main', abi['functions'], [])

acc1 = sdk.get_wallet_manager().get_account('ANH5bHrrt111XwNEnuPZj6u95Dd6u7G4D6', '1')


def get_from_hex(res):
    """
    hex to string
    :param res:
    :return:
    """
    return util.parse_neo_vm_contract_return_type_string(res)


def get_integer_from_hex(res):
    """
    hex to integer
    :param res:
Esempio n. 2
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
Esempio n. 3
0
rpc_addr = 'http://polaris3.ont.io:20336'
sdk = OntologySdk()
sdk.set_rpc(rpc_addr)
sdk.open_wallet(
    '/Users/zou/PycharmProjects/ont_test/ont_contrast/demo/cli/wallet.json')

code = '0133c56b6a00527ac46a51527ac46a00c304696e69749c64090065fb086c7566616a00c30c746f74616c5f737570706c799c6409006525026c7566616a00c3046e616d659c6409006500026c7566616a00c30673796d626f6c9c640900651e026c7566616a00c3087472616e736665729c6440006a51c3c0539e640700006c7566616a51c300c36a52527ac46a51c351c36a53527ac46a51c352c36a54527ac46a52c36a53c36a54c3527265c0066c7566616a00c30e7472616e736665725f6d756c74699c640e006a51c300c36533066c7566616a00c307617070726f76659c645a006a51c3c0539e640700006c7566616a51c300c36a55527ac46a51c351c36a56527ac46a55c3c001149e630d006a56c3c001149e64080061006c7566616a51c352c36a54527ac46a55c36a56c36a54c352726529046c7566616a00c30d7472616e736665725f66726f6d9c6483006a51c3c0549e640700006c7566616a51c300c36a56527ac46a51c351c36a52527ac46a51c352c36a53527ac46a56c3c001149e6317006a52c3c001149e630d006a53c3c001149e64080061006c7566616a51c353c36a54527ac46a56c36a52c36a53c36a54c35379517955727551727552795279547275527275652f016c7566616a00c30a62616c616e63655f6f669c641c006a51c3c0519e640700006c7566616a51c300c365b7046c7566616a00c309616c6c6f77616e63659c6422006a51c3c0529e640700006c7566616a51c300c36a51c351c37c6575006c7566616a00c307646563696d616c9c6409006550006c756661006c756654c56b036368656a00527ac46a00c36c756655c56b0400e1f5056a00527ac40400e1f5056a51527ac46a51c36a00c3956c756654c56b036368656a00527ac46a00c36c756654c56b586a00527ac46a00c36c756657c56b6a00527ac46a51527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a52527ac40202206a53527ac46a52c36a53c36a00c37e6a51c37e7c681253797374656d2e53746f726167652e476574616c75660121c56b6a00527ac46a51527ac46a52527ac46a53527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a54527ac4144756c9dd829b2142883adbe1ae4f8689a1f673e96a55527ac401016a56527ac40202206a57527ac46a53c3009f6328006a00c3681b53797374656d2e52756e74696d652e436865636b5769746e657373619164080061006c7566616a57c36a55c37e6a00c37e6a58527ac46a54c36a58c37c681253797374656d2e53746f726167652e476574616a59527ac46a59c30087630d006a59c36a53c39f64080061006c7566616a59c36a53c39c6425006a54c36a58c37c681553797374656d2e53746f726167652e44656c65746561622800616a54c36a58c36a59c36a53c3945272681253797374656d2e53746f726167652e50757461616a51c3c001149e630d006a52c3c001149e64080061006c7566616a56c36a51c37e6a5a527ac46a54c36a5ac37c681253797374656d2e53746f726167652e476574616a5b527ac46a5bc30087630d006a5bc36a53c39f64080061006c7566616a5bc36a53c39c6425006a54c36a5ac37c681553797374656d2e53746f726167652e44656c65746561622800616a54c36a5ac36a5bc36a53c3945272681253797374656d2e53746f726167652e50757461616a56c36a52c37e6a5c527ac46a54c36a5cc37c681253797374656d2e53746f726167652e476574616a5d527ac46a54c36a5cc36a5dc36a53c3935272681253797374656d2e53746f726167652e50757461087472616e736665726a51c36a52c36a53c354c176c9681553797374656d2e52756e74696d652e4e6f7469667961516c75660111c56b6a00527ac46a51527ac46a52527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a53527ac401016a54527ac40202206a55527ac46a52c3009f634f006a00c3681b53797374656d2e52756e74696d652e436865636b5769746e6573736191632a006a53c36a54c36a00c37e7c681253797374656d2e53746f726167652e476574616a52c39f64080061006c7566616a55c36a00c37e6a51c37e6a56527ac46a53c36a56c37c681253797374656d2e53746f726167652e476574616a57527ac46a57c300876426006a53c36a56c36a52c35272681253797374656d2e53746f726167652e50757461622800616a53c36a56c36a57c36a52c3935272681253797374656d2e53746f726167652e507574616107617070726f76656a00c36a51c36a52c354c176c9681553797374656d2e52756e74696d652e4e6f7469667961516c756656c56b6a00527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a51527ac401016a52527ac46a51c36a52c36a00c37e7c681253797374656d2e53746f726167652e476574616c756659c56b6a00527ac4006a52527ac46a00c3c06a53527ac4616a52c36a53c39f6445006a00c36a52c3c36a51527ac46a52c351936a52527ac46a51c3c0539e640700006c7566616a51c300c36a51c351c36a51c352c3527265140063bdff006c756662b6ff616161516c75660117c56b6a00527ac46a51527ac46a52527ac4681953797374656d2e53746f726167652e476574436f6e74657874616a53527ac401016a54527ac46a00c36a51c39c630b006a52c3009c64080061516c7566616a52c3009f6332006a00c3681b53797374656d2e52756e74696d652e436865636b5769746e6573736191630d006a51c3c001149e64080061006c7566616a54c36a00c37e6a55527ac46a53c36a55c37c681253797374656d2e53746f726167652e476574616a56527ac46a56c30087630d006a56c36a52c39f64080061006c7566616a56c36a52c39c6425006a53c36a55c37c681553797374656d2e53746f726167652e44656c65746561622800616a53c36a55c36a56c36a52c3945272681253797374656d2e53746f726167652e50757461616a54c36a51c37e6a57527ac46a53c36a57c37c681253797374656d2e53746f726167652e476574616a58527ac46a53c36a57c36a58c36a52c3935272681253797374656d2e53746f726167652e50757461087472616e736665726a00c36a51c36a52c354c176c9681553797374656d2e52756e74696d652e4e6f7469667961516c75665fc56b681953797374656d2e53746f726167652e476574436f6e74657874616a00527ac4144756c9dd829b2142883adbe1ae4f8689a1f673e96a51527ac40400e1f5056a52527ac40400e1f5056a53527ac401016a54527ac40c746f74616c5f737570706c796a55527ac46a00c36a55c37c681253797374656d2e53746f726167652e47657461009e640700006c7566616a53c36a52c3956a56527ac46a00c36a55c36a56c35272681253797374656d2e53746f726167652e507574616a00c36a54c36a51c37e6a56c35272681253797374656d2e53746f726167652e50757461087472616e73666572006a51c36a56c354c176c9681553797374656d2e52756e74696d652e4e6f7469667961516c75665ec56b6a00527ac46a51527ac46a51c36a00c3946a52527ac46a52c3c56a53527ac4006a54527ac46a00c36a55527ac461616a00c36a51c39f6433006a54c36a55c3936a56527ac46a56c36a53c36a54c37bc46a54c351936a54527ac46a55c36a54c3936a00527ac462c8ff6161616a53c36c7566'
addr = Address.address_from_vm_code(code)
contract_addr = addr.to_byte_array()

abi = '{"functions":[{"name":"Main","parameters":[{"name":"op","type":""},{"name":"args","type":""}],"returntype":""},{"name":"init","parameters":[{"name":"","type":""}],"returntype":""},{"name":"transfer","parameters":[{"name":"acc_from","type":""},{"name":"acc_to","type":""},{"name":"value","type":""}],"returntype":""},{"name":"transfer_multi","parameters":[{"name":"arr","type":""}],"returntype":""},{"name":"balance_of","parameters":[{"name":"addr","type":""}],"returntype":""},{"name":"approve","parameters":[{"name":"owner","type":""},{"name":"spender","type":""},{"name":"amount","type":""}],"returntype":""},{"name":"transfer_from","parameters":[{"name":"spender","type":""},{"name":"from_acc","type":""},{"name":"to_acc","type":""},{"name":"amount","type":""}],"returntype":""},{"name":"allowance","parameters":[{"name":"owner","type":""},{"name":"spender","type":""}],"returntype":""},{"name":"decimal","parameters":[{"name":"","type":""}],"returntype":""},{"name":"symbol","parameters":[{"name":"","type":""}],"returntype":""},{"name":"total_supply","parameters":[{"name":"","type":""}],"returntype":""},{"name":"name","parameters":[{"name":"","type":""}],"returntype":""}]}'
abi = json.loads(abi,
                 object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
abi_info = AbiInfo('0x' + addr.to_reverse_hex_str(), 'Main', abi.functions, [])

acc1 = sdk.get_wallet_manager().get_account(
    'ANH5bHrrt111XwNEnuPZj6u95Dd6u7G4D6', '1')
acc2 = sdk.get_wallet_manager().get_account(
    'AYvTfgEyYduk3zEKMDnZggWQqt9bkASNxJ', '060708')
acc3 = sdk.get_wallet_manager().get_account(
    'AazEvfQPcQ2GEFFPLF1ZLwQ7K5jDn81hve', '060708')


class TokenTest(TestCase):
    """
    测试Token合约的功能
    """
    def get_from_hex(self, res):
        """
        hex to string
        :param res:
        :return:
Esempio n. 4
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())