pub struct Persistent<Context, Value, Routine>(PhantomData<(Value, Context, Routine)>)
where
Context: Config,
Value: Portable,
Routine: Routines<BlockNumberFor<Context>>;Expand description
Marker type for persistent offchain storage, providing fork-independent, non-reverting state with routine-defined error and logging semantics.
Intended for Substrate FRAME-based runtimes only.
Persistent offchain storage is not fork-aware:
- Values persist across block re-organizations.
- Values are shared across all forks.
- Values are not reverted if the current fork is abandoned.
This marker is used to specialize KeyValueStore implementations
backed by [StorageValueRef::persistent].
§Error policy requirement
When KeyValueStore is used for this type, the corresponding
Routine must also implement OffchainStorageError for the
same specialized Persistent<Context, Value, Routine> type.
This ensures that:
- storage-level failures are surfaced as caller-defined errors,
- errors are attributed to the routine’s domain rather than the storage layer,
- and each failure is logged exactly once.
§Timestamp semantics
This storage backend is explicitly bound to block numbers as its timestamp source. It does not accept a generic timestamp parameter.
All logging and routine behavior associated with this backend uses
[BlockNumberFor], reflecting its intended use inside
FRAME-based runtimes.
§Type parameters
Context: The active runtime type (i.e. a type implementing [frame_system::Config]). This binds the storage to a specific runtime configuration.Value: The value type stored in persistent offchain storage.Routine: A routine type implementingRoutinesparameterized by [BlockNumberFor], ensuring logging, error handling, and behavior are specialized to block-based execution.
This type is a marker only and carries no runtime data.
Tuple Fields§
§0: PhantomData<(Value, Context, Routine)>Trait Implementations§
Source§impl<Context, Value, Routine> Clone for Persistent<Context, Value, Routine>
impl<Context, Value, Routine> Clone for Persistent<Context, Value, Routine>
Source§fn clone(&self) -> Persistent<Context, Value, Routine>
fn clone(&self) -> Persistent<Context, Value, Routine>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<Context, Value, Routine> Debug for Persistent<Context, Value, Routine>
impl<Context, Value, Routine> Debug for Persistent<Context, Value, Routine>
Source§impl<Context, Value, Routine> Default for Persistent<Context, Value, Routine>
impl<Context, Value, Routine> Default for Persistent<Context, Value, Routine>
Source§fn default() -> Persistent<Context, Value, Routine>
fn default() -> Persistent<Context, Value, Routine>
Source§impl<T, Value, Routine> KeyValueStore<Value, <<<T as Config>::Block as HeaderProvider>::HeaderT as Header>::Number> for Persistent<T, Value, Routine>where
T: Config,
Value: Portable,
Routine: OffchainStorageError<Self> + Routines<BlockNumberFor<T>>,
Peristent Offchain Storage Kind/Backend Default KeyValueStore
Implementation.
impl<T, Value, Routine> KeyValueStore<Value, <<<T as Config>::Block as HeaderProvider>::HeaderT as Header>::Number> for Persistent<T, Value, Routine>where
T: Config,
Value: Portable,
Routine: OffchainStorageError<Self> + Routines<BlockNumberFor<T>>,
Peristent Offchain Storage Kind/Backend Default KeyValueStore
Implementation.
Intended for Substrate FRAME-based runtimes only.
The timestamp type is the runtime’s block number ([BlockNumberFor]),
ensuring that all logs are tagged with the block context in which
the operation occurred.
Source§fn insert(
key: &Self::Key,
value: &Value,
_target: Option<&str>,
_fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>,
) -> Result<(), Self::Logger>
fn insert( key: &Self::Key, value: &Value, _target: Option<&str>, _fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>, ) -> Result<(), Self::Logger>
This writes directly to persistent offchain storage and is therefore not reverted on chain re-orgs.
Source§fn get(
key: &Self::Key,
target: Option<&str>,
fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>,
) -> Result<Option<Value>, Self::Logger>
fn get( key: &Self::Key, target: Option<&str>, fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>, ) -> Result<Option<Value>, Self::Logger>
Reads from persistent offchain storage, which is shared across forks and survives re-orgs.
Source§fn remove(
key: &Self::Key,
target: Option<&str>,
fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>,
) -> Result<Option<Value>, Self::Logger>
fn remove( key: &Self::Key, target: Option<&str>, fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>, ) -> Result<Option<Value>, Self::Logger>
Removes the value from persistent offchain storage.
Since persistent storage is not fork-aware, removals are permanent and are not reverted on chain re-orgs.
Source§fn mutate<F>(
key: &Self::Key,
f: F,
target: Option<&str>,
fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>,
) -> Result<(), Self::Logger>
fn mutate<F>( key: &Self::Key, f: F, target: Option<&str>, fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>, ) -> Result<(), Self::Logger>
Mutates the value associated with the given key in persistent offchain storage.
The closure is invoked with the current value, if any, and must return the new value to store. Removal is not supported by this method.
Persistent storage is not fork-aware: mutations persist across re-orgs and are visible on all forks.
impl<Context, Value, Routine> Copy for Persistent<Context, Value, Routine>
impl<Context, Value, Routine> SubstrateOffchainStorage for Persistent<Context, Value, Routine>
Default backend marker implementation for all valid Persistent specializations.
This blanket implementation marks every well-formed Persistent<Context, Value, Routine>
type as a supported Substrate offchain storage backend.
Auto Trait Implementations§
impl<Context, Value, Routine> Freeze for Persistent<Context, Value, Routine>
impl<Context, Value, Routine> RefUnwindSafe for Persistent<Context, Value, Routine>
impl<Context, Value, Routine> Send for Persistent<Context, Value, Routine>
impl<Context, Value, Routine> Sync for Persistent<Context, Value, Routine>
impl<Context, Value, Routine> Unpin for Persistent<Context, Value, Routine>
impl<Context, Value, Routine> UnwindSafe for Persistent<Context, Value, Routine>
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> 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
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.