显示此包…
1 个稳定版本
3.0.0 | 2021年4月4日 |
---|
#10 in #tetcore
31 每月下载次数
在 8 个包中使用(通过 node-runtime)
1.5MB
30K SLoC
Phragmén 选举模块。
基于顺序Phragmén的选举模块。
任期和轮次
选举在 轮次 中进行:每 N
块,所有前任成员退休,并选举出一组新成员(这些新成员可能与前一组有交集,也可能没有交集)。每一轮持续一定数量的块,由 TermDuration
存储项定义。在此上下文中,“任期”和“轮次”可以互换使用。
TermDuration
在一轮中可能会改变。这可以缩短或延长轮次的时间。下一轮选举的块号从未存储,而是始终在运行时检查。根据当前块号和 TermDuration
,当满足条件 BlockNumber % TermDuration == 0
时,将始终触发新的选举轮次。
投票
选民可以通过提供账户ID列表来为任何一组候选人投票。无效的投票(为非候选人投票)在选举期间将被忽略。然而,选民 可能 为未来的候选人投票。选民在投票时保留保证金。每个投票定义一个 value
。这笔金额从选民的账户中被锁定,表明投票的权重。选民可以在任何时候通过再次调用 vote()
来更新他们的投票。这保持保证金不变,但可以可选地更改锁定的 value
。在一轮结束后,投票将被保留并可能仍然适用于后续的轮次。选民在完成投票后应负责调用 remove_voter
,以取回保证金并解除锁定。
选民还会报告其他选民失效以赚取他们的债券。一旦选民所投的所有候选人都不再是有效候选人或成员,该选民就视为失效。在报告时,如果目标选民实际上已经失效,报告者将获得目标选民的投票债券作为奖励。目标选民将失去其债券并被移除。如果目标选民没有失效,报告者将被削减并移除。为了防止被报告,选民应立即在失效状态下手动提交 remove_voter()
。
候选人和成员
候选人提交候选资格时也会保留债券。候选人无法撤回他们的候选资格。候选人可能处于以下情况之一:
- 胜者:胜者保留为 成员。他们必须仍然保留债券,并自动被视为下一轮选举的候选人。
- 亚军:亚军是胜者之后的最佳候选人。保留亚军的数量是可配置的。亚军将按顺序使用,作为候选人在以下情况下的替代品:被
[remove_member]
踢出,或者当现任成员放弃候选资格时。亚军将自动被视为下一轮选举的候选人。 - 败者:任何不是胜者的候选人都是败者。败者可能是一个 离任成员或亚军,这意味着他们是一个未能保住位置的活跃成员。离任者将始终失去他们的债券。
放弃候选资格。
所有候选人,无论当选与否,都可以放弃候选资格。调用 Module::renounce_candidacy
将始终导致候选资格债券被退还。
注意,由于成员是下一轮的默认候选人,并且投票在存储中持续存在,因此在没有进一步输入的情况下,选举系统是完全稳定的。这意味着如果系统有一组特定的候选人 C
和选民 V
,这些候选人 C
和选民 V
导致一组成员 M
当选,只要 V
和 C
不撤回他们的候选资格和投票,M
将在每一轮结束时继续当选。
模块信息
许可:Apache-2.0
依赖关系
~3–12MB
~136K SLoC