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
- Collect all backing associated with each author (self + external).
- Flatten the backing into a single aggregate value.
- Compute influence using the
Config::InfluenceModelplugin. - Rank or select authors using the
Config::FlatElectionModelplugin.
§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.
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
Influencevalues forAuthor. - 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
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>
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>)>
type Params = Vec<(<T as Config>::AccountId, Vec<<T as Config>::Influence>)>
Input type for election computation: authors paired with influence weights.
Source§type ElectionContext = <T as Config>::FlatElectionContext
type ElectionContext = <T as Config>::FlatElectionContext
Plugin context providing runtime configuration for the election model.
Source§type ElectionModel = <T as Config>::FlatElectionModel
type ElectionModel = <T as Config>::FlatElectionModel
Plugin model implementing the election algorithm.
Source§fn reveal() -> Option<Self::Elected>
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>)
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
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
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
ForceMaxElectedis enabled. - Each elected author is stored under
(current_block, author).
§Errors
- Returns a [
DispatchError] if fails.
Source§fn can_prepare(from: &Self::Params) -> DispatchResult
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)
fn on_prepare_success(elects: &Self::Elected)
Hook invoked after a successful election process.
Source§fn on_prepare_fail(error: DispatchError)
fn on_prepare_fail(error: DispatchError)
Hook invoked when an election process fails.
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.
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
type Influence = <T as Config>::Influence
The resulting influence type, as defined in the runtime configuration.
Source§type InfluenceContext = <T as Config>::InfluenceContext
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
type InfluenceModel = <T as Config>::InfluenceModel
The plugin model used to perform the computation, implementing
the logic to convert AuthorAsset into Self::Influence.
Source§impl<T: Config> InspectWeight<<T as Config>::AccountId, Vec<<T as Config>::Influence>> for FlatElection<T>
Implementation of the InspectWeight trait for FlatElection.
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
Influenceis a singular value, it is wrapped in a vector to satisfy the generic input requirements ofElectionManagerfor swappableFairElectionandFlatElection. - 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>
fn weight_of(who: &Author<T>) -> Result<Vec<T::Influence>, DispatchError>
Returns the influence weight of an author wrapped in a vector.
§Behavior
- Fetches the total backing asset of the author using
CompensateRoles::get_hold. - Computes the author’s influence using the
Influenceimplementation forFlatElection. - Wraps the result in a
Vecand 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> 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>,
§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 = "routine"
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
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<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
fn info(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
Source§fn warn(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
fn warn(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> 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.