Struct FlatElection

Source
pub struct FlatElection<T: Config>(PhantomData<T>);
Expand description

A FlatElection represents an election model in which an author’s entire backing position is flattened into a single aggregated influence value.

In this model, all sources of support associated with an author - including:

  • self-collateral, and
  • external backing (direct backers, unmanaged indexes, or managed pools) are first combined into one total backing value.

This flattened value is then passed through the influence computation plugin to derive a single scalar influence metric for the author.

The resulting influence values are used to compare authors uniformly, independent of how their backing is structured or distributed.

§Characteristics

  • Aggregates all sources of support (self + external) into one value.
  • Produces exactly one influence metric per author.
  • Discards backer-level structure and granularity.
  • Enables simple, deterministic, influence-based comparison.

§Election Flow

  1. Collect all backing associated with each author (self + external).
  2. Flatten the backing into a single aggregate value.
  3. Compute influence using the Config::InfluenceModel plugin.
  4. Rank or select authors using the Config::FlatElectionModel plugin.

§Typical Use-Case

  • Selecting authors or producers based purely on total effective influence, where the origin or distribution of support is intentionally ignored.

§Summary

FlatElection flattens the backing graph: all forms of support are reduced to a single comparable influence metric.

The model is simple, deterministic, and influence-driven, but it does not preserve fairness across individual backers.

Tuple Fields§

§0: PhantomData<T>

Trait Implementations§

Source§

impl<T: Config> ElectionManager<<T as Config>::AccountId> for FlatElection<T>

Implementation of the ElectionManager trait for FlatElection.

This binds the FlatElection system to a concrete election computation using influence-based metrics, leveraging runtime-configured plugin models and contexts.

  • Election weights are computed from Influence values for Author.
  • Input type to the election plugin is ElectViaInfluence (candidates with their backing influences).
  • Output type is ElectedAuthors (a collection of elected candidates).
Source§

type ElectionWeight = <T as Config>::Influence

Election weight type: corresponds to the singular influence of an author.

Source§

type ElectionWeightOf = Vec<<FlatElection<T> as ElectionManager<<T as Config>::AccountId>>::ElectionWeight>

Collection type holding weights for an author.

Although it is a vector, it typically contains only a single influence value.

Source§

type Params = Vec<(<T as Config>::AccountId, Vec<<T as Config>::Influence>)>

Input type for election computation: authors paired with influence weights.

Source§

type Elected = Vec<<T as Config>::AccountId>

Output type representing elected authors.

Source§

type ElectionContext = <T as Config>::FlatElectionContext

Plugin context providing runtime configuration for the election model.

Source§

type ElectionModel = <T as Config>::FlatElectionModel

Plugin model implementing the election algorithm.

Source§

fn reveal() -> Option<Self::Elected>

Retrieve the currently elected candidates.

Fetches the authors elected in the most recent election round, using RecentElectedOn to determine the latest block where results were stored.

§Returns
  • Ok(Elected) - A collection of elected authors.
  • None - if none are elected
Source§

fn remove(who: &Author<T>)

Optimistically removes a candidate from the most recent elected pool.

Directly updates storage by deleting the (block, author) entry from Elected for the latest election block.

Does not retroactively remove authors from historical elections.

Source§

fn is_candidate(who: &Author<T>) -> DispatchResult

Search if the given candidate is an elected in the recent election.

DispatchError otherwise

Source§

fn store(elects: &Self::Elected) -> DispatchResult

Persist the election results into storage.

Stores the newly elected authors under the current block number, updating Elected and RecentElectedOn.

§Behavior
  • Ensures the number of elected candidates meets the minimum requirement.
  • Optionally truncates to the maximum limit if ForceMaxElected is enabled.
  • Each elected author is stored under (current_block, author).
§Errors
  • Returns a [DispatchError] if fails.
Source§

fn can_prepare(from: &Self::Params) -> DispatchResult

Check if the election can be prepared with the given authors as candidates.

Ensures that the provided candidate set meets the configured minimum (MinElected) before initiating election computation.

Source§

fn on_prepare_success(elects: &Self::Elected)

Hook invoked after a successful election process.

Source§

fn on_prepare_fail(error: DispatchError)

Hook invoked when an election process fails.

Source§

fn prepare(from: Self::Params) -> Result<(), DispatchError>

Executes the election process and persists the results. Read more
Source§

fn run_model(input: Self::Params) -> Self::Elected

Self::ElectionModel plugin output function. Read more
Source§

impl<T: Config> Influence<<<T as Config>::CommitmentAdapter as InspectAsset<<T as Config>::AccountId>>::Asset> for FlatElection<T>

Implementation of the Influence trait for FlatElection.

This binds the FlatElection election system to a concrete influence computation using Config::InfluenceModel

§Influence Input
  • AuthorAsset: The raw input type used to compute influence.
  • Typically represents an aggregated backing asset associated with the author (Author).
Source§

type Influence = <T as Config>::Influence

The resulting influence type, as defined in the runtime configuration.

Source§

type InfluenceContext = <T as Config>::InfluenceContext

The plugin context used for influence computation, providing runtime parameters, thresholds, or local configuration needed by the plugin model.

Source§

type InfluenceModel = <T as Config>::InfluenceModel

The plugin model used to perform the computation, implementing the logic to convert AuthorAsset into Self::Influence.

Source§

fn influence(input: RawFrom) -> Self::Influence

Computes influence from a raw input using the configured plugin. Read more
Source§

impl<T: Config> InspectWeight<<T as Config>::AccountId, Vec<<T as Config>::Influence>> for FlatElection<T>

Implementation of the InspectWeight trait for FlatElection.

This provides a way to inspect the computed weight of an Author in terms of influence, leveraging the generic influence computation defined in the runtime.

§Author Weight
  • Returns the weight of a author as a Vec<Influence>.
  • Although Influence is a singular value, it is wrapped in a vector to satisfy the generic input requirements of ElectionManager for swappable FairElection and FlatElection.
  • Each element (typically only one) represents a computed influence derived from the author’s backing asset.
Source§

fn weight_of(who: &Author<T>) -> Result<Vec<T::Influence>, DispatchError>

Returns the influence weight of an author wrapped in a vector.

§Behavior
  1. Fetches the total backing asset of the author using CompensateRoles::get_hold.
  2. Computes the author’s influence using the Influence implementation for FlatElection.
  3. Wraps the result in a Vec and returns it.
§Errors
  • Returns a [DispatchError] if fails.

Auto Trait Implementations§

§

impl<T> Freeze for FlatElection<T>

§

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

§

impl<T> Send for FlatElection<T>
where T: Send,

§

impl<T> Sync for FlatElection<T>
where T: Sync,

§

impl<T> Unpin for FlatElection<T>
where T: Unpin,

§

impl<T> UnwindSafe for FlatElection<T>
where T: 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> 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 = "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<fn(Timestamp, &Self::Level, &str, &str) -> String>, ) -> 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<fn(Timestamp, &Self::Level, &str, &str) -> String>, ) -> 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<fn(Timestamp, &Self::Level, &str, &str) -> String>, ) -> 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<fn(Timestamp, &Self::Level, &str, &str) -> String>, ) -> 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, 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> MaybeRefUnwindSafe for T
where T: RefUnwindSafe,