def test_proposal_multiple_voting(self, verifiers, new_genesis_env): """ @describe: 同一提案,节点处罚前已经投票,处罚完成后再次投票 @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() # step1: pips = get_pips(verifiers) pip = pips[0] pip_id = version_proposal(pip, pip.cfg.version5, 20) upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN) vote(pip, pip_id) # step2:停止节点,等待节点被零出块处罚 start_block, end_block = make_0mb_slash(verifiers[0], verifiers[1]) wait_block_number(pip.node, end_block) # step3:检查提案和投票信息是否正确 assert_code(vote(pip, pip_id), 302027) vote_info = pip.get_accuverifiers_count(pip_id) assert vote_info[0] == 4 # all verifiers assert vote_info[1] == 1 # all yeas vote
def test_0mb_freeze_after_version_vote(self, verifiers): """ @describe: 版本升级提案投票后,节点零出块冻结,投票有效,提案可正常生效 @step: - 1. 提交版本提案并进行投票 - 2. 停止节点,等待节点被零出块处罚 - 3. 检查提案和投票信息是否正确 @expect: - 1. 节点被处罚后,投票有效,累积验证人含被处罚节点 - 2. 节点被处罚后,提案可正常生效 - 3. 所有相关查询接口,返回提案信息正确 """ # step1:提交版本提案并进行投票 pips = get_pips(verifiers) pip = pips[0] pip_id = version_proposal(pip, pip.cfg.version5, 5) upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN) vote(pip, pip_id) # step2:停止节点,等待节点被零出块处罚 make_0mb_slash(verifiers[0], verifiers[1]) # step3:检查提案和投票信息是否正确 pip = pips[1] vote_info = pip.get_accuverifiers_count(pip_id) assert vote_info[0] == 4 # all verifiers assert vote_info[1] == 1 # all yeas vote
def test_submit_declare_at_0mb_freezing(self, verifiers, new_genesis_env): """ @describe: 节点零出块冻结期内,进行版本声明 @step: - 1. 节点零出块被冻结处罚 - 2. 冻结期内进行版本声明 @expect: - 1. 节点被处罚冻结期内,可以进行版本声明 - 2. 冻结期内,已发送版本声明,也不会被选举 """ # 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() # step1:提交版本升级提案 pips = get_pips(verifiers) pip = pips[0] # setp2:使用其他节点,对提案进行投票,使提案通过 upload_platon(pips[0].node, pips[0].cfg.PLATON_NEW_BIN) upload_platon(pips[1].node, pips[1].cfg.PLATON_NEW_BIN) upload_platon(pips[2].node, pips[2].cfg.PLATON_NEW_BIN) upload_platon(pips[3].node, pips[3].cfg.PLATON_NEW_BIN) pip_id = version_proposal(pip, pip.cfg.version5, 5) vote(pips[1], pip_id) vote(pips[2], pip_id) vote(pips[3], pip_id) # setp3: 在投票期内,构造节点零出块,并等待提案通过 start_block, end_block = make_0mb_slash(verifiers[0], verifiers[1]) wait_proposal_active(pip, pip_id) # step4:进行版本声明 assert_code(version_declare(pip), 302023) # step5: 等待零出块冻结结束,进行版本声明 wait_block_number(pip.node, end_block) assert_code(version_declare(pip), 0)
def test_txt_vote_at_0mb_freezing(self, verifiers): """ @describe: 节点零出块冻结期内,进行文本提案投票,投票失败 @step: - 1. 节点零出块被冻结处罚 - 2. 冻结期内进行文本提案投票,投票失败 @expect: - 1. 节点被处罚冻结期内,投票失败 - 2. 提案投票信息查询正确 - 3. 可投票验证人统计中,不包含被处罚节点 """ # step1:提交参数提案 pips = get_pips(verifiers) pip = pips[0] pip_id = text_proposal(pip) # step2:停止节点,等待节点被零出块处罚 pip = pips[1] upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN) make_0mb_slash(verifiers[1], verifiers[0]) assert_code(vote(pip, pip_id), 302022)
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_low_version_cause_panic(self, verifiers, new_genesis_env): """ @describe: 链升级后,节点未进行升级,节点panic @step: - 1. 链升级后,节点未进行升级 @expect: - 1. 节点panic """ pips = get_pips(verifiers) pip = pips[0] # step1: 链升级后,节点未进行升级 pip_id = version_proposal(pip, pip.cfg.version5, 5) for pip in pips[1:]: upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN) assert_code(vote(pip, pip_id, pip.cfg.vote_option_yeas), 0) end_block = pip.pip.getProposal(pip_id)['Ret']['ActiveBlock'] - 1 wait_proposal_active(pips[1], pip_id) log.info(f'current active version: {pips[1].pip.getActiveVersion()}') # step2: 断言节点panic # wait_block_number(pip.node, end_block) time.sleep(3) assert pip.pip.web3.isConnected() is False
def test_resync_block_after_upgrade(self, verifiers, new_genesis_env): """ @describe: 链升级后,节点重新同步区块 @step: - 1. 节点发起升级提案,投票并等待提案生效 - 2. 节点清理数据库,重新初始化,并重新同步区块 @expect: - 1. 块高可正常同步到提升生效后的块高 """ pips = get_pips(verifiers) pip = pips[0] # step1: 节点发起升级提案,投票并等待提案生效 pip_id = version_proposal(pip, pip.cfg.version5, 5) for pip in pips: upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN) assert_code(vote(pip, pip_id, pip.cfg.vote_option_yeas), 0) wait_proposal_active(pip, pip_id) # step2: 节点清理数据库,重新初始化,并重新同步区块 block_number = pip.node.block_number pip.node.clean_db() pip.node.init() pip.node.restart() wait_block_number(pip.node, block_number)
def test_all_process_of_pip_after_slashed(self, verifiers, new_genesis_env): """ @describe: 在处罚结束之后,执行pip所有流程 @step: - 1. 节点在零出块处罚结束后发起提案 - 2. 节点在零出块处罚结束后进行投票 - 3. 节点在零出块处罚结束后进行版本声明 @expect: - 1. pip流程未受到处罚影响 """ # 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() # step1: 构造零出块处罚,并在处罚结束后发起提案 pips = get_pips(verifiers) pip = pips[0] # _, 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 # pip.economic.wait_settlement(pip.node) # 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 # step2: 构造零出块处罚,并在处罚结束后进行投票 pip_id = version_proposal(pip, pip.cfg.version5, 10) _, end_block = make_0mb_slash(verifiers[1], verifiers[0]) wait_block_number(pip.node, end_block) upload_platon(pips[1].node, pip.cfg.PLATON_NEW_BIN) upload_platon(pips[2].node, pip.cfg.PLATON_NEW_BIN) upload_platon(pips[3].node, pip.cfg.PLATON_NEW_BIN) assert_code(vote(pips[1], pip_id, pips[1].cfg.vote_option_yeas), 0) assert_code(vote(pips[2], pip_id, pips[2].cfg.vote_option_yeas), 0) assert_code(vote(pips[3], pip_id, pips[3].cfg.vote_option_yeas), 0) # step3: 在提案生效后进行版本声明 wait_proposal_active(pip, pip_id) upload_platon(pip.node, pip.cfg.PLATON_NEW_BIN) assert_code(version_declare(pip), 0)