def get_virtual_transactions(blockchain_name, blockchain_opts, first_block_height, last_block_height, tx_filter=None, **hints):
    """
    Get the sequence of virtualchain transactions from a particular blockchain over a given range of block heights.
    Returns a list of tuples in the format of [(block height, [txs])], where
    each tx in [txs] is the parsed transaction.  The parsed transaction will conform to... # TODO write a spec for this
    
    Each transaction has at least the following fields:
    
    `version`: the version of the transaction
    `txindex`: the index into the block where this tx occurs
    `ins`: a list of transaction inputs, where each member is a dict with:
        `outpoint`: a dict of {'hash': txid of transaction that fed it in, 'index': the index into the feeder tx's outputs list}
        `script`: the signature script for this input
    `outs`: a list of transaction outputs, where each member is a dict with:
        `value`: the amount of currency units spent (in the fundamental units of the chain)
        `script`: the spending script for this input
    `senders`: a list of information in 1-to-1 correspondence with each input regarding the transactions that funded it:
        `value`: the amount of currency units sent (in fundamental units of the chain) 
        `script_pubkey`: the spending script for the sending transaction
    
    Returns [(block height, [txs])] on success
    Returns None on error.
    Raises ValueError on unknown blockchain
    """
    if blockchain_name == 'bitcoin':
        return get_bitcoin_virtual_transactions(blockchain_opts, first_block_height, last_block_height, tx_filter=tx_filter, **hints)

    else:
        raise ValueError("Unknown blockchain {}".format(blockchain_name))