A VM can be started given a Context and a BlockHeader. The user can then fire or step to run it. Those functions would only fail if it needs some information (accounts in the current block, or block hashes of previous blocks). If this happens, one can use the function commit_account and commit_blockhash to commit that information to the VM, and fire or step again until it succeeds. The current VM status can always be obtained using the status function.