Environment

Struct Environment 

Source
pub struct Environment<'a, 'b, E: Ext, S: State> { /* private fields */ }
Expand description

Grants the chain extension access to its parameters and execution environment.

It uses typestate programming to enforce the correct usage of the parameters passed to the chain extension.

Implementations§

Source§

impl<'a, 'b, E: Ext, S: State> Environment<'a, 'b, E, S>

Functions that are available in every state of this type.

Source

pub fn func_id(&self) -> u16

The function id within the id passed by a contract.

It returns the two least significant bytes of the id passed by a contract as the other two bytes represent the chain extension itself (the code which is calling this function).

Source

pub fn ext_id(&self) -> u16

The chain extension id within the id passed by a contract.

It returns the two most significant bytes of the id passed by a contract which represent the chain extension itself (the code which is calling this function).

Source

pub fn charge_weight(&mut self, amount: Weight) -> Result<ChargedAmount>

Charge the passed amount of weight from the overall limit.

It returns Ok when there the remaining weight budget is larger than the passed weight. It returns Err otherwise. In this case the chain extension should abort the execution and pass through the error.

The returned value can be used to with Self::adjust_weight. Other than that it has no purpose.

§Note

Weight is synonymous with gas in substrate.

Source

pub fn adjust_weight(&mut self, charged: ChargedAmount, actual_weight: Weight)

Adjust a previously charged amount down to its actual amount.

This is when a maximum a priori amount was charged and then should be partially refunded to match the actual amount.

Source

pub fn ext(&mut self) -> &mut E

Grants access to the execution environment of the current contract call.

Consult the functions on the returned type before re-implementing those functions.

Source§

impl<'a, 'b, E: Ext> Environment<'a, 'b, E, InitState>

Functions that are only available in the initial state of this type.

Those are the functions that determine how the arguments to the chain extensions should be consumed.

Source

pub fn only_in(self) -> Environment<'a, 'b, E, OnlyInState>

Use all arguments as integer values.

Source

pub fn prim_in_buf_out(self) -> Environment<'a, 'b, E, PrimInBufOutState>

Use input arguments as integer and output arguments as pointer to a buffer.

Source

pub fn buf_in_buf_out(self) -> Environment<'a, 'b, E, BufInBufOutState>

Use input and output arguments as pointers to a buffer.

Source§

impl<'a, 'b, E: Ext, S: PrimIn> Environment<'a, 'b, E, S>

Functions to use the input arguments as integers.

Source

pub fn val0(&self) -> u32

The input_ptr argument.

Source

pub fn val1(&self) -> u32

The input_len argument.

Source§

impl<'a, 'b, E: Ext, S: PrimOut> Environment<'a, 'b, E, S>

Functions to use the output arguments as integers.

Source

pub fn val2(&self) -> u32

The output_ptr argument.

Source

pub fn val3(&self) -> u32

The output_len_ptr argument.

Source§

impl<'a, 'b, E: Ext, S: BufIn> Environment<'a, 'b, E, S>

Functions to use the input arguments as pointer to a buffer.

Source

pub fn read(&self, max_len: u32) -> Result<Vec<u8>>

Reads min(max_len, in_len) from contract memory.

This does not charge any weight. The caller must make sure that the an appropriate amount of weight is charged before reading from contract memory. The reason for that is that usually the costs for reading data and processing said data cannot be separated in a benchmark. Therefore a chain extension would charge the overall costs either using max_len (worst case approximation) or using in_len().

Source

pub fn read_into(&self, buffer: &mut &mut [u8]) -> Result<()>

