pub struct Session { /* private fields */ }Expand description
A running mutation to a state.
Sessions are spawned using a VM instance, and can be used to call
contracts with to modify their state. A sequence of these calls may then be
commited to, or discarded by simply allowing the session to drop.
New contracts are to be deployed in the context of a session.
Implementations§
Source§impl Session
impl Session
Sourcepub fn deploy<'a, A, D>(
&mut self,
bytecode: &[u8],
deploy_data: D,
gas_limit: u64,
) -> Result<ContractId, Error>where
A: 'a + for<'b> Serialize<CompositeSerializer<BufferSerializer<&'b mut [u8]>, BufferScratch<&'b mut [u8; 1024]>>>,
D: Into<ContractData<'a, A>>,
pub fn deploy<'a, A, D>(
&mut self,
bytecode: &[u8],
deploy_data: D,
gas_limit: u64,
) -> Result<ContractId, Error>where
A: 'a + for<'b> Serialize<CompositeSerializer<BufferSerializer<&'b mut [u8]>, BufferScratch<&'b mut [u8; 1024]>>>,
D: Into<ContractData<'a, A>>,
Deploy a contract, returning its ContractId. The ID is computed
using a blake3 hash of the bytecode. Contracts using the memory64
proposal are accepted in just the same way as 32-bit contracts, and
their handling is totally transparent.
Since a deployment may execute some contract initialization code, that
code will be metered and executed with the given gas_limit.
§Errors
It is possible that a collision between contract IDs occurs, even for
different contract IDs. This is due to the fact that all contracts have
to fit into a sparse merkle tree with 2^32 positions, and as such
a 256-bit number has to be mapped into a 32-bit number.
If such a collision occurs, PersistenceError will be returned.
§Panics
If deploy_data does not specify an owner, this will panic.
Sourcepub fn deploy_raw(
&mut self,
contract_id: Option<ContractId>,
bytecode: &[u8],
init_arg: Option<Vec<u8>>,
owner: Vec<u8>,
gas_limit: u64,
) -> Result<ContractId, Error>
pub fn deploy_raw( &mut self, contract_id: Option<ContractId>, bytecode: &[u8], init_arg: Option<Vec<u8>>, owner: Vec<u8>, gas_limit: u64, ) -> Result<ContractId, Error>
Deploy a contract, returning its ContractId. If ID is not provided,
it is computed using a blake3 hash of the bytecode. Contracts using
the memory64 proposal are accepted in just the same way as 32-bit
contracts, and their handling is totally transparent.
Since a deployment may execute some contract initialization code, that
code will be metered and executed with the given gas_limit.
§Errors
It is possible that a collision between contract IDs occurs, even for
different contract IDs. This is due to the fact that all contracts have
to fit into a sparse merkle tree with 2^32 positions, and as such
a 256-bit number has to be mapped into a 32-bit number.
If such a collision occurs, PersistenceError will be returned.
Sourcepub fn call<A, R>(
&mut self,
contract: ContractId,
fn_name: &str,
fn_arg: &A,
gas_limit: u64,
) -> Result<CallReceipt<R>, Error>where
A: for<'b> Serialize<CompositeSerializer<BufferSerializer<&'b mut [u8]>, BufferScratch<&'b mut [u8; 1024]>>>,
<A as Archive>::Archived: for<'b> CheckBytes<DefaultValidator<'b>>,
R: Archive,
<R as Archive>::Archived: Deserialize<R, Infallible> + for<'b> CheckBytes<DefaultValidator<'b>>,
pub fn call<A, R>(
&mut self,
contract: ContractId,
fn_name: &str,
fn_arg: &A,
gas_limit: u64,
) -> Result<CallReceipt<R>, Error>where
A: for<'b> Serialize<CompositeSerializer<BufferSerializer<&'b mut [u8]>, BufferScratch<&'b mut [u8; 1024]>>>,
<A as Archive>::Archived: for<'b> CheckBytes<DefaultValidator<'b>>,
R: Archive,
<R as Archive>::Archived: Deserialize<R, Infallible> + for<'b> CheckBytes<DefaultValidator<'b>>,
Execute a call on the current state of this session.
Calls are atomic, meaning that on failure their execution doesn’t modify
the state. They are also metered, and will execute with the given
gas_limit. This value should never be 0.
§Errors
The call may error during execution for a wide array of reasons, the most common ones being running against the gas limit and a contract panic. Calling the ‘init’ method is not allowed except for when called from the deploy method.
Sourcepub fn call_raw<V>(
&mut self,
contract: ContractId,
fn_name: &str,
fn_arg: V,
gas_limit: u64,
) -> Result<CallReceipt<Vec<u8>>, Error>
pub fn call_raw<V>( &mut self, contract: ContractId, fn_name: &str, fn_arg: V, gas_limit: u64, ) -> Result<CallReceipt<Vec<u8>>, Error>
Execute a raw call on the current state of this session.
Raw calls do not specify the type of the argument or of the return. The
caller is responsible for serializing the argument as the target
contract expects.
For more information about calls see call.
Sourcepub fn migrate<'a, A, D, F>(
self,
contract: ContractId,
bytecode: &[u8],
deploy_data: D,
deploy_gas_limit: u64,
closure: F,
) -> Result<Session, Error>where
A: 'a + for<'b> Serialize<CompositeSerializer<BufferSerializer<&'b mut [u8]>, BufferScratch<&'b mut [u8; 1024]>>>,
D: Into<ContractData<'a, A>>,
F: FnOnce(ContractId, &mut Session) -> Result<(), Error>,
pub fn migrate<'a, A, D, F>(
self,
contract: ContractId,
bytecode: &[u8],
deploy_data: D,
deploy_gas_limit: u64,
closure: F,
) -> Result<Session, Error>where
A: 'a + for<'b> Serialize<CompositeSerializer<BufferSerializer<&'b mut [u8]>, BufferScratch<&'b mut [u8; 1024]>>>,
D: Into<ContractData<'a, A>>,
F: FnOnce(ContractId, &mut Session) -> Result<(), Error>,
Migrates a contract to a new bytecode, performing modifications to
its state as specified by the closure.
The closure takes a contract ID of where the new contract will be available during the migration, and a mutable reference to a session, allowing the caller to perform calls and other operations on the new (and old) contract.
At the end of the migration, the new contract will be available at the
given contract ID, and the old contract will be removed from the
state.
If the owner of a contract is not set, it will be set to the owner of
the contract being replaced. If it is set, then it will be used as the
new owner.
§Errors
The migration may error during execution for a myriad of reasons. The
caller is encouraged to drop the Session should an error occur as it
will more than likely be left in an inconsistent state.
§Panics
If the owner of the new contract is not set in deploy_data, and the
contract being replaced does not exist, this will panic.
Sourcepub fn feeder_call<A, R>(
&mut self,
contract: ContractId,
fn_name: &str,
fn_arg: &A,
gas_limit: u64,
feeder: Sender<Vec<u8>>,
) -> Result<CallReceipt<R>, Error>where
A: for<'b> Serialize<CompositeSerializer<BufferSerializer<&'b mut [u8]>, BufferScratch<&'b mut [u8; 1024]>>>,
<A as Archive>::Archived: for<'b> CheckBytes<DefaultValidator<'b>>,
R: Archive,
<R as Archive>::Archived: Deserialize<R, Infallible> + for<'b> CheckBytes<DefaultValidator<'b>>,
pub fn feeder_call<A, R>(
&mut self,
contract: ContractId,
fn_name: &str,
fn_arg: &A,
gas_limit: u64,
feeder: Sender<Vec<u8>>,
) -> Result<CallReceipt<R>, Error>where
A: for<'b> Serialize<CompositeSerializer<BufferSerializer<&'b mut [u8]>, BufferScratch<&'b mut [u8; 1024]>>>,
<A as Archive>::Archived: for<'b> CheckBytes<DefaultValidator<'b>>,
R: Archive,
<R as Archive>::Archived: Deserialize<R, Infallible> + for<'b> CheckBytes<DefaultValidator<'b>>,
Execute a feeder call on the current state of this session.
Feeder calls are used to have the contract be able to report larger amounts of data to the host via the channel included in this call.
These calls should be performed with a large amount of gas, since the contracts may spend quite a large amount in an effort to report data.
Sourcepub fn feeder_call_raw<V>(
&mut self,
contract: ContractId,
fn_name: &str,
fn_arg: V,
gas_limit: u64,
feeder: Sender<Vec<u8>>,
) -> Result<CallReceipt<Vec<u8>>, Error>
pub fn feeder_call_raw<V>( &mut self, contract: ContractId, fn_name: &str, fn_arg: V, gas_limit: u64, feeder: Sender<Vec<u8>>, ) -> Result<CallReceipt<Vec<u8>>, Error>
Execute a raw feeder call on the current state of this session.
See feeder_call and call_raw for more information of this type
of call.
Sourcepub fn memory_len(
&mut self,
contract_id: ContractId,
) -> Result<Option<usize>, Error>
pub fn memory_len( &mut self, contract_id: ContractId, ) -> Result<Option<usize>, Error>
Returns the current length of the memory of the given contract.
If the contract does not exist, it will return None.
Sourcepub fn root(&self) -> [u8; 32]
pub fn root(&self) -> [u8; 32]
Return the state root of the current state of the session.
The state root is the root of a merkle tree whose leaves are the hashes of the state of of each contract, ordered by their contract ID.
It also doubles as the ID of a commit - the commit root.
Sourcepub fn memory_pages(
&self,
contract: ContractId,
) -> Option<impl Iterator<Item = (usize, &[u8], PageOpening)>>
pub fn memory_pages( &self, contract: ContractId, ) -> Option<impl Iterator<Item = (usize, &[u8], PageOpening)>>
Sourcepub fn commit(self) -> Result<[u8; 32], Error>
pub fn commit(self) -> Result<[u8; 32], Error>
Commits the given session to disk, consuming the session and returning its state root.
pub fn with_debug<C, R>(&self, c: C) -> R
pub fn serialize_data<V>(value: &V) -> Result<Vec<u8>, Error>where
V: for<'a> Serialize<CompositeSerializer<BufferSerializer<&'a mut [u8]>, BufferScratch<&'a mut [u8; 1024]>>>,
pub fn contract_metadata( &mut self, contract_id: &ContractId, ) -> Option<&ContractMetadata>
Trait Implementations§
Source§impl Drop for Session
A session is created by leaking an using Box::leak on a SessionInner.
Therefore, the memory needs to be recovered.
impl Drop for Session
A session is created by leaking an using Box::leak on a SessionInner.
Therefore, the memory needs to be recovered.
Source§impl MemoryCreator for Session
impl MemoryCreator for Session
Source§fn new_memory(
&self,
_ty: MemoryType,
minimum: usize,
_maximum: Option<usize>,
_reserved_size_in_bytes: Option<usize>,
_guard_size_in_bytes: usize,
) -> Result<Box<dyn LinearMemory>, String>
fn new_memory( &self, _ty: MemoryType, minimum: usize, _maximum: Option<usize>, _reserved_size_in_bytes: Option<usize>, _guard_size_in_bytes: usize, ) -> Result<Box<dyn LinearMemory>, String>
This new memory is created for the contract currently at the top of the call tree.
impl Send for Session
impl Sync for Session
Auto Trait Implementations§
impl Freeze for Session
impl !RefUnwindSafe for Session
impl Unpin for Session
impl !UnwindSafe for Session
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.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 moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: *const T) -> Layout
fn layout_raw(_: *const T) -> Layout
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.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
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.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
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.