Exemplo n.º 1
0
class StateMigration:
    def __init__(self):
        pass

    def state_migration_step_1(self, state: State) -> bool:
        """
        Migration Step from State Version 0 to 1
        :return:
        """
        if state.is_older_state_version():
            db_dir_v1 = os.path.join(config.user.data_dir,
                                     config.dev.db_name + '2')
            self._tmp_state = State(state._db)  # DB Pointing to Older State
            state._db = db.DB(db_dir_v1)  # DB Pointing to Newer State
            return True
        return False

    def height_from_state_version_0(self) -> int:
        return self._tmp_state.get_mainchain_height()

    def block_from_state_version_0(self, block_number):
        return Block.get_block_by_number(self._tmp_state, block_number)

    def state_migration_step_2(self, state: State):
        """
        Migration Step from State Version 0 to 1
        :return:
        """
        del self._tmp_state
        self._tmp_state = None
        del state._db

        tmp_db_dir = os.path.join(config.user.data_dir,
                                  config.dev.db_name + "3")
        db_dir = os.path.join(config.user.data_dir, config.dev.db_name)
        shutil.move(db_dir, tmp_db_dir)
        tmp_db_dir = os.path.join(config.user.data_dir,
                                  config.dev.db_name + "2")
        shutil.move(tmp_db_dir, db_dir)
        state._db = db.DB()
        logger.warning("State Migration Finished")
Exemplo n.º 2
0
 def last_block(state: State):
     block_number = state.get_mainchain_height()
     return Block.get_block_by_number(state, block_number)
Exemplo n.º 3
0
class TestState(TestCase):
    def setUp(self):
        with set_xrd_dir('no_data'):
            self.state = State()
        self.m_db = MagicMock(name='mock DB', autospec=db.DB)

    def test_create_state(self):
        self.assertIsNotNone(self.state)  # to avoid warning (unused variable)

    def test_release_state(self):
        self.assertIsNotNone(self.state)  # to avoid warning (unused variable)

    def test_basic_state_funcs(self):
        batch = self.state.batch
        self.assertIsNotNone(batch)
        self.state.write_batch(batch)
        self.assertEqual(self.state.total_coin_supply, 0)

    def test_address_used(self):
        alice_xmss = get_alice_xmss()
        self.assertFalse(self.state.get_address_is_used(alice_xmss.address))

    def test_get_batch(self):
        self.assertIsNotNone(self.state.batch)

    def test_write_batch(self):
        batch = self.state.batch
        block = Block.create(dev_config=config.dev,
                             block_number=10,
                             prev_headerhash=b'aa',
                             prev_timestamp=10,
                             transactions=[],
                             miner_address=b'aa',
                             seed_height=0,
                             seed_hash=None)
        Block.put_block(self.state, block, batch)
        self.assertIsNone(Block.get_block(self.state, block.headerhash))
        self.state.write_batch(batch)
        block2 = Block.get_block(self.state, block.headerhash)
        self.assertEqual(block.headerhash, block2.headerhash)

    def test_update_total_coin_supply(self):
        self.assertEqual(self.state.total_coin_supply, 0)
        self.state._update_total_coin_supply(100, None)
        self.assertEqual(self.state.total_coin_supply, 100)

    def test_total_coin_supply(self):
        self.assertEqual(self.state.total_coin_supply, 0)

    def test_delete(self):
        block = Block()
        Block.put_block(self.state, block, None)
        block1 = Block.get_block(self.state, block.headerhash)
        self.assertEqual(block.serialize(), block1.serialize())
        self.state._delete(block.headerhash, None)
        self.assertIsNone(Block.get_block(self.state, block.headerhash))

    def test_get_block_size_limit(self):
        alice_xmss = get_alice_xmss()
        blocks = gen_blocks(20, self.state, alice_xmss.address)
        self.assertEqual(
            Block.get_block_size_limit(self.state, blocks[-1], config.dev),
            1048576)

        # get_block_size_limit() should return None if it couldn't get any blocks from db
        with patch('xrd.core.Block.Block.get_block', return_value=None):
            self.assertIsNone(
                Block.get_block_size_limit(self.state, blocks[-1], config.dev))

    def test_update_mainchain_height(self):
        self.state.update_mainchain_height(5, None)
        self.assertEqual(self.state.get_mainchain_height(), 5)

    def test_get_mainchain_height(self):
        # Test Case: Check default value
        self.assertEqual(self.state.get_mainchain_height(), -1)

        self.state.update_mainchain_height(15, None)
        self.assertEqual(self.state.get_mainchain_height(), 15)

        self.state.update_mainchain_height(5, None)
        self.assertEqual(self.state.get_mainchain_height(), 5)

    def test_fork_state(self):
        fork_state = xrdstateinfo_pb2.ForkState(
            initiator_headerhash=b'block2_right',
            fork_point_headerhash=b'block0_base_of_fork',
            old_mainchain_hash_path=[b'block1_right', b'block2_right'],
            new_mainchain_hash_path=[b'block1_left', b'block2_left'])
        self.assertIsNone(self.state.get_fork_state())

        self.state.put_fork_state(fork_state)
        self.assertEqual(fork_state, self.state.get_fork_state())

        self.state.delete_fork_state()
        self.assertIsNone(self.state.get_fork_state())