#选举 #轮次 #substrate #货架 #polkadot #成员 #框架

无 std 货架选举-Phragmén

基于 seq-Phragmén 选举方法的 FRAME 货架。 (polkadot v1.15.0)

53 个版本 (35 个主要更新)

38.0.0 2024 年 7 月 18 日
37.0.0 2024 年 7 月 12 日
36.0.0 2024 年 6 月 24 日
35.0.0 2024 年 5 月 23 日
2.0.0-alpha.52020 年 3 月 24 日

#1376 in 魔法豆

Download history 407/week @ 2024-04-16 461/week @ 2024-04-23 650/week @ 2024-04-30 452/week @ 2024-05-07 429/week @ 2024-05-14 680/week @ 2024-05-21 810/week @ 2024-05-28 570/week @ 2024-06-04 486/week @ 2024-06-11 645/week @ 2024-06-18 608/week @ 2024-06-25 232/week @ 2024-07-02 543/week @ 2024-07-09 683/week @ 2024-07-16 474/week @ 2024-07-23 630/week @ 2024-07-30

每月下载 2,352 次
用于 17 货架 (8 个直接使用)

Apache-2.0

3MB
50K SLoC

Phragmén 选举模块

基于顺序 phragmen 的选举模块。

任期和轮次

选举在 轮次 中进行:每 N 块,所有前任成员都将退休,并选举新一届成员(这些成员可能与前一代成员有交集)。每一轮持续一定数量的块,这个数量由 TermDuration 存储项定义。在此上下文中,“任期”和“轮次”可以互换使用。

TermDuration 在一轮中可能会改变。这可能会缩短或延长一轮的长度。下一轮选举的区块号永远不会被存储,而是始终在运行时检查。根据当前区块号和 TermDuration,当满足条件 BlockNumber % TermDuration == 0 时,总是会触发新一轮的选举。

投票

选民可以通过提供账户 ID 列表来为任何一组候选人投票。在选举期间,无效的投票(为非候选人投票)将被忽略。然而,选民可能为未来的候选人投票。选民在投票时保留保证金。每票都定义了一个 value。这笔金额从选民账户中锁定,表示投票的权重。选民可以在任何时候通过再次调用 vote() 来更新他们的投票。这会保持保证金不变,但可以可选地更改锁定的 value。在一轮结束后,投票将被保留,并可能仍然适用于后续的轮次。选民在完成投票后,有责任调用 remove_voter 以收回保证金并解除锁定。

选民还可以报告其他选民为无效以获得他们的保证金。选民一旦他们所投票的所有候选人不再是有效候选人或成员,就会被视为无效。在报告时,如果目标选民实际上已经无效,则报告者将获得目标选民的投票保证金作为奖励。目标选民将失去他们的保证金并被移除。如果目标是有效的,则报告者将被削减并移除。为了避免被报告,选民应立即手动提交 remove_voter()

候选人资格和成员

候选人在提交候选人资格时也保留保证金。候选人无法撤回他们的候选人资格。候选人可能处于以下情况之一

  • 获胜者:获胜者被保留为 成员。他们必须仍然保留保证金,并且他们自动被计为下一轮选举的候选人。
  • 亚军:亚军是获胜者之后立即的最佳候选人。保留亚军数量的数量是可以配置的。亚军在按照顺序被选中时,被用作在候选人被 [remove_member] 踢出或活跃成员放弃候选人资格时的替代人选。亚军自动被计为下一轮选举的候选人。
  • 失败者:任何不是获胜者的候选人都被视为失败者。失败者可能是一个 即将卸任的成员或亚军,这意味着他们是一个未能保住位置的活跃成员。卸任者总是会失去他们的保证金。

放弃候选人资格

所有候选人,无论是否当选,都可以放弃候选人资格。对 Module::renounce_candidacy 的调用总是会引发退款候选人保证金。

请注意,由于成员是下一轮的默认候选人,并且投票在存储中持久化,在没有进一步输入的情况下,选举系统是完全稳定的。这意味着,如果系统有一个特定的候选人集 C 和选民集 V,它们导致一个成员集 M 被选中,只要 VC 不删除他们的候选人资格和投票,M 就会在每轮结束时继续被重新选举。

模块信息

许可证:Apache-2.0

依赖项

~17–32MB
~533K SLoC