Reads `min(buffer.len(), in_len) from contract memory.

This takes a mutable pointer to a buffer fills it with data and shrinks it to the size of the actual data. Apart from supporting pre-allocated buffers it is equivalent to to read().

Source

pub fn read_as<T: Decode + MaxEncodedLen>(&mut self) -> Result<T>

Reads and decodes a type with a size fixed at compile time from contract memory.

This function is secure and recommended for all input types of fixed size as long as the cost of reading the memory is included in the overall already charged weight of the chain extension. This should usually be the case when fixed input types are used.

Source

pub fn read_as_unbounded<T: Decode>(&mut self, len: u32) -> Result<T>

Reads and decodes a type with a dynamic size from contract memory.

Make sure to include len in your weight calculations.

Source

pub fn in_len(&self) -> u32

The length of the input as passed in as input_len.

A chain extension would use this value to calculate the dynamic part of its weight. For example a chain extension that calculates the hash of some passed in bytes would use in_len to charge the costs of hashing that amount of bytes. This also subsumes the act of copying those bytes as a benchmarks measures both.

Source§

impl<'a, 'b, E: Ext, S: BufOut> Environment<'a, 'b, E, S>

Functions to use the output arguments as pointer to a buffer.

Source

pub fn write( &mut self, buffer: &[u8], allow_skip: bool, weight_per_byte: Option<Weight>, ) -> Result<()>

Write the supplied buffer to contract memory.

If the contract supplied buffer is smaller than the passed buffer an Err is returned. If allow_skip is set to true the contract is allowed to skip the copying of the buffer by supplying the guard value of pallet-contracts::SENTINEL as out_ptr. The weight_per_byte is only charged when the write actually happens and is not skipped or failed due to a too small output buffer.

Auto Trait Implementations§

§

impl<'a, 'b, E, S> Freeze for Environment<'a, 'b, E, S>

§

impl<'a, 'b, E, S> RefUnwindSafe for Environment<'a, 'b, E, S>

§

impl<'a, 'b, E, S> Send for Environment<'a, 'b, E, S>
where S: Send, E: Send, <<E as Ext>::T as Config>::ChainExtension: Send,

§

impl<'a, 'b, E, S> Sync for Environment<'a, 'b, E, S>
where S: Sync, E: Sync, <<E as Ext>::T as Config>::ChainExtension: Sync,

§

impl<'a, 'b, E, S> Unpin for Environment<'a, 'b, E, S>
where S: Unpin,

§

impl<'a, 'b, E, S> !UnwindSafe for Environment<'a, 'b, E, S>

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

Source§

fn checked_from<T>(t: T) -> Option<Self>
where Self: TryFrom<T>,

Convert from a value of T into an equivalent instance of Option<Self>. Read more
Source§

fn checked_into<T>(self) -> Option<T>
where Self: TryInto<T>,

Consume self to return Some equivalent value of Option<T>. Read more
Source§

impl<T, U> DefensiveTruncateInto<U> for T

Source§

fn defensive_truncate_into(self) -> U

Defensively truncate a value and convert it into its bounded form.
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &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
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
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, U> IntoKey<U> for T
where U: FromKey<T>,

Source§

fn into_key(self) -> U

Source§

impl<Src, Dest> IntoTuple<Dest> for Src
where Dest: FromTuple<Src>,

Source§

fn into_tuple(self) -> Dest

Source§

impl<T> IsType<T> for T

Source§

fn from_ref(t: &T) -> &T

Cast reference.
Source§

fn into_ref(&self) -> &T

Cast reference.
Source§

fn from_mut(t: &mut T) -> &mut T

Cast mutable reference.
Source§

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

Cast mutable reference.
Source§

impl<T, Outer> IsWrappedBy<Outer> for T
where Outer: AsRef<T> + AsMut<T> + From<T>, T: From<Outer>,

Source§

fn from_ref(outer: &Outer) -> &T

Get a reference to the inner from the outer.

Source§

fn from_mut(outer: &mut Outer) -> &mut T

Get a mutable reference to the inner from the outer.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> SaturatedConversion for T

Source§

fn saturated_from<T>(t: T) -> Self
where Self: UniqueSaturatedFrom<T>,

Convert from a value of T into an equivalent instance of Self. Read more
Source§

fn saturated_into<T>(self) -> T
where Self: UniqueSaturatedInto<T>,

Consume self to return an equivalent value of 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<T, U> TryIntoKey<U> for T
where U: TryFromKey<T>,

Source§

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

Source§

fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>

Source§

impl<S, T> UncheckedInto<T> for S
where T: UncheckedFrom<S>,

Source§

fn unchecked_into(self) -> T

The counterpart to unchecked_from.
Source§

impl<T, S> UniqueSaturatedInto<T> for S
where T: Bounded, S: TryInto<T>,

Source§

fn unique_saturated_into(self) -> T

Consume self to return an equivalent value of T.
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
Source§

impl<T> JsonSchemaMaybe for T

Source§

impl<T> MaybeRefUnwindSafe for T
where T: RefUnwindSafe,