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.5 | 2020 年 3 月 24 日 |
#1376 in 魔法豆
每月下载 2,352 次
用于 17 个 货架 (8 个直接使用)
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
被选中,只要 V
和 C
不删除他们的候选人资格和投票,M
就会在每轮结束时继续被重新选举。
模块信息
许可证:Apache-2.0
依赖项
~17–32MB
~533K SLoC