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> RefUnwindSafe for Environment<'a, 'b, E, S>where E: RefUnwindSafe, S: RefUnwindSafe, <<E as Ext>::T as Config>::ChainExtension: RefUnwindSafe,

§

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

§

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

§

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

§

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

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

const: unstable · 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
§

impl<T> Downcast for Twhere T: Any,

§

fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>

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.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

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.
§

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.
§

impl<T> DowncastSync for Twhere T: Any + Send + Sync,

§

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

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

const: unstable · 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 Twhere U: From<T>,

const: unstable · 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> 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 Twhere 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.

§

impl<T> Pointable for T

§

const ALIGN: usize = mem::align_of::<T>()

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

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

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> SaturatedConversion for T

source§

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

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

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

Consume self to return an equivalent value of T. Read more
§

impl<SS, SP> SupersetOf<SS> for SPwhere SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
source§

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

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.
source§

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

§

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

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.
source§

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

source§

fn unchecked_into(self) -> T

The counterpart to unchecked_from.
source§

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

source§

fn unique_saturated_into(self) -> T

Consume self to return an equivalent value of T.
§

impl<V, T> VZip<V> for Twhere 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
§

impl<T> JsonSchemaMaybe for T

source§

impl<T> MaybeRefUnwindSafe for Twhere T: RefUnwindSafe,