def test_UV_TR_002_003_009_010(self, new_genesis_env, clients_consensus): new_genesis_env.deploy_all() pip = clients_consensus[0].pip submitvpandvote(clients_consensus[:3]) proposalinfo_version = pip.get_effect_proposal_info_of_vote() log.info('Get version proposal information {}'.format(proposalinfo_version)) wait_block_number(pip.node, proposalinfo_version.get('ActiveBlock')) assert pip.get_status_of_proposal(proposalinfo_version.get('ProposalID')) == 5 assert pip.chain_version == pip.cfg.version5 assert pip.get_accuverifiers_count(proposalinfo_version.get('ProposalID')) result = pip.submitVersion(pip.node.node_id, str(time.time()), pip.cfg.version8, 3, pip.node.staking_address, transaction_cfg=pip.cfg.transaction_cfg) log.info('Submit version proposal result : {}'.format(result)) assert_code(result, 0) proposalinfo_version = pip.get_effect_proposal_info_of_vote() log.info('Get version proposal information : {}'.format(proposalinfo_version)) result = pip.submitCancel(pip.node.node_id, str(time.time()), 1, proposalinfo_version.get('ProposalID'), pip.node.staking_address, transaction_cfg=pip.cfg.transaction_cfg) log.info('Submit cancel proposal result : {}'.format(result)) assert_code(result, 0) proposalinfo_cancel = pip.get_effect_proposal_info_of_vote(pip.cfg.cancel_proposal) log.info('Get version proposal information : {}'.format(proposalinfo_cancel)) upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN8) pip.node.restart() result = pip.vote(pip.node.node_id, proposalinfo_version.get('ProposalID'), pip.cfg.vote_option_yeas, pip.node.staking_address, transaction_cfg=pip.cfg.transaction_cfg) log.info('Vote result : {}'.format(result)) assert_code(result, 0) result = pip.vote(pip.node.node_id, proposalinfo_cancel.get('ProposalID'), pip.cfg.vote_option_yeas, pip.node.staking_address, transaction_cfg=pip.cfg.transaction_cfg) assert_code(result, 0) log.info('Node {} vote result : {}'.format(pip.node.node_id, result))
def replace_platon_vote(pip, bin=None, program_version=None, version_sign=None): ''' Replace the bin package of the node, restart the node :param pip: :param bin: :return: ''' if bin: upload_platon(pip.node, bin) pip.node.restart() if program_version is None: program_version = pip.node.program_version if version_sign is None: version_sign = pip.node.program_version_sign proposalinfo = pip.get_effect_proposal_info_of_vote() log.info('Get version proposal information {}'.format(proposalinfo)) result = pip.vote(pip.node.node_id, proposalinfo.get('ProposalID'), pip.cfg.vote_option_yeas, pip.node.staking_address, program_version=program_version, version_sign=version_sign, transaction_cfg=pip.cfg.transaction_cfg) log.info('Node {} vote result : {}'.format(pip.node.node_id, result)) return result
def test_V_STA_2_to_5(self, no_vp_proposal, client_verifier_obj_list): pip_obj = no_vp_proposal result = pip_obj.submitVersion(pip_obj.node.node_id, str(time.time()), pip_obj.cfg.version5, 2, pip_obj.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('Submit Version proposal result : {}'.format(result)) assert_code(result, 0) proposalinfo = pip_obj.get_effect_proposal_info_of_vote(pip_obj.cfg.version_proposal) log.info('Get version proposal information : {}'.format(proposalinfo)) for client_obj in client_verifier_obj_list[:2]: result = version_proposal_vote(client_obj.pip) log.info('Node {} vote proposal result : {}'.format(client_obj.node.node_id, result)) assert_code(result, 0) upload_platon(client_verifier_obj_list[-2].node, pip_obj.cfg.PLATON_NEW_BIN) client_verifier_obj_list[-2].node.restart() log.info('Replace the platon of the Node {}, restart the node'.format(client_verifier_obj_list[-2].node.node_id)) wait_block_number(pip_obj.node, proposalinfo.get('EndVotingBlock') - 10) result = client_verifier_obj_list[-2].pip.vote(client_verifier_obj_list[-2].pip.node.node_id, proposalinfo.get('ProposalID'), client_verifier_obj_list[-2].pip.cfg.vote_option_yeas, client_verifier_obj_list[-2].pip.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('Node {} vote proposal result : {}'.format(client_verifier_obj_list[-1].node.node_id, result)) assert_code(result, 0) wait_block_number(pip_obj.node, proposalinfo.get('EndVotingBlock')) pip_obj = client_verifier_obj_list[-1].pip result = pip_obj.vote(pip_obj.node.node_id, proposalinfo.get('ProposalID'), pip_obj.cfg.vote_option_yeas, pip_obj.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('Node {} vote proposal result : {}'.format(client_verifier_obj_list[-1].node.node_id, result)) assert_code(pip_obj.get_status_of_proposal(proposalinfo.get('ProposalID')), 4) wait_block_number(pip_obj.node, proposalinfo.get('ActiveBlock')) assert_code(pip_obj.get_status_of_proposal(proposalinfo.get('ProposalID')), 5) result = pip_obj.vote(pip_obj.node.node_id, proposalinfo.get('ProposalID'), pip_obj.cfg.vote_option_yeas, pip_obj.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('Node {} vote proposal result : {}'.format(client_verifier_obj_list[-1].node.node_id, result))
def client_candidate_obj(global_running_env, staking_cfg): """ Get a candidate node Client object """ client_consensus_obj = get_client_consensus_obj(global_running_env, staking_cfg) client_list_obj = get_client_list_obj(global_running_env, staking_cfg) client_noconsensus_obj_list = get_client_noconsensus_list(global_running_env, staking_cfg) if not client_consensus_obj.staking.get_candidate_list_not_verifier(): log.info('There is no candidate, node stake') candidate_list = get_pledge_list(client_consensus_obj.node.ppos.getCandidateList) for client in client_noconsensus_obj_list: if client.node.node_id not in candidate_list: if client.node.program_version != client.pip.cfg.version0: upload_platon(client.node, client.pip.cfg.PLATON_NEW_BIN0) client.node.restart() log.info('Node {} staking'.format(client.node.node_id)) address, _ = client.economic.account.generate_account(client.node.web3, client.economic.create_staking_limit * 5) result = client.staking.create_staking(0, address, address) log.info('Node {} staking result :{}'.format(client.node.node_id, result)) assert_code(result, 0) client_consensus_obj.economic.wait_settlement_blocknum(client_consensus_obj.node) node_id_list = client_consensus_obj.staking.get_candidate_list_not_verifier() log.info('Get candidate list no verifier {}'.format(node_id_list)) if len(node_id_list) == 0: raise Exception('Get candidate list no verifier failed') return get_client_obj(node_id_list[0], client_list_obj)
def test_VE_AD_003(self, new_genesis_env, clients_consensus, all_clients): submitvpandvote(clients_consensus) proposalinfo = clients_consensus[ 0].pip.get_effect_proposal_info_of_vote() log.info('Get version proposal information : {}'.format(proposalinfo)) wait_block_number(clients_consensus[0].node, proposalinfo.get('ActiveBlock')) consensus_node = new_genesis_env.get_rand_node() test_node = new_genesis_env.get_a_normal_node() test_node.clean() test_node.deploy_me(new_genesis_env.cfg.genesis_tmp) test_node.admin.addPeer(consensus_node.enode) time.sleep(5) assert test_node.web3.net.peerCount > 0, 'Join the chain failed' assert test_node.block_number > 0, "Non-consensus node sync block failed, block height: {}".format( test_node.block_number) time.sleep(5) client = get_client_by_nodeid(test_node.node_id, all_clients) address, _ = client.economic.account.generate_account( client.node.web3, 10**18 * 10000000) result = client.staking.create_staking(0, address, address) assert_code(result, 301004) upload_platon(test_node, client.pip.cfg.PLATON_NEW_BIN) test_node.restart() result = client.staking.create_staking(0, address, address) assert_code(result, 0)
def test_VO_VO_001_V0_RE_001_V0_WA_001_V_STA_1_VO_OP_001_VO_OP_002(no_vp_proposal): pip_obj = no_vp_proposal result = pip_obj.submitVersion(pip_obj.node.node_id, str(time.time()), pip_obj.cfg.version8, 2, pip_obj.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('Submit version proposal result : {}'.format(result)) assert_code(result, 0) proposalinfo = pip_obj.get_effect_proposal_info_of_vote() log.info('Get version proposalinfo {}'.format(proposalinfo)) upload_platon(pip_obj.node, pip_obj.cfg.PLATON_NEW_BIN) log.info('Replace the node platon package to {}'.format(pip_obj.cfg.version5)) pip_obj.node.restart() log.info('Restart the node {}'.format(pip_obj.node.node_id)) address, _ = pip_obj.economic.account.generate_account(pip_obj.node.web3, 10**18 * 10000) result = pip_obj.vote(pip_obj.node.node_id, proposalinfo.get('ProposalID'), pip_obj.cfg.vote_option_yeas, address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('Not staking address vote result : {}'.format(result)) assert_code(result, 302021) result = pip_obj.vote(pip_obj.node.node_id, proposalinfo.get('ProposalID'), pip_obj.cfg.vote_option_nays, pip_obj.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('vote option {} result {}'.format(pip_obj.cfg.vote_option_nays, result)) assert_code(result, 302002) result = pip_obj.vote(pip_obj.node.node_id, proposalinfo.get('ProposalID'), pip_obj.cfg.vote_option_Abstentions, pip_obj.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('vote option {} result {}'.format(pip_obj.cfg.vote_option_Abstentions, result)) assert_code(result, 302002) result = pip_obj.vote(pip_obj.node.node_id, proposalinfo.get('ProposalID'), 0, pip_obj.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('vote option {} result {}'.format(0, result)) assert_code(result, 302002) result = pip_obj.vote(pip_obj.node.node_id, proposalinfo.get('ProposalID'), 'a', pip_obj.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('vote option {} result {}'.format(pip_obj.cfg.vote_option_nays, result)) assert_code(result, 302002) address, _ = pip_obj.economic.account.generate_account(pip_obj.node.web3, 10**18 * 10000) result = pip_obj.vote(pip_obj.node.node_id, proposalinfo.get('ProposalID'), pip_obj.cfg.vote_option_yeas, address, transaction_cfg=pip_obj.cfg.transaction_cfg) assert_code(result, 302021) result = version_proposal_vote(pip_obj) assert_code(result, 0) result = pip_obj.vote(pip_obj.node.node_id, proposalinfo.get('ProposalID'), pip_obj.cfg.vote_option_yeas, pip_obj.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('vote duplicated result: {}'.format(result)) assert_code(result, 302027) wait_block_number(pip_obj.node, proposalinfo.get('EndVotingBlock')) result = pip_obj.vote(pip_obj.node.node_id, proposalinfo.get('ProposalID'), pip_obj.cfg.vote_option_yeas, pip_obj.node.staking_address, transaction_cfg=pip_obj.cfg.transaction_cfg) log.info('endblock vote result: {}'.format(result)) assert_code(result, 302026)
def test_UV_UPG_1_UV_UPG_2(self, new_genesis_env, clients_consensus, client_noconsensus): new_genesis_env.deploy_all() pip = clients_consensus[0].pip pip_test = client_noconsensus.pip address, _ = pip_test.economic.account.generate_account(pip_test.node.web3, 10**18 * 10000000) result = client_noconsensus.staking.create_staking(0, address, address, amount=10 ** 18 * 2000000, transaction_cfg=pip_test.cfg.transaction_cfg) log.info('Node {} staking result : {}'.format(pip_test.node.node_mark, result)) programversion = client_noconsensus.staking.get_version() assert_code(programversion, pip.cfg.version0) pip_test.economic.wait_settlement(pip_test.node) verifier_list = get_pledge_list(clients_consensus[0].ppos.getVerifierList) log.info('Get verifier list : {}'.format(verifier_list)) assert pip_test.node.node_id in verifier_list submitvpandvote(clients_consensus, 5) upload_platon(pip_test.node, pip_test.cfg.PLATON_NEW_BIN) programversion = clients_consensus[0].staking.get_version() assert_code(programversion, pip.cfg.version0) proposalinfo = pip.get_effect_proposal_info_of_vote() log.info('Get version proposal information : {}'.format(proposalinfo)) wait_block_number(pip.node, proposalinfo.get('EndVotingBlock') - 1) validator_list = get_pledge_list(clients_consensus[0].ppos.getValidatorList) wait_block_number(pip.node, proposalinfo.get('EndVotingBlock')) assert_code(pip.get_status_of_proposal(proposalinfo.get('ProposalID')), 4) validator_list = get_pledge_list(clients_consensus[0].ppos.getValidatorList) log.info('Validator list : {}'.format(validator_list)) wait_block_number(pip.node, proposalinfo.get('ActiveBlock')) validator_list = get_pledge_list(clients_consensus[0].ppos.getValidatorList) log.info('Validator list : {}'.format(validator_list)) assert pip_test.node.node_id not in validator_list assert_code(pip.get_status_of_proposal(proposalinfo.get('ProposalID')), 5) block_reward, staking_reward = pip_test.economic.get_current_year_reward(pip_test.node, verifier_num=5) pip.economic.wait_settlement(client_noconsensus.node) count = get_block_count_number(client_noconsensus.node, 320) validator_list = get_pledge_list(clients_consensus[0].ppos.getValidatorList) log.info('Validator list : {}'.format(validator_list)) assert pip_test.node.node_id not in validator_list verifier_list = get_pledge_list(clients_consensus[0].ppos.getVerifierList) log.info('Get verifier list : {}'.format(verifier_list)) assert pip_test.node.node_id not in verifier_list block_reward, staking_reward = pip.economic.get_current_year_reward(pip.node, 5) log.info(f'block_reward == {block_reward}, staking_reward == {staking_reward}') balance_before = pip.node.eth.getBalance(address, 2 * pip.economic.settlement_size - 1) log.info('Block number {} address balace {}'.format(2 * pip.economic.settlement_size - 1, balance_before)) pip.economic.wait_consensus(pip.node) balance_after = pip.node.eth.getBalance(address, 2 * pip.economic.settlement_size) log.info('Block number {} address balace {}'.format(2 * pip.economic.settlement_size, balance_after)) log.info('Staking reward : {}'.format(staking_reward)) assert balance_after - balance_before == staking_reward
def test_V_STA_2_to_5(self, no_vp_proposal, clients_verifier): pip = no_vp_proposal value = len(clients_verifier) - 2 submitvpandvote(clients_verifier[:value], votingrounds=4) proposalinfo = pip.get_effect_proposal_info_of_vote() log.info('Get version proposal information : {}'.format(proposalinfo)) result = version_proposal_vote(clients_verifier[-2].pip) log.info('Node {} vote proposal result : {}'.format( clients_verifier[-1].node.node_id, result)) assert_code(result, 0) wait_block_number(pip.node, proposalinfo.get('EndVotingBlock')) log.info('{}'.format( pip.pip.getTallyResult(proposalinfo.get('ProposalID')))) assert_code(pip.get_status_of_proposal(proposalinfo.get('ProposalID')), 4) pip = clients_verifier[-1].pip upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN) pip.node.restart() log.info('Replace the platon bin and restart the node {}'.format( pip.node.node_id)) result = pip.vote(pip.node.node_id, proposalinfo.get('ProposalID'), pip.cfg.vote_option_yeas, pip.node.staking_address, transaction_cfg=pip.cfg.transaction_cfg) log.info('Node {} vote proposal result : {}'.format( clients_verifier[-1].node.node_id, result)) assert_code(result, 302026) log.info('{}'.format( pip.pip.getTallyResult(proposalinfo.get('ProposalID')))) if pip.node.eth.blockNumber < pip.get_status_of_proposal( proposalinfo.get('ProposalID')): assert_code( pip.get_status_of_proposal(proposalinfo.get('ProposalID')), 4) assert pip.get_status_of_proposal( proposalinfo.get('ProposalID')) == 4 or 5 result = pip.vote(pip.node.node_id, proposalinfo.get('ProposalID'), pip.cfg.vote_option_yeas, pip.node.staking_address, transaction_cfg=pip.cfg.transaction_cfg) log.info('Node {} vote proposal result : {}'.format( clients_verifier[-1].node.node_id, result)) assert_code(result, 302026) wait_block_number(pip.node, proposalinfo.get('ActiveBlock')) assert_code(pip.get_status_of_proposal(proposalinfo.get('ProposalID')), 5)
def test_VE_AD_003(self, new_genesis_env, clients_consensus, all_clients): submitvpandvote(clients_consensus) proposalinfo = clients_consensus[ 0].pip.get_effect_proposal_info_of_vote() log.info('Get version proposal information : {}'.format(proposalinfo)) wait_block_number(clients_consensus[0].node, proposalinfo.get('ActiveBlock')) consensus_node = new_genesis_env.get_rand_node() test_node = new_genesis_env.get_a_normal_node() client = get_client_by_nodeid(test_node.node_id, all_clients) upload_platon(test_node, client.pip.cfg.PLATON_NEW_BIN) test_node.restart() test_node.admin.addPeer(consensus_node.enode) time.sleep(5) address, _ = client.economic.account.generate_account( client.node.web3, 10**18 * 10000000) result = client.staking.create_staking(0, address, address) assert_code(result, 0)
def version_proposal_vote(pip, vote_option=None): proposalinfo = pip.get_effect_proposal_info_of_vote() log.info('Version proposalinfo: {}'.format(proposalinfo)) if not proposalinfo: raise Exception('there is no voting version proposal') if proposalinfo.get('NewVersion') == pip.cfg.version5: upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN) log.info('Replace the node {} version to {}'.format( pip.node.node_mark, pip.cfg.version5)) elif proposalinfo.get('NewVersion') == pip.cfg.version8: upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN8) log.info('Replace the node {} version to {}'.format( pip.node.node_mark, pip.cfg.version8)) elif proposalinfo.get('NewVersion') == pip.cfg.version9: upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN9) log.info('Replace the node {} version to {}'.format( pip.node.node_mark, pip.cfg.version9)) else: raise Exception('The new version of the proposal is{}'.format( proposalinfo.get('NewVersion'))) pip.node.restart() log.info('Restart the node {}'.format(pip.node.node_mark)) if not vote_option: vote_option = pip.cfg.vote_option_yeas result = pip.vote(pip.node.node_id, proposalinfo.get('ProposalID'), vote_option, pip.node.staking_address, transaction_cfg=pip.cfg.transaction_cfg) log.info('The node {} vote result {}'.format(pip.node.node_mark, result)) return result