Struct Finalized

Source
pub struct Finalized<Context, Value, Routine, Handler>(PhantomData<(Value, Context, Routine, Handler)>)
where
    Context: Config,
    Value: Portable,
    Routine: Routines<BlockNumberFor<Context>>,
    Handler: ForksHandler<Context, ForkLocalDepot>;
Expand description

Marker type for finality-aware offchain storage, combining fork-aware and persistent state to derive confidence-graded values via routine-defined policies and observations.

Intended for Substrate FRAME-based runtimes only.

The Finalized storage model:

  • records values speculatively using fork-aware storage,
  • tracks historical observations in persistent storage,
  • and exposes values only after evaluating time and observation-based finality guarantees.

Finality is determined by:

  • a wall-clock time window (see FinalizedPolicy),
  • and repeated successful observations.

This marker is used to specialize KeyValueStore implementations that combine ForkAware and Persistent storage to provide confidence-graded values (see Confidence).

§Behavioral contract

Any routine using Finalized storage must provide error policies for the exact internal storage forms used by this model via OffchainStorageError:

In addition, the routine must define:

Together, these requirements ensure that:

  • fork-aware and persistent state remain consistent,
  • semantic invariants are enforced at a single, centralized layer,
  • and all failures are surfaced as caller-defined error signals and logged exactly once.

§Value-first semantics

This storage model is value-first: confidence is tied to the observed value, not just the key. If the same value is inserted again for the same key, its accumulated confidence is reset, as the insertion is treated as a fresh observation sequence.

Callers are therefore responsible for deciding whether repeated insertions of the same value are semantically meaningful. To avoid unintended confidence resets, routines should refrain from inserting identical values multiple times unless a reset is explicitly desired.

§Timestamp semantics

All logging and routine behavior associated with this storage model is explicitly bound to block numbers via [BlockNumberFor<Context>]. This type does not accept a generic timestamp parameter.

Wall-clock time, when required for finality evaluation, is obtained explicitly from [pallet_timestamp].

§Type parameters

  • Context: The active runtime type (i.e. a type implementing [frame_system::Config]). This binds the storage model to a specific runtime configuration.
  • Value: The value type whose finality is being tracked.
  • Routine: A routine type implementing Routines parameterized by [BlockNumberFor<Context>], allowing logging, error handling, policy evaluation, and invariant enforcement to be specialized at the type level.
  • Handler: A type implementing ForksHandler using ForkLocalDepot that manages the fork graph and scope tracking for this storage backend.

This type is a marker only and carries no runtime data.

Tuple Fields§

§0: PhantomData<(Value, Context, Routine, Handler)>

Trait Implementations§

Source§

impl<Context, Value, Routine, Handler> Clone for Finalized<Context, Value, Routine, Handler>
where Context: Config + Clone, Value: Portable + Clone, Routine: Routines<BlockNumberFor<Context>> + Clone, Handler: ForksHandler<Context, ForkLocalDepot> + Clone,

Source§

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

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, Handler> Debug for Finalized<Context, Value, Routine, Handler>
where Context: Config + Debug, Value: Portable + Debug, Routine: Routines<BlockNumberFor<Context>> + Debug, Handler: ForksHandler<Context, ForkLocalDepot> + Debug,

Source§

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

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

impl<T, Value, Routine, Handler> KeyValueStore<Value, <<<T as Config>::Block as HeaderProvider>::HeaderT as Header>::Number> for Finalized<T, Value, Routine, Handler>
where T: Config, Value: Portable, Routine: FinalizedOffchainStorageError<T, Value> + FinalizedPolicy<T> + OffchainStorageError<Persistent<T, Ledger<T, Value>, Routine>> + OffchainStorageError<ForkAware<T, ValueHash, Routine, Handler>> + Routines<BlockNumberFor<T>>, Handler: ForksHandler<T, ForkLocalDepot> + Logging<BlockNumberFor<T>, Level = LogLevel, Logger = DispatchError>,

KeyValueStore implementation for Finalized storage semantics.

This implementation materializes the behavioral contract defined by Finalized by combining:

  • fork-aware storage for speculative state,
  • persistent storage for observation history,
  • and routine-defined policies for finality evaluation and error signaling.

The required bounds ensure that the routine:

This guarantees that all storage failures and semantic violations are surfaced consistently as caller-defined errors and are logged exactly once at the correct abstraction layer.

Source§

type Key = [u8]

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

Source§

type Value = Confidence<Value>

Return value type used when querying a key.

The value is wrapped in Confidence, representing a confidence signal derived from the Finalized storage model rather than a definitive truth or on-chain finality.

Source§

fn insert( key: &Self::Key, value: &Value, target: Option<&str>, fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>, ) -> Result<(), Self::Logger>

Inserts a value speculatively under finality-aware semantics.

This operation:

  • computes a stable ValueHash for fork-independent identity,
  • records the hash in fork-aware storage (speculative marker),
  • and inserts or updates an Observation in the persistent ledger.

No confidence is implied by insertion alone; this operation only records existence and initializes observation tracking.

Source§

fn get( key: &Self::Key, target: Option<&str>, fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>, ) -> Result<Option<Confidence<Value>>, Self::Logger>

Reads the value associated with the current fork and derives the value wrapped in a Confidence signal.

Returned signals:

Any detected invariant violation (for example, a fork-aware hash without a ledger entry) is logged and cleaned up automatically.

Source§

fn remove( key: &Self::Key, target: Option<&str>, fmt: Option<LogFormatter<BlockNumberFor<T>, Self::Level>>, ) -> Result<Option<Value>, Self::Logger>

Removes the value associated with the current fork.

Removal semantics:

  • The fork-aware marker is always removed first.
  • The corresponding persistent ledger entry is removed next.
  • The ledger itself is deleted if it becomes empty.

This ensures no semantic or historical state is left behind once the value is no longer relevant.

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 a key under finality-aware semantics.

The closure f receives the current value, if any, and must return a new value to replace it.

Replacing a value resets all finality observations: the new value is treated as freshly observed and must re-accumulate confidence.

The update is scoped to the current fork and preserves all storage invariants. Any detected invariant violation is logged once and cleaned up automatically before the error is returned.

Source§

impl<Context, Value, Routine, Handler> Copy for Finalized<Context, Value, Routine, Handler>
where Context: Config + Copy, Value: Portable + Copy, Routine: Routines<BlockNumberFor<Context>> + Copy, Handler: ForksHandler<Context, ForkLocalDepot> + Copy,

Auto Trait Implementations§

§

impl<Context, Value, Routine, Handler> Freeze for Finalized<Context, Value, Routine, Handler>

§

impl<Context, Value, Routine, Handler> RefUnwindSafe for Finalized<Context, Value, Routine, Handler>
where Value: RefUnwindSafe, Context: RefUnwindSafe, Routine: RefUnwindSafe, Handler: RefUnwindSafe,

§

impl<Context, Value, Routine, Handler> Send for Finalized<Context, Value, Routine, Handler>
where Value: Send, Context: Send, Routine: Send, Handler: Send,

§

impl<Context, Value, Routine, Handler> Sync for Finalized<Context, Value, Routine, Handler>
where Value: Sync, Context: Sync, Routine: Sync, Handler: Sync,

§

impl<Context, Value, Routine, Handler> Unpin for Finalized<Context, Value, Routine, Handler>
where Value: Unpin, Context: Unpin, Routine: Unpin, Handler: Unpin,

§

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