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 extension implicit 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 implicit or not. Mode 0
means that
the metadata hash is not added and thus, None
is added to the implicit. Mode 1
means that
the metadata hash is added and thus, Some(metadata_hash)
is added to the implicit. 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>
impl<T> CheckMetadataHash<T>
Trait Implementations§
Source§impl<T: Clone> Clone for CheckMetadataHash<T>
impl<T: Clone> Clone for CheckMetadataHash<T>
Source§fn clone(&self) -> CheckMetadataHash<T>
fn clone(&self) -> CheckMetadataHash<T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<T> Debug for CheckMetadataHash<T>
impl<T> Debug for CheckMetadataHash<T>
Source§impl<T> Decode for CheckMetadataHash<T>where
PhantomData<T>: Decode,
impl<T> Decode for CheckMetadataHash<T>where
PhantomData<T>: Decode,
Source§fn decode<__CodecInputEdqy: Input>(
__codec_input_edqy: &mut __CodecInputEdqy,
) -> Result<Self, Error>
fn decode<__CodecInputEdqy: Input>( __codec_input_edqy: &mut __CodecInputEdqy, ) -> Result<Self, Error>
Source§fn decode_into<I>(
input: &mut I,
dst: &mut MaybeUninit<Self>,
) -> Result<DecodeFinished, Error>where
I: Input,
fn decode_into<I>(
input: &mut I,
dst: &mut MaybeUninit<Self>,
) -> Result<DecodeFinished, Error>where
I: Input,
Source§impl<T> Encode for CheckMetadataHash<T>where
PhantomData<T>: Encode,
impl<T> Encode for CheckMetadataHash<T>where
PhantomData<T>: Encode,
Source§fn size_hint(&self) -> usize
fn size_hint(&self) -> usize
Source§fn encode_to<__CodecOutputEdqy: Output + ?Sized>(
&self,
__codec_dest_edqy: &mut __CodecOutputEdqy,
)
fn encode_to<__CodecOutputEdqy: Output + ?Sized>( &self, __codec_dest_edqy: &mut __CodecOutputEdqy, )
Source§fn using_encoded<R, F>(&self, f: F) -> R
fn using_encoded<R, F>(&self, f: F) -> R
Source§fn encoded_size(&self) -> usize
fn encoded_size(&self) -> usize
Source§impl<T: PartialEq> PartialEq for CheckMetadataHash<T>
impl<T: PartialEq> PartialEq for CheckMetadataHash<T>
Source§impl<T: Config + Send + Sync> TransactionExtension<<T as Config>::RuntimeCall> for CheckMetadataHash<T>
impl<T: Config + Send + Sync> TransactionExtension<<T as Config>::RuntimeCall> for CheckMetadataHash<T>
Source§const IDENTIFIER: &'static str = "CheckMetadataHash"
const IDENTIFIER: &'static str = "CheckMetadataHash"
Source§type Implicit = Option<[u8; 32]>
type Implicit = Option<[u8; 32]>
implicit
function and not directly contained in the
transaction itself and therefore is considered “implicit”.Source§type Pre = ()
type Pre = ()
prepare
to post_dispatch
.Source§fn implicit(&self) -> Result<Self::Implicit, TransactionValidityError>
fn implicit(&self) -> Result<Self::Implicit, TransactionValidityError>
Source§fn weight(&self, _: &T::RuntimeCall) -> Weight
fn weight(&self, _: &T::RuntimeCall) -> Weight
Source§fn validate(
&self,
origin: DispatchOriginOf<T::RuntimeCall>,
_call: &T::RuntimeCall,
_info: &DispatchInfoOf<T::RuntimeCall>,
_len: usize,
_self_implicit: Self::Implicit,
_inherited_implication: &impl Encode,
_source: TransactionSource,
) -> ValidateResult<Self::Val, T::RuntimeCall>
fn validate( &self, origin: DispatchOriginOf<T::RuntimeCall>, _call: &T::RuntimeCall, _info: &DispatchInfoOf<T::RuntimeCall>, _len: usize, _self_implicit: Self::Implicit, _inherited_implication: &impl Encode, _source: TransactionSource, ) -> ValidateResult<Self::Val, T::RuntimeCall>
Source§fn prepare(
self,
_val: Self::Val,
_origin: &DispatchOriginOf<T::RuntimeCall>,
_call: &T::RuntimeCall,
_info: &DispatchInfoOf<T::RuntimeCall>,
_len: usize,
) -> Result<Self::Pre, TransactionValidityError>
fn prepare( self, _val: Self::Val, _origin: &DispatchOriginOf<T::RuntimeCall>, _call: &T::RuntimeCall, _info: &DispatchInfoOf<T::RuntimeCall>, _len: usize, ) -> Result<Self::Pre, TransactionValidityError>
Source§fn metadata() -> Vec<TransactionExtensionMetadata>
fn metadata() -> Vec<TransactionExtensionMetadata>
Source§fn post_dispatch_details(
_pre: Self::Pre,
_info: &<Call as Dispatchable>::Info,
_post_info: &<Call as Dispatchable>::PostInfo,
_len: usize,
_result: &Result<(), DispatchError>,
) -> Result<Weight, TransactionValidityError>
fn post_dispatch_details( _pre: Self::Pre, _info: &<Call as Dispatchable>::Info, _post_info: &<Call as Dispatchable>::PostInfo, _len: usize, _result: &Result<(), DispatchError>, ) -> Result<Weight, TransactionValidityError>
Source§fn post_dispatch(
pre: Self::Pre,
info: &<Call as Dispatchable>::Info,
post_info: &mut <Call as Dispatchable>::PostInfo,
len: usize,
result: &Result<(), DispatchError>,
) -> Result<(), TransactionValidityError>
fn post_dispatch( pre: Self::Pre, info: &<Call as Dispatchable>::Info, post_info: &mut <Call as Dispatchable>::PostInfo, len: usize, result: &Result<(), DispatchError>, ) -> Result<(), TransactionValidityError>
post_dispatch_details
that
refunds the unspent weight consumed by this extension into the post dispatch information. Read moreSource§fn bare_validate(
_call: &Call,
_info: &<Call as Dispatchable>::Info,
_len: usize,
) -> Result<ValidTransaction, TransactionValidityError>
fn bare_validate( _call: &Call, _info: &<Call as Dispatchable>::Info, _len: usize, ) -> Result<ValidTransaction, TransactionValidityError>
Source§fn bare_validate_and_prepare(
_call: &Call,
_info: &<Call as Dispatchable>::Info,
_len: usize,
) -> Result<(), TransactionValidityError>
fn bare_validate_and_prepare( _call: &Call, _info: &<Call as Dispatchable>::Info, _len: usize, ) -> Result<(), TransactionValidityError>
Source§fn bare_post_dispatch(
_info: &<Call as Dispatchable>::Info,
_post_info: &mut <Call as Dispatchable>::PostInfo,
_len: usize,
_result: &Result<(), DispatchError>,
) -> Result<(), TransactionValidityError>
fn bare_post_dispatch( _info: &<Call as Dispatchable>::Info, _post_info: &mut <Call as Dispatchable>::PostInfo, _len: usize, _result: &Result<(), DispatchError>, ) -> Result<(), TransactionValidityError>
Source§impl<T> TypeInfo for CheckMetadataHash<T>where
PhantomData<T>: TypeInfo + 'static,
T: 'static,
impl<T> TypeInfo for CheckMetadataHash<T>where
PhantomData<T>: TypeInfo + 'static,
T: 'static,
impl<T> DecodeWithMemTracking for CheckMetadataHash<T>where
PhantomData<T>: DecodeWithMemTracking,
impl<T> EncodeLike for CheckMetadataHash<T>where
PhantomData<T>: Encode,
impl<T: Eq> Eq for CheckMetadataHash<T>
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> 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<T> CheckedConversion for T
impl<T> CheckedConversion for T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> DecodeLimit for Twhere
T: Decode,
impl<T> DecodeLimit for Twhere
T: Decode,
Source§impl<T> DecodeWithMemLimit for Twhere
T: DecodeWithMemTracking,
impl<T> DecodeWithMemLimit for Twhere
T: DecodeWithMemTracking,
Source§impl<T, Call> DispatchTransaction<Call> for Twhere
T: TransactionExtension<Call>,
Call: Dispatchable + Encode,
<Call as Dispatchable>::RuntimeOrigin: AsTransactionAuthorizedOrigin,
impl<T, Call> DispatchTransaction<Call> for Twhere
T: TransactionExtension<Call>,
Call: Dispatchable + Encode,
<Call as Dispatchable>::RuntimeOrigin: AsTransactionAuthorizedOrigin,
Source§type Origin = <Call as Dispatchable>::RuntimeOrigin
type Origin = <Call as Dispatchable>::RuntimeOrigin
Source§type Info = <Call as Dispatchable>::Info
type Info = <Call as Dispatchable>::Info
Source§type Result = Result<Result<<Call as Dispatchable>::PostInfo, DispatchErrorWithPostInfo<<Call as Dispatchable>::PostInfo>>, TransactionValidityError>
type Result = Result<Result<<Call as Dispatchable>::PostInfo, DispatchErrorWithPostInfo<<Call as Dispatchable>::PostInfo>>, TransactionValidityError>
Source§type Val = <T as TransactionExtension<Call>>::Val
type Val = <T as TransactionExtension<Call>>::Val
Val
of the extension.Source§type Pre = <T as TransactionExtension<Call>>::Pre
type Pre = <T as TransactionExtension<Call>>::Pre
Pre
of the extension.Source§fn validate_only(
&self,
origin: <T as DispatchTransaction<Call>>::Origin,
call: &Call,
info: &<Call as Dispatchable>::Info,
len: usize,
source: TransactionSource,
extension_version: u8,
) -> Result<(ValidTransaction, <T as TransactionExtension<Call>>::Val, <T as DispatchTransaction<Call>>::Origin), TransactionValidityError>
fn validate_only( &self, origin: <T as DispatchTransaction<Call>>::Origin, call: &Call, info: &<Call as Dispatchable>::Info, len: usize, source: TransactionSource, extension_version: u8, ) -> Result<(ValidTransaction, <T as TransactionExtension<Call>>::Val, <T as DispatchTransaction<Call>>::Origin), TransactionValidityError>
Source§fn validate_and_prepare(
self,
origin: <T as DispatchTransaction<Call>>::Origin,
call: &Call,
info: &<Call as Dispatchable>::Info,
len: usize,
extension_version: u8,
) -> Result<(<T as TransactionExtension<Call>>::Pre, <T as DispatchTransaction<Call>>::Origin), TransactionValidityError>
fn validate_and_prepare( self, origin: <T as DispatchTransaction<Call>>::Origin, call: &Call, info: &<Call as Dispatchable>::Info, len: usize, extension_version: u8, ) -> Result<(<T as TransactionExtension<Call>>::Pre, <T as DispatchTransaction<Call>>::Origin), TransactionValidityError>
Source§fn dispatch_transaction(
self,
origin: <Call as Dispatchable>::RuntimeOrigin,
call: Call,
info: &<Call as Dispatchable>::Info,
len: usize,
extension_version: u8,
) -> <T as DispatchTransaction<Call>>::Result
fn dispatch_transaction( self, origin: <Call as Dispatchable>::RuntimeOrigin, call: Call, info: &<Call as Dispatchable>::Info, len: usize, extension_version: u8, ) -> <T as DispatchTransaction<Call>>::Result
Source§fn test_run(
self,
origin: <T as DispatchTransaction<Call>>::Origin,
call: &Call,
info: &<T as DispatchTransaction<Call>>::Info,
len: usize,
extension_version: u8,
substitute: impl FnOnce(<T as DispatchTransaction<Call>>::Origin) -> Result<<Call as Dispatchable>::PostInfo, DispatchErrorWithPostInfo<<Call as Dispatchable>::PostInfo>>,
) -> <T as DispatchTransaction<Call>>::Result
fn test_run( self, origin: <T as DispatchTransaction<Call>>::Origin, call: &Call, info: &<T as DispatchTransaction<Call>>::Info, len: usize, extension_version: u8, substitute: impl FnOnce(<T as DispatchTransaction<Call>>::Origin) -> Result<<Call as Dispatchable>::PostInfo, DispatchErrorWithPostInfo<<Call as Dispatchable>::PostInfo>>, ) -> <T as DispatchTransaction<Call>>::Result
substitute
instead. Since this doesn’t actually
dispatch the call, it doesn’t need to consume it and so call
can be passed as a reference.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
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<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
impl<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
fn into_tuple(self) -> Dest
Source§impl<T, Outer> IsWrappedBy<Outer> for T
impl<T, Outer> IsWrappedBy<Outer> for T
Source§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
Source§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
Source§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T
. Read moreSource§impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
type Error = <U as TryFromKey<T>>::Error
fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>
Source§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
Source§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from
.Source§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
Source§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T
.