pub struct KeySeedFor<Id, Item, Salt, Hash, T> {
target: Id,
item: Item,
salt: Salt,
_hash: PhantomData<Hash>,
_marker: PhantomData<T>,
}Expand description
A seed structure for deterministic identifier derivation.
KeySeedFor enables the generation of a unique, deterministic identifier (Id)
from a combination of:
- a target key type (
Id) - a meta-data value (
Item) - a unique salt (
Salt)
within the context of a specific runtime (T) and hashing algorithm (Hash).
§Overview
This struct serves as the canonical pre-image for generating new deterministic
IDs, based on a source identity (target), a value of interest (item), and a
unique salt.
§Type Parameters
Item: The value associated with the derived identifier. May be low entropy or even default.Id: The identifier type, used both as the source (key) and the derived output (target).Salt: A unique value to ensure uniqueness per(Id, Item)pair.Hash: The hashing algorithm used for deterministic ID derivation.T: The runtime context.
§Constraints & Responsibilities
target(Id): Must be a high-entropy, globally unique identifier (e.g., account ID, hash, public key).item(Item): May be low-entropy; a singleIdcan be associated with multipleItemtypes, but eachItemtype must be uniquely tied to a singleIdtype.salt: Must be unique per(Id, Item)pair; implementers must ensure salts are not reused.
§Example Use Cases
- Sub-identities derived from a parent identity
- Capability delegation
- Namespaced object IDs
- Resource handles scoped to specific keys
Fields§
§target: Id§item: Item§salt: Salt§_hash: PhantomData<Hash>§_marker: PhantomData<T>Implementations§
Source§impl<Id, Item, Salt, Hasher, T> KeySeedFor<Id, Item, Salt, Hasher, T>
Implementation of utility methods for KeySeedFor.
impl<Id, Item, Salt, Hasher, T> KeySeedFor<Id, Item, Salt, Hasher, T>
Implementation of utility methods for KeySeedFor.
Sourcepub fn mut_target(&mut self) -> &mut Id
pub fn mut_target(&mut self) -> &mut Id
Provides mutable access to the target key.
Trait Implementations§
Source§impl<Id: Clone, Item: Clone, Salt: Clone, Hash: Clone, T: Clone> Clone for KeySeedFor<Id, Item, Salt, Hash, T>
impl<Id: Clone, Item: Clone, Salt: Clone, Hash: Clone, T: Clone> Clone for KeySeedFor<Id, Item, Salt, Hash, T>
Source§fn clone(&self) -> KeySeedFor<Id, Item, Salt, Hash, T>
fn clone(&self) -> KeySeedFor<Id, Item, Salt, Hash, T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<Id, Item, Salt, Hash, T> Debug for KeySeedFor<Id, Item, Salt, Hash, T>
impl<Id, Item, Salt, Hash, T> Debug for KeySeedFor<Id, Item, Salt, Hash, T>
Source§impl<Id, Item, Salt, Hash, T> Decode for KeySeedFor<Id, Item, Salt, Hash, T>
impl<Id, Item, Salt, Hash, T> Decode for KeySeedFor<Id, Item, Salt, Hash, T>
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>
§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,
§fn skip<I>(input: &mut I) -> Result<(), Error>where
I: Input,
fn skip<I>(input: &mut I) -> Result<(), Error>where
I: Input,
§fn encoded_fixed_size() -> Option<usize>
fn encoded_fixed_size() -> Option<usize>
Source§impl<Id, Item, Salt, Hash, T> Encode for KeySeedFor<Id, Item, Salt, Hash, T>where
Id: Encode,
Item: Encode,
Salt: Encode,
impl<Id, Item, Salt, Hash, T> Encode for KeySeedFor<Id, Item, Salt, Hash, T>where
Id: Encode,
Item: Encode,
Salt: 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, )
§fn using_encoded<R, F>(&self, f: F) -> R
fn using_encoded<R, F>(&self, f: F) -> R
§fn encoded_size(&self) -> usize
fn encoded_size(&self) -> usize
Source§impl<Id, Item, Salt, Hasher, T> KeyGenFor<Id, Item, Salt, Hasher, T> for KeySeedFor<Id, Item, Salt, Hasher, T>
Blanket implementation of KeyGenFor for KeySeedFor.
impl<Id, Item, Salt, Hasher, T> KeyGenFor<Id, Item, Salt, Hasher, T> for KeySeedFor<Id, Item, Salt, Hasher, T>
Blanket implementation of KeyGenFor for KeySeedFor.
This allows any KeySeedFor instance to use the gen_key utility
Source§impl<Id, Item, Salt, Hash, T> MaxEncodedLen for KeySeedFor<Id, Item, Salt, Hash, T>where
Id: MaxEncodedLen,
Item: MaxEncodedLen,
Salt: MaxEncodedLen,
impl<Id, Item, Salt, Hash, T> MaxEncodedLen for KeySeedFor<Id, Item, Salt, Hash, T>where
Id: MaxEncodedLen,
Item: MaxEncodedLen,
Salt: MaxEncodedLen,
Source§fn max_encoded_len() -> usize
fn max_encoded_len() -> usize
Source§impl<Id: PartialEq, Item: PartialEq, Salt: PartialEq, Hash: PartialEq, T: PartialEq> PartialEq for KeySeedFor<Id, Item, Salt, Hash, T>
impl<Id: PartialEq, Item: PartialEq, Salt: PartialEq, Hash: PartialEq, T: PartialEq> PartialEq for KeySeedFor<Id, Item, Salt, Hash, T>
Source§fn eq(&self, other: &KeySeedFor<Id, Item, Salt, Hash, T>) -> bool
fn eq(&self, other: &KeySeedFor<Id, Item, Salt, Hash, T>) -> bool
self and other values to be equal, and is used by ==.Source§impl<Id, Item, Salt, Hash, T> TypeInfo for KeySeedFor<Id, Item, Salt, Hash, T>where
Id: TypeInfo + 'static,
Item: TypeInfo + 'static,
Salt: TypeInfo + 'static,
PhantomData<Hash>: TypeInfo + 'static,
PhantomData<T>: TypeInfo + 'static,
Hash: TypeInfo + 'static,
T: 'static,
impl<Id, Item, Salt, Hash, T> TypeInfo for KeySeedFor<Id, Item, Salt, Hash, T>where
Id: TypeInfo + 'static,
Item: TypeInfo + 'static,
Salt: TypeInfo + 'static,
PhantomData<Hash>: TypeInfo + 'static,
PhantomData<T>: TypeInfo + 'static,
Hash: TypeInfo + 'static,
T: 'static,
impl<Id, Item, Salt, Hash, T> EncodeLike for KeySeedFor<Id, Item, Salt, Hash, T>where
Id: Encode,
Item: Encode,
Salt: Encode,
impl<Id: Eq, Item: Eq, Salt: Eq, Hash: Eq, T: Eq> Eq for KeySeedFor<Id, Item, Salt, Hash, T>
impl<Id, Item, Salt, Hash, T> StructuralPartialEq for KeySeedFor<Id, Item, Salt, Hash, T>
Auto Trait Implementations§
impl<Id, Item, Salt, Hash, T> Freeze for KeySeedFor<Id, Item, Salt, Hash, T>
impl<Id, Item, Salt, Hash, T> RefUnwindSafe for KeySeedFor<Id, Item, Salt, Hash, T>where
Id: RefUnwindSafe,
Item: RefUnwindSafe,
Salt: RefUnwindSafe,
Hash: RefUnwindSafe,
T: RefUnwindSafe,
impl<Id, Item, Salt, Hash, T> Send for KeySeedFor<Id, Item, Salt, Hash, T>
impl<Id, Item, Salt, Hash, T> Sync for KeySeedFor<Id, Item, Salt, Hash, T>
impl<Id, Item, Salt, Hash, T> Unpin for KeySeedFor<Id, Item, Salt, Hash, T>
impl<Id, Item, Salt, Hash, T> UnwindSafe for KeySeedFor<Id, Item, Salt, Hash, T>
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
§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
§fn checked_from<T>(t: T) -> Option<Self>where
Self: TryFrom<T>,
fn checked_from<T>(t: T) -> Option<Self>where
Self: TryFrom<T>,
§fn checked_into<T>(self) -> Option<T>where
Self: TryInto<T>,
fn checked_into<T>(self) -> Option<T>where
Self: TryInto<T>,
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> DecodeAll for Twhere
T: Decode,
impl<T> DecodeAll for Twhere
T: Decode,
§fn decode_all(input: &mut &[u8]) -> Result<T, Error>
fn decode_all(input: &mut &[u8]) -> Result<T, Error>
Self and consume all of the given input data. Read more§impl<T> DecodeLimit for Twhere
T: Decode,
impl<T> DecodeLimit for Twhere
T: Decode,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> Hashable for Twhere
T: Codec,
impl<T> Hashable for Twhere
T: Codec,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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<T, U, Tag> IntoTag<U, Tag> for Twhere
U: FromTag<T, Tag>,
Tag: DiscriminantTag,
impl<T, U, Tag> IntoTag<U, Tag> for Twhere
U: FromTag<T, Tag>,
Tag: DiscriminantTag,
§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
§impl<T> IsType<T> for T
impl<T> IsType<T> for T
§impl<T, Outer> IsWrappedBy<Outer> for T
impl<T, Outer> IsWrappedBy<Outer> for T
§impl<T> KeyedVec for Twhere
T: Codec,
impl<T> KeyedVec for Twhere
T: Codec,
Source§impl<T, Time> Logging<Time> for Twhere
Time: Time,
impl<T, Time> Logging<Time> for Twhere
Time: Time,
Source§const FALLBACK_TARGET: &'static str = const FALLBACK_TARGET: &'_ str = "routine";
const FALLBACK_TARGET: &'static str = const FALLBACK_TARGET: &'_ str = "routine";
Default logging target if none is provided.
Most routines, especially offchain workers or background tasks, use this target for simplicity.
It allows a consistent place to look for routine logs without requiring every call to specify a target.
Note: This target is only a conveninence and may be somewhat vague. To ensure errors can still be traced accurately, the logged messages should include additional metadata (e.g., module name, error index, or contextual info) so that the source of the error can be identified even if the target is generic.
Source§type Logger = DispatchError
type Logger = DispatchError
The type taken and returned for logging.
We simply return the same [DispatchError] that was logged,
so logging does not change control flow or error propagation.
DispatchError is used because in Substrate it encompasses all
runtime errors - including module errors, token errors, arithmetic
issues, and transactional boundaries - making it the universal
substrate-side error representation.
Source§type Level = LogLevel
type Level = LogLevel
The log level type.
We use the LogLevel enum to standardize severity levels
(Info, Warn, Error, Debug) across all routine logs.
Source§fn log(
level: <T as Logging<Time>>::Level,
err: &<T as Logging<Time>>::Logger,
timestamp: Time,
target: Option<&str>,
fmt: Option<fn(Time, &<T as Logging<Time>>::Level, &str, &str) -> String>,
) -> <T as Logging<Time>>::Logger
fn log( level: <T as Logging<Time>>::Level, err: &<T as Logging<Time>>::Logger, timestamp: Time, target: Option<&str>, fmt: Option<fn(Time, &<T as Logging<Time>>::Level, &str, &str) -> String>, ) -> <T as Logging<Time>>::Logger
Source§fn info(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<LogFormatter<Timestamp, Self::Level>>,
) -> Self::Loggerwhere
Self: Sized,
fn info(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<LogFormatter<Timestamp, Self::Level>>,
) -> Self::Loggerwhere
Self: Sized,
Source§fn warn(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<LogFormatter<Timestamp, Self::Level>>,
) -> Self::Loggerwhere
Self: Sized,
fn warn(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<LogFormatter<Timestamp, Self::Level>>,
) -> Self::Loggerwhere
Self: Sized,
§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T. Read more§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>
§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from.§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T.