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)
Example #5
0
 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)
Example #8
0
 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)