Struct Session

Source
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

Source

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.

Source

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.

Source

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.

Source

pub fn call_raw<V>( &mut self, contract: ContractId, fn_name: &str, fn_arg: V, gas_limit: u64, ) -> Result<CallReceipt<Vec<u8>>, Error>
where V: Into<Vec<u8>>,

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.

Source

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.

Source

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.

Source

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>
where V: Into<Vec<u8>>,

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.

Source

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.

Source

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.

Source

pub fn memory_pages( &self, contract: ContractId, ) -> Option<impl Iterator<Item = (usize, &[u8], PageOpening)>>

Returns an iterator over the pages (and their indices) of a contract’s memory, together with a proof of their inclusion in the state.

The proof is a Merkle inclusion proof, and the caller is able to verify it by using verify, and matching the root with the one returned by root.

Source

pub fn commit(self) -> Result<[u8; 32], Error>

Commits the given session to disk, consuming the session and returning its state root.

Source

pub fn with_debug<C, R>(&self, c: C) -> R
where C: FnOnce(&[String]) -> R,

Source

pub fn meta(&self, name: &str) -> Option<Vec<u8>>

Returns the value of a metadata item.

Source

pub fn set_meta<S, V>( &mut self, name: S, value: V, ) -> Result<Option<Vec<u8>>, Error>
where S: Into<Cow<'static, str>>, V: for<'a> Serialize<CompositeSerializer<BufferSerializer<&'a mut [u8]>, BufferScratch<&'a mut [u8; 1024]>>>,

Set the value of a metadata item.

Returns the previous value of the metadata item.

Source

pub fn remove_meta<S>(&mut self, name: S) -> Option<Vec<u8>>
where S: Into<Cow<'static, str>>,

Remove a metadata item.

Returns the value of the removed item (if any).

Source

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]>>>,

Source

pub fn contract_metadata( &mut self, contract_id: &ContractId, ) -> Option<&ContractMetadata>

Trait Implementations§

Source§

impl Debug for Session

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
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.

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

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>

This new memory is created for the contract currently at the top of the call tree.

Source§

impl Send for Session

Source§

impl Sync for Session

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> ArchivePointee for T

Source§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
Source§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
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<F, W, T, D> Deserialize<With<T, W>, D> for F
where W: DeserializeWith<F, T, D>, D: Fallible + ?Sized, F: ?Sized,

Source§

fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
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> LayoutRaw for T

Source§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
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> Pointee for T

Source§

type Metadata = ()

The type for metadata in pointers and references to Self.
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.
Source§

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

Source§

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