pub struct CheckMetadataHash<T> { /* private fields */ }
Expand description

Extension for optionally verifying the metadata hash.

The metadata hash is cryptographical representation of the runtime metadata. This metadata hash is build as described in RFC78. This metadata hash should give users the confidence that what they build with an online wallet is the same they are signing with their offline wallet and then applying on chain. To ensure that the online wallet is not tricking the offline wallet into decoding and showing an incorrect extrinsic, the offline wallet will include the metadata hash into the additional signed data and the runtime will then do the same. If the metadata hash doesn’t match, the signature verification will fail and thus, the transaction will be rejected. The RFC contains more details on how it works.

The extension adds one byte (the mode) to the size of the extrinsic. This one byte is controlling if the metadata hash should be added to the signed data or not. Mode 0 means that the metadata hash is not added and thus, None is added to the signed data. Mode 1 means that the metadata hash is added and thus, Some(metadata_hash) is added to the signed data. Further values of mode are reserved for future changes.

The metadata hash is read from the environment variable RUNTIME_METADATA_HASH. This environment variable is for example set by the substrate-wasm-builder when the feature for generating the metadata hash is enabled. If the environment variable is not set and mode = 1 is passed, the transaction is rejected with UnknownTransaction::CannotLookup.

Implementations§

source§

impl<T> CheckMetadataHash<T>

source

pub fn new(enable: bool) -> Self

Creates new SignedExtension to check metadata hash.

source

pub fn new_with_custom_hash(metadata_hash: [u8; 32]) -> Self

Create an instance that uses the given metadata_hash.

This is useful for testing the extension.

Trait Implementations§

source§

impl<T: Clone> Clone for CheckMetadataHash<T>

source§

fn clone(&self) -> CheckMetadataHash<T>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<T> Debug for CheckMetadataHash<T>

source§

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

Formats the value using the given formatter. Read more
source§

impl<T> Decode for CheckMetadataHash<T>
where PhantomData<T>: Decode,

source§

fn decode<__CodecInputEdqy: Input>( __codec_input_edqy: &mut __CodecInputEdqy, ) -> Result<Self, Error>

Attempt to deserialise the value from input.
source§

fn decode_into<I>( input: &mut I, dst: &mut MaybeUninit<Self>, ) -> Result<DecodeFinished, Error>
where I: Input,

Attempt to deserialize the value from input into a pre-allocated piece of memory. Read more
source§

fn skip<I>(input: &mut I) -> Result<(), Error>
where I: Input,

Attempt to skip the encoded value from input. Read more
source§

fn encoded_fixed_size() -> Option<usize>

Returns the fixed encoded size of the type. Read more
source§

impl<T> Encode for CheckMetadataHash<T>
where PhantomData<T>: Encode,

source§

fn size_hint(&self) -> usize

If possible give a hint of expected size of the encoding. Read more
source§

fn encode_to<__CodecOutputEdqy: Output + ?Sized>( &self, __codec_dest_edqy: &mut __CodecOutputEdqy, )

Convert self to a slice and append it to the destination.
source§

fn encode(&self) -> Vec<u8>

Convert self to an owned vector.
source§

fn using_encoded<R, F>(&self, f: F) -> R
where F: FnOnce(&[u8]) -> R,

Convert self to a slice and then invoke the given closure with it.
source§

fn encoded_size(&self) -> usize

Calculates the encoded size. Read more
source§

impl<T: PartialEq> PartialEq for CheckMetadataHash<T>

source§

