pub struct TopDownFairModel;Expand description
The TopDownFair model evaluates candidates based on the aggregate support they receive from external backers.
Concept: Aggregated External Fairness
Each candidate has a list of (Backer, Backed) pairs representing
individual endorsements. The model sums these contributions using
saturating addition to prevent overflow and sorts candidates
in descending order by their total received backing.
§Characteristics:
- Fair aggregation: Each candidate’s score is the sum of their backers’ support.
- No self-weighting: Excludes self-stake to prevent dominance by self-funding.
- Overflow-safe: Uses
Saturatingarithmetic to avoid overflow errors. - Context-free: Deterministic and stateless ranking.
§Applications:
- Governance elections prioritizing external community support
- Fair staking models with anti-self-dealing constraints
- Collaborative credit or delegation-based systems
§Example:
let input = vec![
("Alice", vec![("Bob", 10), ("Carol", 20)]),
("Dave", vec![("Eve", 15), ("Frank", 15)]),
("Grace", vec![("Heidi", 5), ("Ivan", 10)]),
];
let output = TopDownFair::compute(input, None);
// Aggregated totals:
// Alice: 30, Dave: 30, Grace: 15
assert_eq!(output, vec!["Alice", "Dave", "Grace"]);§Reference:
- Weighted voting - Wikipedia
- Delegated voting / Liquid democracy
- Osborne, M. J., An Introduction to Game Theory, Oxford University Press, 2004 (proportional influence)
Trait Implementations§
Source§impl Debug for TopDownFairModel
impl Debug for TopDownFairModel
Source§impl Default for TopDownFairModel
impl Default for TopDownFairModel
Source§fn default() -> TopDownFairModel
fn default() -> TopDownFairModel
Source§impl<Candidate, FairWeight, Backer, Backed, Input, Output> PurePluginModel<Input, (), Output> for TopDownFairModelwhere
Input: FromIterator<(Candidate, FairWeight)> + IntoIterator<Item = (Candidate, FairWeight)> + Clone,
Output: FromIterator<Candidate>,
FairWeight: FromIterator<(Backer, Backed)> + IntoIterator<Item = (Backer, Backed)> + Clone,
Backed: Clone + Ord + Zero + Saturating,
Candidate: Clone,
impl<Candidate, FairWeight, Backer, Backed, Input, Output> PurePluginModel<Input, (), Output> for TopDownFairModelwhere
Input: FromIterator<(Candidate, FairWeight)> + IntoIterator<Item = (Candidate, FairWeight)> + Clone,
Output: FromIterator<Candidate>,
FairWeight: FromIterator<(Backer, Backed)> + IntoIterator<Item = (Backer, Backed)> + Clone,
Backed: Clone + Ord + Zero + Saturating,
Candidate: Clone,
Source§fn compute(&self, input: Input, _context: &()) -> Output
fn compute(&self, input: Input, _context: &()) -> Output
Computes the fair aggregated rank of candidates imperatively.
- Iterates over each candidate and sums their backers’ contributions using saturating addition.
- Sorts candidates by descending total backing.
- Returns only the ordered list of candidates.
Auto Trait Implementations§
impl Freeze for TopDownFairModel
impl RefUnwindSafe for TopDownFairModel
impl Send for TopDownFairModel
impl Sync for TopDownFairModel
impl Unpin for TopDownFairModel
impl UnwindSafe for TopDownFairModel
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.