本文摘自波卡官方文档 Polkadot Wiki 的 Phragmén 篇,全文共三节,这是第一节。Phragmén 算法在波卡的 NPoS 验证人选举和理事会选举中都有应用。

什么是 Phragmén 顺序算法?

Phragmén 顺序算法是 19 世纪 90 年代 Edvard Phragmén 提出的一种多方共赢的选举方法。

下面这段内容摘取自 Phragmén 文献中对 Phragmén 顺序算法目的的总结 :

Phragmén 算法试图解决的问题是从范围较大的候选人中选出一组给定的人数。Phragmén(这里指人名)在多成员选区的议会选举中讨论了这一点。当然,同样的问题也可能发生在地方选举中,但在很多其他情况下,例如在一个组织中选举董事会或委员会时,也会出现同样的问题。

Phragmén 算法在 Polkadot 中怎么发挥作用?

NPoS: 验证人选举

在 NPoS 方案中使用 Phragmén 顺序算法来选举验证人。根据验证人自己的质押和提名人给他们的投票。它还试图在每一轮选举后平衡验证人之间的权重。由于验证人在 Polkadot 中得到的报酬是相等的,所以摊开每个验证人背后的质押很重要。Polkadot 在选举中优化三个指标:

最大限度地提高质押总额

最大限度地增加最小验证人的质押额

最小化节点池中的质押的方差

链下的 Phragmén 算法

在大量的提名人和验证人的情况下,Phragmén 算法是一个困难的优化问题。Polkadot使用 off-chain workers 计算链外结果,并提交一个交易来提议出胜出者的结果。在链外执行此计算的原因是为了保持 6 秒的恒定出块时间,并防止在验证人选举时每个 era 结束时的长出块时间。

由于某些用户操作,如更改提名,会改变 Phragmén 选举的结果,系统禁止在 era 变化之前的最后一个 session 调用这些函数,下面这些函数是禁止调用的:

bondExtra

unbond

withdrawUnbonded

validate

nominate

chill

payoutStakers

rebond

理事会选举

在理事会选举机制中也采用了 Phragmén 算法。当你投票给理事会成员时,你可以最多选择 16 个不同的候选人,然后质押一些绑定的 DOT 作为你的投票权重。Phragmén 将在每次选举中进行一次竞选,以确定担任理事会职位的最佳候选人,然后再选出最优秀的候选人,以尽可能平衡他们背后的选票权重。

这对节点运营者意味着什么?

Phragmén 算法是在后台运行的,并不需要你的额外操作。了解它的工作原理是好的,因为在选举结束后,你提名的所有 stake 并不是都会在你提名的验证人那里。提名人可能会提名几个不同的验证人,并相信这些验证人可以很好地操作节点。