VirtualMachine

Struct VirtualMachine 

Source
pub struct VirtualMachine<E, VB>
where E: StarkEngine, VB: VmBuilder<E>,
{ pub engine: E, /* private fields */ }
Expand description

The VirtualMachine struct contains the API to generate proofs for arbitrary programs for a fixed set of OpenVM instructions and a fixed VM circuit corresponding to those instructions. The API is specific to a particular StarkEngine, which specifies a fixed StarkGenericConfig and [ProverBackend] via associated types. The [VmProverBuilder] also fixes the choice of RecordArena associated to the prover backend via an associated type.

In other words, this struct is the zkVM.

Fields§

§engine: E

Proving engine

Implementations§

Source§

impl<E, VB> VirtualMachine<E, VB>
where E: StarkEngine, VB: VmBuilder<E>,

Source

pub fn executor(&self) -> &VmExecutor<Val<E::SC>, VB::VmConfig>

Runtime executor

Source

pub fn pk(&self) -> &DeviceMultiStarkProvingKey<E::PB>

Source§

impl<E, VB> VirtualMachine<E, VB>
where E: StarkEngine, VB: VmBuilder<E>,

Source

pub fn pk_mut(&mut self) -> &mut DeviceMultiStarkProvingKey<E::PB>

Source§

impl<E, VB> VirtualMachine<E, VB>
where E: StarkEngine, VB: VmBuilder<E>,

Source

pub fn new( engine: E, builder: VB, config: VB::VmConfig, d_pk: DeviceMultiStarkProvingKey<E::PB>, ) -> Result<Self, VirtualMachineError>

Source

pub fn new_with_keygen( engine: E, builder: VB, config: VB::VmConfig, ) -> Result<(Self, MultiStarkProvingKey<E::SC>), VirtualMachineError>

Source

pub fn config(&self) -> &VB::VmConfig

Source

pub fn interpreter( &self, exe: &VmExe<Val<E::SC>>, ) -> Result<InterpretedInstance<'_, Val<E::SC>, ExecutionCtx>, StaticProgramError>

Pure interpreter.

Source

pub fn metered_interpreter( &self, exe: &VmExe<Val<E::SC>>, ) -> Result<InterpretedInstance<'_, Val<E::SC>, MeteredCtx>, StaticProgramError>

Source

pub fn metered_cost_interpreter( &self, exe: &VmExe<Val<E::SC>>, ) -> Result<InterpretedInstance<'_, Val<E::SC>, MeteredCostCtx>, StaticProgramError>

Source

pub fn preflight_interpreter( &self, exe: &VmExe<Val<E::SC>>, ) -> Result<PreflightInterpretedInstance<Val<E::SC>, <VB::VmConfig as VmExecutionConfig<Val<E::SC>>>::Executor>, StaticProgramError>

Source

pub fn execute_preflight( &self, interpreter: &mut PreflightInterpretedInstance<Val<E::SC>, <VB::VmConfig as VmExecutionConfig<Val<E::SC>>>::Executor>, state: VmState<Val<E::SC>, GuestMemory>, num_insns: Option<u64>, trace_heights: &[u32], ) -> Result<PreflightExecutionOutput<Val<E::SC>, VB::RecordArena>, ExecutionError>

Preflight execution for a single segment. Executes for exactly num_insns instructions using an interpreter. Preflight execution must be provided with trace_heights instrumentation data that was collected from a previous run of metered execution so that the preflight execution knows how much memory to allocate for record arenas.

This function should rarely be called on its own. Users are advised to call prove directly.

Source

pub fn create_initial_state( &self, exe: &VmExe<Val<E::SC>>, inputs: impl Into<Streams<Val<E::SC>>>, ) -> VmState<Val<E::SC>, GuestMemory>

Calls VmState::initial but sets more information for performance metrics when feature “perf-metrics” is enabled.

Source

pub fn generate_proving_ctx( &mut self, system_records: SystemRecords<Val<E::SC>>, record_arenas: Vec<VB::RecordArena>, ) -> Result<ProvingContext<E::PB>, GenerationError>

This function mutates self but should only depend on internal state in the sense that:

  • program must already be loaded as cached trace via load_program.
  • initial memory image was already sent to device via transport_init_memory_to_device.
  • all other state should be given by system_records and record_arenas
Source

pub fn prove( &mut self, interpreter: &mut PreflightInterpretedInstance<Val<E::SC>, <VB::VmConfig as VmExecutionConfig<Val<E::SC>>>::Executor>, state: VmState<Val<E::SC>, GuestMemory>, num_insns: Option<u64>, trace_heights: &[u32], ) -> Result<(Proof<E::SC>, Option<GuestMemory>), VirtualMachineError>

Generates proof for zkVM execution for exactly num_insns instructions for a given program and a given starting state.

Note: The cached program trace must be loaded via load_program before calling this function.

Returns:

  • proof for the execution segment
  • final memory state only if execution ends in successful termination (exit code 0). This final memory state may be used to extract user public values afterwards.
Source

pub fn verify( &self, vk: &MultiStarkVerifyingKey<E::SC>, proofs: &[Proof<E::SC>], ) -> Result<(), VmVerificationError>
where Com<E::SC>: AsRef<[Val<E::SC>; 8]> + From<[Val<E::SC>; 8]>, Val<E::SC>: PrimeField32,

Verify segment proofs, checking continuation boundary conditions between segments if VM memory is persistent The behavior of this function differs depending on whether continuations is enabled or not. We recommend to call the functions verify_segments or verify_single directly instead.

Source

pub fn commit_program_on_device( &self, program: &Program<Val<E::SC>>, ) -> CommittedTraceData<E::PB>

Transforms the program into a cached trace and commits it on device using the proof system polynomial commitment scheme.

Returns the cached program trace. Note that load_program must be called separately to load the cached program trace into the VM itself.

Source

pub fn transport_committed_exe_to_device( &self, committed_exe: &VmCommittedExe<E::SC>, ) -> CommittedTraceData<E::PB>

Convenience method to transport a host committed Exe to device. This can be used if you have a pre-committed program and want to transport to device instead of re-committing. One should benchmark the latency of this function versus commit_program_on_device, which directly re-commits on device, to determine which method is more suitable.

Source

pub fn load_program(&mut self, cached_program_trace: CommittedTraceData<E::PB>)

Loads cached program trace into the VM.

Source

pub fn transport_init_memory_to_device(&mut self, memory: &GuestMemory)

Source

pub fn executor_idx_to_air_idx(&self) -> Vec<usize>

Source

pub fn build_metered_ctx(&self) -> MeteredCtx

Convenience method to construct a MeteredCtx using data from the stored proving key.

Source

pub fn build_metered_cost_ctx(&self) -> MeteredCostCtx

Convenience method to construct a MeteredCostCtx using data from the stored proving key.

Source

pub fn num_airs(&self) -> usize

Source

pub fn air_names(&self) -> impl Iterator<Item = &str>

Source§

impl<E, VC> VirtualMachine<E, VC>

Source

pub fn override_system_trace_heights(&mut self, heights: &[u32])

Sets fixed trace heights for the system AIRs’ trace matrices.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more