Struct Persistent

Source
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 implementing Routines parameterized 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>
where Context: Config + Clone, Value: Portable + Clone, Routine: Routines<BlockNumberFor<Context>> + Clone,

Source§

fn clone(&self) -> Persistent<Context, Value, Routine>

Returns a duplicate 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<Context, Value, Routine> Debug for Persistent<Context, Value, Routine>
where Context: Config + Debug, Value: Portable + Debug, Routine: Routines<BlockNumberFor<Context>> + Debug,

Source§

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

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

impl<Context, Value, Routine> Default for Persistent<Context, Value, Routine>
where Context: Config + Default, Value: Portable + Default, Routine: Routines<BlockNumberFor<Context>> + Default,

Source§

fn default() -> Persistent<Context, Value, Routine>

Returns the “default value” for a type. Read more
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.

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§

type Key = [u8]

Keys are raw byte slices; allows flexible usage for any encoded identifier.

Source§

type Value = Value

Value type implementing [Encode] and [Decode]

Source§

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>

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>

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>
where F: FnOnce(Result<Option<Value>, Self::Logger>) -> Result<Value, 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.

Source§

impl<Context, Value, Routine> Copy for Persistent<Context, Value, Routine>
where Context: Config + Copy, Value: Portable + Copy, Routine: Routines<BlockNumberFor<Context>> + Copy,

Source§

impl<Context, Value, Routine> SubstrateOffchainStorage for Persistent<Context, Value, Routine>
where Context: Config, Value: Portable, Routine: Routines<BlockNumberFor<Context>>,

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>
where Value: RefUnwindSafe, Context: RefUnwindSafe, Routine: RefUnwindSafe,

§

impl<Context, Value, Routine> Send for Persistent<Context, Value, Routine>
where Value: Send, Context: Send, Routine: Send,

§

impl<Context, Value, Routine> Sync for Persistent<Context, Value, Routine>
where Value: Sync, Context: Sync, Routine: Sync,

§

impl<Context, Value, Routine> Unpin for Persistent<Context, Value, Routine>
where Value: Unpin, Context: Unpin, Routine: Unpin,

§

impl<Context, Value, Routine> UnwindSafe for Persistent<Context, Value, Routine>
where Value: UnwindSafe, Context: UnwindSafe, Routine: 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
§

impl<T> CheckedConversion for T

§

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
§

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

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

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

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

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
§

impl<T, U> IntoKey<U> for T
where U: FromKey<T>,

§

fn into_key(self) -> U

Source§

impl<T, U, Tag> IntoTag<U, Tag> for T
where U: FromTag<T, Tag>, Tag: DiscriminantTag,

Source§

fn into_tag(self) -> U

§

impl<Src, Dest> IntoTuple<Dest> for Src
where Dest: FromTuple<Src>,

§

fn into_tuple(self) -> Dest

§

impl<T> IsType<T> for T

§

fn from_ref(t: &T) -> &T

Cast reference.
§

fn into_ref(&self) -> &T

Cast reference.
§

fn from_mut(t: &mut T) -> &mut T

Cast mutable reference.
§

fn into_mut(&mut self) -> &mut T

Cast mutable reference.
§

impl<T, Outer> IsWrappedBy<Outer> for T
where Outer: AsRef<T> + AsMut<T> + From<T>, T: From<Outer>,

§

fn from_ref(outer: &Outer) -> &T

Get a reference to the inner from the outer.

§

fn from_mut(outer: &mut Outer) -> &mut T

Get a mutable reference to the inner from the outer.

Source§

impl<T, Time> Logging<Time> for T
where Time: Time,

Source§

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

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

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

Core logging function that all helpers delegate to. Read more
Source§

fn info( err: &Self::Logger, timestamp: Timestamp, target: Option<&str>, fmt: Option<LogFormatter<Timestamp, Self::Level>>, ) -> Self::Logger
where Self: Sized,

Logs an info-level message. Read more
Source§

fn warn( err: &Self::Logger, timestamp: Timestamp, target: Option<&str>, fmt: Option<LogFormatter<Timestamp, Self::Level>>, ) -> Self::Logger
where Self: Sized,

Logs a warning-level message. Read more
Source§

fn error( err: &Self::Logger, timestamp: Timestamp, target: Option<&str>, fmt: Option<LogFormatter<Timestamp, Self::Level>>, ) -> Self::Logger
where Self: Sized,

Logs an error-level message. Read more
Source§

fn debug( err: &Self::Logger, timestamp: Timestamp, target: Option<&str>, fmt: Option<LogFormatter<Timestamp, Self::Level>>, ) -> Self::Logger
where Self: Sized,

Logs a debug-level message. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> SaturatedConversion for T

§

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
§

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,

Source§

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

Source§

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

Source§

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

impl<T, U> TryIntoKey<U> for T
where 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 S
where T: UncheckedFrom<S>,

§

fn unchecked_into(self) -> T

The counterpart to unchecked_from.
§

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

§

fn unique_saturated_into(self) -> T

Consume self to return an equivalent value of T.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
Source§

impl<Provider, Discriminant, T> DelegateVirtualDynBound<Provider, Discriminant> for T
where Provider: VirtualDynBound<Discriminant>, Discriminant: DiscriminantTag,

Source§

impl<Provider, Discriminant, T> DelegateVirtualStaticBound<Provider, Discriminant> for T
where Provider: VirtualStaticBound<Discriminant>, Discriminant: DiscriminantTag,

§

impl<T> JsonSchemaMaybe for T

§

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

§

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