def make_0mb_slash(slash_client, check_client): """ 构造零出块处罚场景 """ slash_node = slash_client.node print( f'slash_client: {slash_client.node.node_mark}, check_client: {check_client.node.node_mark}' ) pledge_amount, block_reward, slash_blocks = get_out_block_penalty_parameters( slash_client, slash_node, 'Released') log.info( f'slashing param : pledge_amount ({pledge_amount}), block_reward ({block_reward}), slash_blocks ({slash_blocks})' ) log.info("make zero produce block") start_num, end_num = verify_low_block_rate_penalty( slash_client, check_client, block_reward, slash_blocks, pledge_amount, 'Released') log.info('check Verifier Lists') assert check_node_in_list(slash_node.node_id, check_client.ppos.getVerifierList) is False assert check_node_in_list(slash_node.node_id, check_client.ppos.getValidatorList) is False slash_client.node.start() time.sleep(3) return start_num, end_num
def test_PIP_PVF_004(client_con_list_obj, client_new_node_obj_list, reset_environment): """ 治理修改低0出块率扣除验证人自有质押金块数成功扣除区块奖励块数60100-自由金额质押 :param client_con_list_obj: :param reset_environment: :return: """ # get pledge amount1 and block reward pledge_amount1, block_reward, slash_blocks1 = information_before_slash_blocks(client_con_list_obj[0]) # create Parametric proposal param_governance_verify(client_con_list_obj[0], 'slashing', 'slashBlocksReward', '60100') log.info("Current block height: {}".format(client_con_list_obj[0].node.eth.blockNumber)) # Get governable parameters again slash_blocks2 = get_governable_parameter_value(client_con_list_obj[0], 'slashBlocksReward') assert slash_blocks2 == '60100', "ErrMsg:Change parameters {}".format(slash_blocks2) # create account address, _ = client_con_list_obj[0].economic.account.generate_account(client_con_list_obj[0].node.web3, client_con_list_obj[ 0].economic.create_staking_limit * 2) # create staking result = client_new_node_obj_list[0].staking.create_staking(0, address, address) assert_code(result, 0) # wait settlement block client_new_node_obj_list[0].economic.wait_settlement_blocknum(client_new_node_obj_list[0].node) for i in range(4): result = check_node_in_list(client_con_list_obj[0].node.node_id, client_con_list_obj[0].ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if result: # Verify changed parameters Verify_changed_parameters(client_con_list_obj, pledge_amount1, block_reward, slash_blocks2) break else: # wait consensus block client_con_list_obj[0].economic.wait_consensus_blocknum(client_con_list_obj[0].node)
def test_AL_NBI_015(client_new_node_obj): """ 退回质押金并处于锁定期 :param client_new_node_obj: :return: """ # create pledge node address, benifit_address = create_pledge_node(client_new_node_obj, 1.5) # wait settlement block client_new_node_obj.economic.wait_settlement_blocknum(client_new_node_obj.node) # view account amount benifit_balance = query_ccount_amount(client_new_node_obj, benifit_address) for i in range(4): result = check_node_in_list(client_new_node_obj.node.node_id, client_new_node_obj.ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if result: # withdrew of pledge result = client_new_node_obj.staking.withdrew_staking(address) assert_code(result, 0) log.info("Current settlement cycle verifier list:{}".format(client_new_node_obj.ppos.getVerifierList())) for i in range(40): client_new_node_obj.economic.account.sendTransaction(client_new_node_obj.node.web3, '', client_new_node_obj.economic.account.account_with_money[ 'address'], address, client_new_node_obj.node.web3.platon.gasPrice, 21000, 100) time.sleep(1) # view account amount again benifit_balance1 = query_ccount_amount(client_new_node_obj, benifit_address) assert benifit_balance1 > benifit_balance, "ErrMsg: {} > {}".format(benifit_balance1, benifit_balance) break else: # wait consensus block client_new_node_obj.economic.wait_consensus_blocknum(client_new_node_obj.node)
def assert_benifit_reward(client_new_node_obj, benifit_address, address): """ assert Amount of income address :param client_new_node_obj: :param benifit_address: :param address: :return: """ # view account amount benifit_balance = client_new_node_obj.node.eth.getBalance(benifit_address) log.info("benifit_balance: {}".format(benifit_balance)) # wait settlement block client_new_node_obj.economic.wait_settlement_blocknum(client_new_node_obj.node) # view block_reward block_reward, staking_reward = client_new_node_obj.economic.get_current_year_reward( client_new_node_obj.node) log.info("block_reward: {} staking_reward: {}".format(block_reward, staking_reward)) for i in range(4): result = check_node_in_list(client_new_node_obj.node.node_id, client_new_node_obj.ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if result: # view benifit reward blocknumber = view_benifit_reward(client_new_node_obj, address) # view account amount again benifit_balance1 = client_new_node_obj.node.eth.getBalance(benifit_address) log.info("benifit_balance: {}".format(benifit_balance1)) assert benifit_balance + staking_reward + blocknumber * Decimal( str(block_reward)) - benifit_balance1 < client_new_node_obj.node.web3.toWei(1, 'ether'), "ErrMsg:benifit_balance: {}".format( benifit_balance1) break else: # wait consensus block client_new_node_obj.economic.wait_consensus_blocknum(client_new_node_obj.node)
def test_modify_param_of_0mb_freeze_duration(self, verifiers, new_genesis_env, value): """ @describe: 参数提案修改‘zeroProduceFreezeDuration’的值-正常 @step: - 1. 提交参数提案,修改‘zeroProduceFreezeDuration’的值为正常值 - 2. 检查参数生效值和效果 @expect: - 1. 提案生效后查询该参数,返回正确 - 2. 参数在链上生效,影响零出块冻结持续时长 """ # init: 修改依赖参数的值,并重新部署环境 genesis = to_genesis(new_genesis_env.genesis_config) genesis.economicModel.staking.unStakeFreezeDuration = 4 genesis.economicModel.slashing.zeroProduceFreezeDuration = 2 genesis.economicModel.slashing.slashBlocksReward = 0 new_genesis_env.set_genesis(genesis.to_dict()) new_genesis_env.deploy_all() # step1: 发起参数提案,投票使提案生效 pips = get_pips(verifiers) pip = pips[0] pip_id = param_proposal(pip, 'slashing', 'zeroProduceFreezeDuration', value) votes(pip_id, pips, [1, 1, 1, 1]) wait_proposal_active(pip, pip_id) # step2: 检查参数生效值和效果 res = pip.pip.getGovernParamValue('slashing', 'zeroProduceFreezeDuration') assert res['Ret'] == value start_block, end_block = make_0mb_slash(verifiers[0], verifiers[1]) wait_block_number(pip.node, end_block) assert check_node_in_list(pip.node.node_id, pip.node.ppos.getCandidateList) is True node_info = pip.node.ppos.getCandidateInfo(pip.node.node_id) assert node_info['Ret']['Status'] == 0
def test_UP_FV_014(client_new_node, reset_environment): """ 锁仓验证人违规被剔除验证人列表,申请赎回委托金 :param client_new_node: :param reset_environment: :return: """ client = client_new_node economic = client.economic node = client.node # create account amount1 = von_amount(economic.create_staking_limit, 2) amount2 = von_amount(economic.create_staking_limit, 1) address1, report_address = create_account_amount(client, amount1, amount2) # create Restricting Plan delegate_amount = von_amount(economic.delegate_limit, 10) plan = [{'Epoch': 3, 'Amount': delegate_amount}] result = client.restricting.createRestrictingPlan(report_address, plan, report_address) assert_code(result, 0) # create staking result = client.staking.create_staking(0, address1, address1) assert_code(result, 0) # Application for Commission result = client.delegate.delegate(1, report_address) assert_code(result, 0) # Waiting for the end of the settlement period economic.wait_settlement_blocknum(node) # for i in range(4): result = check_node_in_list(node.node_id, client.ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if result: # view current block current_block = node.eth.blockNumber log.info("Current block: {}".format(current_block)) # Report prepareblock signature report_information = mock_duplicate_sign(1, node.nodekey, node.blsprikey, current_block) log.info("Report information: {}".format(report_information)) result = client.duplicatesign.reportDuplicateSign( 1, report_information, report_address) assert_code(result, 0) time.sleep(3) # Access to pledge information candidate_info = client.ppos.getCandidateInfo(node.node_id) info = candidate_info['Ret'] staking_blocknum = info['StakingBlockNum'] # withdrew delegate result = client.delegate.withdrew_delegate(staking_blocknum, report_address) assert_code(result, 0) break else: # wait consensus block client.economic.wait_consensus_blocknum(node)
def test_UP_FV_013(client_new_node, reset_environment): """ 锁仓验证人违规被剔除验证人列表,申请退回质押金 :param client_new_node: :return: """ client1 = client_new_node economic = client1.economic node = client1.node # create account amount1 = von_amount(economic.create_staking_limit, 3) amount2 = von_amount(economic.create_staking_limit, 1) address1, report_address = create_account_amount(client1, amount1, amount2) # create Restricting Plan delegate_amount = von_amount(economic.create_staking_limit, 2) plan = [{'Epoch': 3, 'Amount': delegate_amount}] result = client1.restricting.createRestrictingPlan(address1, plan, address1) assert_code(result, 0) # view restricting plan again restricting_info = client1.ppos.getRestrictingInfo(address1) log.info("restricting plan informtion: {}".format(restricting_info)) # create staking result = client1.staking.create_staking(1, address1, address1) assert_code(result, 0) # view restricting plan again restricting_info = client1.ppos.getRestrictingInfo(address1) log.info("restricting plan informtion: {}".format(restricting_info)) # Waiting for the end of the settlement period economic.wait_settlement_blocknum(node) # for i in range(4): result = check_node_in_list(node.node_id, client1.ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if result: # view current block current_block = node.eth.blockNumber log.info("Current block: {}".format(current_block)) # Report prepareblock signature report_information = mock_duplicate_sign(1, node.nodekey, node.blsprikey, current_block) log.info("Report information: {}".format(report_information)) result = client1.duplicatesign.reportDuplicateSign( 1, report_information, report_address) assert_code(result, 0) time.sleep(3) # withdrew staking result = client1.staking.withdrew_staking(address1) assert_code(result, 301103) break else: # wait consensus block client1.economic.wait_consensus_blocknum(node)
def test_PIP_PVF_004(client_consensus, clients_noconsensus, reset_environment): """ 治理修改低0出块率扣除验证人自有质押金块数成功扣除区块奖励块数49999-自由金额质押 :param client_consensus: :param clients_noconsensus: :param reset_environment: :return: """ consensus_client = client_consensus log.info("Current connection consensus node".format( consensus_client.node.node_mark)) first_index = 0 first_client = clients_noconsensus[first_index] log.info("Current connection non-consensus node:{}".format( first_client.node.node_mark)) economic = consensus_client.economic node = consensus_client.node change_parameter_value = '49999' # get pledge amount1 and block reward consensus_pledge_amount, block_reward, first_slash_blocks = information_before_slash_blocks( consensus_client) # create Parametric proposal param_governance_verify(consensus_client, 'slashing', 'slashBlocksReward', change_parameter_value) log.info("Current block height: {}".format(node.eth.blockNumber)) # Get governable parameters again second_slash_blocks = get_governable_parameter_value( consensus_client, 'slashBlocksReward') assert second_slash_blocks == change_parameter_value, "ErrMsg:Change parameters {}".format( second_slash_blocks) # create account address, _ = economic.account.generate_account( node.web3, von_amount(economic.create_staking_limit, 2)) # create staking result = first_client.staking.create_staking(0, address, address) assert_code(result, 0) # wait settlement block economic.wait_settlement_blocknum(node) candidate_info = consensus_client.ppos.getCandidateInfo( first_client.node.node_id) first_pledge_amount = candidate_info['Ret']['Released'] log.info("Current pledge node amount:{}".format(first_pledge_amount)) for i in range(4): result = check_node_in_list(node.node_id, consensus_client.ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if result: # Verify changed parameters verify_changed_parameters(clients_noconsensus, first_pledge_amount, block_reward, second_slash_blocks) break else: # wait consensus block economic.wait_consensus_blocknum(node)
def test_all_process_of_pip_after_slashed(self, verifiers, new_genesis_env): """ @describe: 节点投票后被处罚,升级提案生效后,节点投票时声明的版本被回退 @issues: 1666 @step: - 1. 节点发起升级提案 - 2. 节点进行投票后,被零出块处罚,不解质押 - 3. 提案生效后,节点解冻结 @expect: - 1. 节点解冻结后,可被选入验证人 """ # init: 修改依赖参数的值,并重新部署环境 genesis = to_genesis(new_genesis_env.genesis_config) genesis.economicModel.slashing.slashBlocksReward = 0 new_genesis_env.set_genesis(genesis.to_dict()) new_genesis_env.deploy_all() pips = get_pips(verifiers) pip = pips[0] # step1: 发起升级提案,并进行投票 pip_id = version_proposal(pip, pip.cfg.version5, 10) for pip in pips[:3]: upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN) assert_code(vote(pip, pip_id, pip.cfg.vote_option_yeas), 0) # step2: 构造零出块处罚,等待提案生效,并且处罚冻结期结束 start_block, end_block = make_0mb_slash(verifiers[1], verifiers[0]) assert start_block < pip.pip.getProposal( pip_id)['Ret']['EndVotingBlock'] vote_info = pip.get_accuverifiers_count(pip_id) assert vote_info[0] == 4 # all verifiers assert vote_info[1] == 3 # all yeas vote wait_proposal_active(pip, pip_id) wait_block_number(pip.node, end_block) # step3: 检查提案生效后,检查节点是否被选举 pip.economic.wait_settlement(pip.node) assert check_node_in_list(pip.node.node_id, pip.node.ppos.getCandidateList) is True assert check_node_in_list(pip.node.node_id, pip.node.ppos.getValidatorList) is True assert check_node_in_list(pip.node.node_id, pip.node.ppos.getVerifierList) is True
def test_AL_NBI_016(client_new_node_obj, reset_environment): """ 被双签处罚槛剔除验证人列表 :param client_new_node_obj: :return: """ client = client_new_node_obj economic = client.economic node = client.node client.economic.env.deploy_all() # create account address1, _ = economic.account.generate_account(node.web3, von_amount(economic.create_staking_limit, 2)) address2, _ = economic.account.generate_account(node.web3, 0) report_address, _ = economic.account.generate_account(node.web3, node.web3.toWei(1000, 'ether')) # create staking staking_amount = von_amount(economic.create_staking_limit, 1.6) result = client_new_node_obj.staking.create_staking(0, address2, address1, amount=staking_amount) assert_code(result, 0) # wait settlement block economic.wait_settlement_blocknum(node) # Check account balance balance = node.eth.getBalance(address2) log.info("Account Balance:{}".format(balance)) # view block_reward block_reward, staking_reward = economic.get_current_year_reward(node) log.info("block_reward: {} staking_reward: {}".format(block_reward, staking_reward)) for i in range(4): result = check_node_in_list(client_new_node_obj.node.node_id, client_new_node_obj.ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if result: # view Current block current_block = client_new_node_obj.node.eth.blockNumber log.info("Current block: {}".format(current_block)) # Report prepareblock signature report_information = mock_duplicate_sign(1, client_new_node_obj.node.nodekey, client_new_node_obj.node.blsprikey, current_block) log.info("Report information: {}".format(report_information)) result = client_new_node_obj.duplicatesign.reportDuplicateSign(1, report_information, report_address) assert_code(result, 0) # wait settlement block economic.wait_settlement_blocknum(node) # Check account balance again balance1 = node.eth.getBalance(address2) log.info("Account Balance:{}".format(balance1)) # count the number of blocks blocknumber = client_new_node_obj.economic.get_block_count_number(node, 10) log.info("blocknumber: {}".format(blocknumber)) total_block_reward = int(Decimal(str(block_reward)) * Decimal(str(blocknumber))) log.info("total_block_reward: {}".format(total_block_reward)) assert balance1 == balance + total_block_reward, "ErrMsg:benifit_balance1:{}".format(balance1) break else: # wait consensus block economic.wait_consensus_blocknum(node)
def no_consensus_node_pledge_award_assertion(client_new_node_obj, benifit_address, from_address): """ 非内置节点质押奖励断言 :param client_new_node_obj: :param benifit_address: :param from_address: :return: """ CandidateInfo = client_new_node_obj.ppos.getCandidateInfo(client_new_node_obj.node.node_id) log.info("Pledgor node information:{}".format(CandidateInfo)) balance = client_new_node_obj.node.eth.getBalance(benifit_address) log.info("benifit address:{} amount: {}".format(benifit_address, balance)) # wait settlement block client_new_node_obj.economic.wait_settlement_blocknum(client_new_node_obj.node) time.sleep(5) VerifierList = client_new_node_obj.ppos.getVerifierList() log.info("Current settlement cycle verifier list:{}".format(VerifierList)) ValidatorList = client_new_node_obj.ppos.getValidatorList() log.info("Current consensus cycle verifier list:{}".format(ValidatorList)) block_reward, staking_reward = client_new_node_obj.economic.get_current_year_reward(client_new_node_obj.node) for i in range(4): result = check_node_in_list(client_new_node_obj.node.node_id, client_new_node_obj.ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if result: # wait consensus block client_new_node_obj.economic.wait_consensus_blocknum(client_new_node_obj.node) # Application for withdrew staking result = client_new_node_obj.staking.withdrew_staking(from_address) assert_code(result, 0) incentive_pool_balance1 = client_new_node_obj.node.eth.getBalance(EconomicConfig.INCENTIVEPOOL_ADDRESS) log.info("incentive pool amount:{}".format(incentive_pool_balance1)) # wait settlement block client_new_node_obj.economic.wait_settlement_blocknum(client_new_node_obj.node) # Count the number of blocks out of pledge node blocknumber = client_new_node_obj.economic.get_block_count_number(client_new_node_obj.node, 5) log.info("blocknumber: {}".format(blocknumber)) balance1 = client_new_node_obj.node.eth.getBalance(benifit_address) log.info("benifit address:{} amount:{}".format(benifit_address, balance1)) # Verify block rewards log.info("Expected bonus:{}".format(Decimal(str(block_reward)) * blocknumber)) assert balance + Decimal(str(block_reward)) * blocknumber - balance1 < client_new_node_obj.node.web3.toWei( 1, 'ether'), "ErrMsg:benifit address:{} amount:{}".format( benifit_address, balance1) break else: # wait consensus block client_new_node_obj.economic.wait_consensus_blocknum(client_new_node_obj.node)
def test_AL_NBI_014(client_new_node_obj): """ 修改节点质押收益地址查看收益变更(正在出块中) :param client_new_node_obj: :return: """ # create pledge node address, benifit_address = create_pledge_node(client_new_node_obj, 1.4) # wait settlement block client_new_node_obj.economic.wait_settlement_blocknum(client_new_node_obj.node) # view block_reward block_reward, staking_reward = client_new_node_obj.economic.get_current_year_reward( client_new_node_obj.node) log.info("block_reward: {} staking_reward: {}".format(block_reward, staking_reward)) # view benifit_address amount again benifit_balance = query_ccount_amount(client_new_node_obj, benifit_address) # change benifit address for i in range(4): result = check_node_in_list(client_new_node_obj.node.node_id, client_new_node_obj.ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if result: current_block = client_new_node_obj.node.eth.blockNumber log.info("Current block:{}".format(current_block)) for i in range(40): nodeid = get_pub_key(client_new_node_obj.node.url, current_block) current_block = client_new_node_obj.node.eth.blockNumber log.info("当前块高:{}".format(current_block)) time.sleep(3) if nodeid == client_new_node_obj.node.node_id: break # create account benifit_address1, _ = client_new_node_obj.economic.account.generate_account(client_new_node_obj.node.web3, 0) # change benifit address result = client_new_node_obj.staking.edit_candidate(address, benifit_address1) assert_code(result, 0) # view benifit reward blocknumber = view_benifit_reward(client_new_node_obj, address) # view benifit_address1 amount benifit_balance1 = query_ccount_amount(client_new_node_obj, benifit_address1) assert benifit_balance + benifit_balance1 == int(Decimal(str( block_reward)) * blocknumber) + staking_reward, "ErrMsg:benifit_balance + benifit_balance1: {}".format( benifit_balance + benifit_balance1)
def test_AL_NBI_017(client_new_node_obj_list): """ 0出块率剔除验证人列表 :param client_new_node_obj_list: :return: """ client_new_node_obj_list[0].economic.env.deploy_all() # create pledge node address, benifit_address = create_pledge_node(client_new_node_obj_list[0], 1.6) # wait settlement block client_new_node_obj_list[0].economic.wait_settlement_blocknum(client_new_node_obj_list[0].node) log.info("Current settlement cycle verifier list:{}".format(client_new_node_obj_list[0].ppos.getVerifierList())) # view block_reward block_reward, staking_reward = client_new_node_obj_list[0].economic.get_current_year_reward( client_new_node_obj_list[0].node) log.info("block_reward: {} staking_reward: {}".format(block_reward, staking_reward)) # view account amount benifit_balance = query_ccount_amount(client_new_node_obj_list[0], benifit_address) for i in range(4): result = check_node_in_list(client_new_node_obj_list[0].node.node_id, client_new_node_obj_list[0].ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if result: # stop node client_new_node_obj_list[0].node.stop() log.info("Current settlement cycle verifier list:{}".format(client_new_node_obj_list[1].ppos.getVerifierList())) # wait settlement block client_new_node_obj_list[1].economic.wait_settlement_blocknum(client_new_node_obj_list[1].node) # view account amount again benifit_balance1 = query_ccount_amount(client_new_node_obj_list[1], benifit_address) # count the number of blocks blocknumber = client_new_node_obj_list[1].economic.get_block_count_number(client_new_node_obj_list[1].node, 5) log.info("blocknumber: {}".format(blocknumber)) assert benifit_balance1 == benifit_balance + int( Decimal(str(block_reward)) * blocknumber), "ErrMsg:benifit_balance1:{}".format(benifit_balance1) break else: # wait consensus block client_new_node_obj_list[0].economic.wait_consensus_blocknum(client_new_node_obj_list[0].node)
def test_AL_NBI_007_to_009(client_new_node_obj): """ AL_NBI_007:非内置验证人Staking奖励(验证人) AL_NBI_008:非内置验证人出块奖励(验证人) AL_NBI_009:非内置验证人手续费奖励(验证人) :param client_new_node_obj: :return: """ # create pledge node address, benifit_address = create_pledge_node(client_new_node_obj, 1.1) # view account amount benifit_balance = client_new_node_obj.node.eth.getBalance(benifit_address) log.info("benifit_balance: {}".format(benifit_balance)) # wait settlement block client_new_node_obj.economic.wait_settlement_blocknum(client_new_node_obj.node) # view block_reward block_reward, staking_reward = client_new_node_obj.economic.get_current_year_reward( client_new_node_obj.node) log.info("block_reward: {} staking_reward: {}".format(block_reward, staking_reward)) for i in range(4): result = check_node_in_list(client_new_node_obj.node.node_id, client_new_node_obj.ppos.getValidatorList) log.info("Current node in consensus list status:{}".format(result)) if not result: # view benifit reward blocknumber = view_benifit_reward(client_new_node_obj, address) # view account amount again benifit_balance1 = client_new_node_obj.node.eth.getBalance(benifit_address) log.info("benifit_balance: {}".format(benifit_balance1)) assert benifit_balance + staking_reward + blocknumber * Decimal( str(block_reward)) - benifit_balance1 < client_new_node_obj.node.web3.toWei(1, 'ether'), "ErrMsg:benifit_balance: {}".format( benifit_balance1) break else: # wait consensus block client_new_node_obj.economic.wait_consensus_blocknum(client_new_node_obj.node)