fn eq(&self, other: &CheckMetadataHash<T>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<T: Config + Send + Sync> SignedExtension for CheckMetadataHash<T>

§

type AccountId = <T as Config>::AccountId

The type which encodes the sender identity.
§

type Call = <T as Config>::RuntimeCall

The type which encodes the call to be dispatched.
§

type AdditionalSigned = Option<[u8; 32]>

Any additional data that will go into the signed payload. This may be created dynamically from the transaction using the additional_signed function.
§

type Pre = ()

The type that encodes information that can be passed from pre_dispatch to post-dispatch.
source§

const IDENTIFIER: &'static str = "CheckMetadataHash"

Unique identifier of this signed extension. Read more
source§

fn additional_signed( &self, ) -> Result<Self::AdditionalSigned, TransactionValidityError>

Construct any additional data that should be in the signed payload of the transaction. Can also perform any pre-signature-verification checks and return an error if needed.
source§

fn pre_dispatch( self, who: &Self::AccountId, call: &Self::Call, info: &DispatchInfoOf<Self::Call>, len: usize, ) -> Result<Self::Pre, TransactionValidityError>

Do any pre-flight stuff for a signed transaction. Read more
source§

fn validate( &self, _who: &Self::AccountId, _call: &Self::Call, _info: &<Self::Call as Dispatchable>::Info, _len: usize, ) -> Result<ValidTransaction, TransactionValidityError>

Validate a signed transaction for the transaction queue. Read more
source§

fn validate_unsigned( _call: &Self::Call, _info: &<Self::Call as Dispatchable>::Info, _len: usize, ) -> Result<ValidTransaction, TransactionValidityError>

Validate an unsigned transaction for the transaction queue. Read more
source§

fn pre_dispatch_unsigned( call: &Self::Call, info: &<Self::Call as Dispatchable>::Info, len: usize, ) -> Result<(), TransactionValidityError>

Do any pre-flight stuff for a unsigned transaction. Read more
source§

fn post_dispatch( _pre: Option<Self::Pre>, _info: &<Self::Call as Dispatchable>::Info, _post_info: &<Self::Call as Dispatchable>::PostInfo, _len: usize, _result: &Result<(), DispatchError>, ) -> Result<(), TransactionValidityError>

Do any post-flight stuff for an extrinsic. Read more
source§

fn metadata() -> Vec<SignedExtensionMetadata>

Returns the metadata for this signed extension. Read more
source§

impl<T> TypeInfo for CheckMetadataHash<T>
where PhantomData<T>: TypeInfo + 'static, T: 'static,

§

type Identity = CheckMetadataHash<T>

The type identifying for which type info is provided. Read more
source§

fn type_info() -> Type

Returns the static type identifier for Self.
source§

impl<T> EncodeLike for CheckMetadataHash<T>
where PhantomData<T>: Encode,

source§

impl<T: Eq> Eq for CheckMetadataHash<T>

source§

impl<T> StructuralPartialEq for CheckMetadataHash<T>

Auto Trait Implementations§

§

impl<T> Freeze for CheckMetadataHash<T>

§

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

§

impl<T> Send for CheckMetadataHash<T>
where T: Send,

§

impl<T> Sync for CheckMetadataHash<T>
where T: Sync,

§

impl<T> Unpin for CheckMetadataHash<T>
where T: Unpin,

§

impl<T> UnwindSafe for CheckMetadataHash<T>
where T: UnwindSafe,

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> DecodeAll for T
where T: Decode,

source§

fn decode_all(input: &mut &[u8]) -> Result<T, Error>

Decode Self and consume all of the given input data. Read more
source§

impl<T> DecodeLimit for T
where T: Decode,

source§

fn decode_all_with_depth_limit( limit: u32, input: &mut &[u8], ) -> Result<T, Error>

Decode Self and consume all of the given input data. Read more
source§

fn decode_with_depth_limit<I>(limit: u32, input: &mut I) -> Result<T, Error>
where I: Input,

Decode Self with the given maximum recursion depth and advance input by the number of bytes consumed. Read more
source§

impl<T> DynClone for T
where T: Clone,

source§

fn __clone_box(&self, _: Private) -> *mut ()

source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Hashable for T
where T: Codec,

source§

fn blake2_128(&self) -> [u8; 16]

source§

fn blake2_256(&self) -> [u8; 32]

source§

fn blake2_128_concat(&self) -> Vec<u8>

source§

fn twox_128(&self) -> [u8; 16]

source§

fn twox_256(&self) -> [u8; 32]

source§

fn twox_64_concat(&self) -> Vec<u8>

source§

fn identity(&self) -> Vec<u8>

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<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> KeyedVec for T
where T: Codec,

source§

fn to_keyed_vec(&self, prepend_key: &[u8]) -> Vec<u8>

Return an encoding of Self prepended by given slice.
source§

impl<T> Same for T

§

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> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

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

§

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

§

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

§

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<S> Codec for S
where S: Decode + Encode,

source§

impl<T> EncodeLike<&&T> for T
where T: Encode,

source§

impl<T> EncodeLike<&T> for T
where T: Encode,

source§

impl<T> EncodeLike<&mut T> for T
where T: Encode,

source§

impl<T> EncodeLike<Arc<T>> for T
where T: Encode,

source§

impl<T> EncodeLike<Box<T>> for T
where T: Encode,

source§

impl<'a, T> EncodeLike<Cow<'a, T>> for T
where T: ToOwned + Encode,

source§

impl<T> EncodeLike<Rc<T>> for T
where T: Encode,

source§

impl<S> FullCodec for S
where S: Decode + FullEncode,

source§

impl<S> FullEncode for S
where S: Encode + EncodeLike,

source§

impl<T> JsonSchemaMaybe for T

source§

impl<T> MaybeDebug for T
where T: Debug,

source§

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

source§

impl<T> Member for T
where T: Send + Sync + Debug + Eq + PartialEq + Clone + 'static,

source§

impl<T> Parameter for T
where T: Codec + EncodeLike + Clone + Eq + Debug + TypeInfo,

source§

impl<T> StaticTypeInfo for T
where T: TypeInfo + 'static,