<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_block_iter(self, start_block=None, start_block_num=None, reverse=True):
 """Returns an iterator that traverses blocks in block number order. Args: start_block (:obj:`BlockWrapper`):
 the block from which traversal begins start_block_num (str):
 a starting block number, in hex, from where traversal begins; only used if no starting_block is provided reverse (bool):
 If True, traverse the blocks in from most recent to oldest block. Otherwise, it traverse the blocks in the opposite order. Returns: An iterator of block wrappers Raises: ValueError: If start_block or start_block_num do not specify a valid block """

        start = None
        if start_block_num:
            if len(start_block_num) < 2:
                raise ValueError("Invalid start block num")
            if start_block_num[:2] != "0x":
                raise ValueError("Invalid start block num")
            start = int(start_block_num, 16)
        elif start_block:
            start = start_block.block_num

        return _BlockStoreIter(
            self.pointer,
            start,
            reverse)