pub struct Runtime<'a> {Show 20 fields
pub program: Arc<Program>,
pub state: ExecutionState,
pub record: ExecutionRecord,
pub records: Vec<ExecutionRecord>,
pub memory_accesses: MemoryAccessRecord,
pub shard_size: u32,
pub shard_batch_size: u32,
pub cycle_tracker: HashMap<String, (u64, u32)>,
pub io_buf: HashMap<u32, String>,
pub trace_buf: Option<BufWriter<File>>,
pub unconstrained: bool,
pub syscall_map: HashMap<SyscallCode, Arc<dyn Syscall>>,
pub max_syscall_cycles: u32,
pub emit_events: bool,
pub report: ExecutionReport,
pub print_report: bool,
pub subproof_verifier: Arc<dyn SubproofVerifier + 'a>,
pub hook_registry: HookRegistry<'a>,
pub opts: SP1CoreOpts,
pub max_cycles: Option<u64>,
/* private fields */
}Expand description
An implementation of a runtime for the SP1 RISC-V zkVM.
The runtime is responsible for executing a user program and tracing important events which occur during execution (i.e., memory reads, alu operations, etc).
For more information on the RV32IM instruction set, see the following: https://www.cs.sfu.ca/~ashriram/Courses/CS295/assets/notebooks/RISCV/RISCV_CARD.pdf
Fields§
§program: Arc<Program>The program.
state: ExecutionStateThe state of the execution.
record: ExecutionRecordThe current trace of the execution that is being collected.
records: Vec<ExecutionRecord>The collected records, split by cpu cycles.
memory_accesses: MemoryAccessRecordThe memory accesses for the current cycle.
shard_size: u32The maximum size of each shard.
shard_batch_size: u32§cycle_tracker: HashMap<String, (u64, u32)>A counter for the number of cycles that have been executed in certain functions.
io_buf: HashMap<u32, String>A buffer for stdout and stderr IO.
trace_buf: Option<BufWriter<File>>A buffer for writing trace events to a file.
unconstrained: boolWhether the runtime is in constrained mode or not.
In unconstrained mode, any events, clock, register, or memory changes are reset after leaving the unconstrained block. The only thing preserved is writes to the input stream.
syscall_map: HashMap<SyscallCode, Arc<dyn Syscall>>The mapping between syscall codes and their implementations.
max_syscall_cycles: u32The maximum number of cycles for a syscall.
emit_events: boolWhether to emit events during execution.
report: ExecutionReportReport of the program execution.
print_report: boolWhether we should write to the report.
subproof_verifier: Arc<dyn SubproofVerifier + 'a>Verifier used to sanity check verify_sp1_proof during runtime.
hook_registry: HookRegistry<'a>Registry of hooks, to be invoked by writing to certain file descriptors.
opts: SP1CoreOpts§max_cycles: Option<u64>The maximum number of cpu cycles to use for execution.
Implementations§
source§impl<'a> Runtime<'a>
impl<'a> Runtime<'a>
pub fn write_stdin<T: Serialize>(&mut self, input: &T)
pub fn write_stdin_slice(&mut self, input: &[u8])
pub fn write_vecs(&mut self, inputs: &[Vec<u8>])
pub fn write_proof( &mut self, proof: ShardProof<BabyBearPoseidon2>, vk: StarkVerifyingKey<BabyBearPoseidon2>, )
pub fn read_public_values<T: DeserializeOwned>(&mut self) -> T
pub fn read_public_values_slice(&mut self, buf: &mut [u8])
source§impl<'a> Runtime<'a>
impl<'a> Runtime<'a>
pub fn new(program: Program, opts: SP1CoreOpts) -> Self
sourcepub fn with_context(
program: Program,
opts: SP1CoreOpts,
context: SP1Context<'a>,
) -> Self
pub fn with_context( program: Program, opts: SP1CoreOpts, context: SP1Context<'a>, ) -> Self
Create a new runtime from a program, options, and a context.
sourcepub fn hook(&self, fd: u32, buf: &[u8]) -> Vec<Vec<u8>>
pub fn hook(&self, fd: u32, buf: &[u8]) -> Vec<Vec<u8>>
Invokes the hook corresponding to the given file descriptor fd with the data buf,
returning the resulting data.
sourcepub fn recover(
program: Program,
state: ExecutionState,
opts: SP1CoreOpts,
) -> Self
pub fn recover( program: Program, state: ExecutionState, opts: SP1CoreOpts, ) -> Self
Recover runtime state from a program and existing execution state.
sourcepub const fn timestamp(&self, position: &MemoryAccessPosition) -> u32
pub const fn timestamp(&self, position: &MemoryAccessPosition) -> u32
Get the current timestamp for a given memory access position.
pub fn channel(&self) -> u32
sourcepub fn mr(&mut self, addr: u32, shard: u32, timestamp: u32) -> MemoryReadRecord
pub fn mr(&mut self, addr: u32, shard: u32, timestamp: u32) -> MemoryReadRecord
Read a word from memory and create an access record.
sourcepub fn mw(
&mut self,
addr: u32,
value: u32,
shard: u32,
timestamp: u32,
) -> MemoryWriteRecord
pub fn mw( &mut self, addr: u32, value: u32, shard: u32, timestamp: u32, ) -> MemoryWriteRecord
Write a word to memory and create an access record.
sourcepub fn mr_cpu(&mut self, addr: u32, position: MemoryAccessPosition) -> u32
pub fn mr_cpu(&mut self, addr: u32, position: MemoryAccessPosition) -> u32
Read from memory, assuming that all addresses are aligned.
sourcepub fn mw_cpu(&mut self, addr: u32, value: u32, position: MemoryAccessPosition)
pub fn mw_cpu(&mut self, addr: u32, value: u32, position: MemoryAccessPosition)
Write to memory.
sourcepub fn rr(&mut self, register: Register, position: MemoryAccessPosition) -> u32
pub fn rr(&mut self, register: Register, position: MemoryAccessPosition) -> u32
Read from a register.
pub fn bump_record(&mut self)
sourcepub fn execute_record(
&mut self,
) -> Result<(Vec<ExecutionRecord>, bool), ExecutionError>
pub fn execute_record( &mut self, ) -> Result<(Vec<ExecutionRecord>, bool), ExecutionError>
Execute up to self.shard_batch_size cycles, returning the events emitted and whether the program ended.
sourcepub fn execute_state(
&mut self,
) -> Result<(ExecutionState, bool), ExecutionError>
pub fn execute_state( &mut self, ) -> Result<(ExecutionState, bool), ExecutionError>
Execute up to self.shard_batch_size cycles, returning a copy of the prestate and whether the program ended.
pub fn run_untraced(&mut self) -> Result<(), ExecutionError>
pub fn run(&mut self) -> Result<(), ExecutionError>
pub fn dry_run(&mut self)
Trait Implementations§
source§impl<'a> Read for Runtime<'a>
impl<'a> Read for Runtime<'a>
source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
1.36.0 · source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
read, except that it reads into a slice of buffers. Read moresource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector)1.0.0 · source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
buf. Read more1.0.0 · source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
buf. Read more1.6.0 · source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
buf. Read moresource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)cursor. Read more1.0.0 · source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read. Read moreAuto Trait Implementations§
impl<'a> Freeze for Runtime<'a>
impl<'a> !RefUnwindSafe for Runtime<'a>
impl<'a> Send for Runtime<'a>
impl<'a> Sync for Runtime<'a>
impl<'a> Unpin for Runtime<'a>
impl<'a> !UnwindSafe for Runtime<'a>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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