相较于其他项目来说,Polkadot的社区治理机制更为复杂,因为Polkadot想在很长的时间段内都能保证代币持有者的权益。为了做到这一点,Polkadot发明了一些创新性的机制,比如说链上无序状态转换函数(amorphous state-transition function)、采用平台中性的中间件语言(比如WebAssembly)以及一些链上投票机制,比如具有自适应超多数阈值的公民投票、批量投票批准等。
一、治理流程概览
Polkadot治理的核心原则是:所有的协议更改都需要基于代币持有权重的全民公投,代币的多数持有者将永远有权管理网络。
为了实现这个原则,需要网络进行一些工作,并且不得不牺牲一些网络性能,比如性能下降5%。但是尽管如此,也需要这样做,因为如果不做这些治理工作所导致的问题和混乱会带来更大的代价。
通常来说,网络延时以及丢包等各种问题存在,我们没法要求所有的持币人都参与投票,所以我们可以根据活跃的持币人和不活跃的持币人自定义一个阈值参数,使得投票总数超过阈值即投票有效
治理主要包括三个阶段
1.提议阶段
公开提议:在抵押最少代币的情况下任何人都可以提出提案,支持他人提案时,需抵押与原提案人等量的币。拥有最高代币支持的提案将进入投票阶段,提议进入投票阶段后提议阶段抵押的代币将被释放。在Polkadot初期,每两周会有一些提议进入投票阶段。
议会提议:1)议会强一致提议:当议会中的所有成员都同意某一提议,该提议会直接进入投票阶段。2)议会简单多数提议:当议会中同意的成员大于反对的成员数量时进入下一阶段。
2.投票阶段
为了投票,选民必须将他们的代币锁起来,这是为了确保对选举结果的最低限度的经济支持是必要的,并劝阻出售选票。用户可以选择支持或反对当前提案,当然也可以不表达任何意见。对于表达支持意见的人,一旦提案通过,自己的币也会至少被锁定一个延时的时间。在投票阶段,用户可以通过自愿锁定更长时间来增强投票力。
3.计票阶段
对于一个提案是否通过,有三种计算方式。总结来说,当投票率降低时,通过提案所需要的投票同意率会随之提高。假使提案最终提过,原则上会经过一段延时,然后才会自动实施。
二、议会
为了代表不活跃的代币持有者,Polkadot引入了议会机制。议会由一些链上账户组成,在Polkadot中,开始的阶段议会人数将在6人左右,并且随着时间的推移,在9个月后议会将扩充到24人(差不多两周多增加一个席位)。在稳定后,席位会固定在24个,每个席位有12个月的任期,所有的成员都需要通过全民公投批准。
一个席位没有特定的投票期间,而是一个连续的选举过程。所有利益相关者都可以自由地对任何已注册的候选人表示赞同(或不赞同)。当一个席位变得空闲时,就会通过投票计算出最受认可的候选人,然后这个席位就成了他们的。只有通过全民公投才能提前罢免议员。
如下图所示,每个持票者可以为多个候选者进行投票,在第一轮中C获得了最多投票,胜出。A、B、D、E将进入下一轮。
在第二轮中,大家重新进行投票,A和B获得了最高票,但是只有A成功胜出,因为在第一轮中A获得的票数是超过B的。
议会主要被要求执行两项治理任务:提出明智的全民公决,以及取消毫无争议的危险或恶意的全民公决。
对于议会提出的提议,必须有严格的多数成员赞成,而没有任何成员行使否决权。一名成员对任何一项提案只能行使一次否决权;如果经过一段时间的冷静之后,重新提交提案,他们可能不会第二次否决它。如果所有成员都投赞成票,则认为投票是一致的,没有争议。
议会如要取消全民公投,必须有一致投票通过。由于一致意见是一项很高的要求,预计这项措施只有在完全没有争议的情况下才会使用。如果公投提案在当天晚些时候发现了一个问题,比如提案将引发的运行时代码中的一个bug,那么这可能是最后的手段。如果取消计划引起的争议足够大,以至于至少有一名持不同意见的人反对,那么将由全体利益攸关方决定提议的命运。
三、公民投票
公投是一种简单、包容、基于代币的投票方案。每个公投都有一个与之相关联的特定提议,该提议在运行时以特权函数调用的形式出现(其中包括最强大的函数调用:set_code,它能够切换出运行时的全部代码,从而实现需要“硬分叉”的功能)。它们是离散事件,有一个固定的投票发生时间,然后进行统计,如果投票被批准,就执行函数调用。
议案可通过三种方式提出:
1)公开提出议案。
2)由议会提出的议案,要么通过无否决多数,要么一致通过。
3)作为预先全投的一部分提出的议案。
所有公投都有与之相关的立法延迟。这段时间是从全民公投结束到假设提案获得批准的变化生效之间的一段时间。公投开始的前两种方式都是固定的(对于Polkadot多来说,可能是两周。对于第三种类型,可以根据需要设置。
3.1全民公投
全民公投的提案可以由任何人提出,但不会自动获得表决。当提交时,提案人需要支付一笔押金(超过固定最低额度的任何金额,可能在Polkadot上设定为50美元左右),然后提案人就可以排队了。当一个提议在排队等候时,任何人都可以通过在初始存款后存入相同金额的存款以“支持”该提议,并且可多次支持。
在固定的时间间隔内,队列中抵押代币最多的项目将被选中进行下一步全民公投,并从候选队列中被删除,所有抵押的代币将被返还给支持者。
投票权重
所有投票者投票都将从两个方面来进行衡量:
代币:代币持有量;
时长:在公投结束后代币的锁定时长,可在1到6个时间单位中进行选择。
因此,为了投票,选民必须将他们的代币锁起来,这是为了确保对选举结果的最低限度的经济支持是必要的,并劝阻出售选票。将这两个指标(代币和时长)相乘,得到投票者的总投票数。一个拥有6个令牌的投票人只愿意将它们锁在允许的最短1个单位时间内,他将与一个只有一个令牌但锁定6个单位时间的投票人拥有相同投票数量。如下图所示:
投票计数
一旦计票完毕,结果就必须确定。有三种选择来确定可以使用的结果:
(approve - 同意的投票数量;against - 反对的投票数量;voters - 投票代币总数;electorate - 网络中Dots的总数)
1)简单多数,简单的投票比较,如果赞成的票数多于反对的票数,那么该提案就通过了。
2)积极的投票率偏差“Positive Turnout Bias”,即在投票率较低的情况下,赞成票的绝大多数必须获得通过,但随着投票率接近100%,这就变成了一个简单的多数票通过。
3)负面投票率偏差“Negative Turnout Bias”,即在投票率较低的情况下,需要获得绝大多数反对票才能否决,但随着投票率接近100%,这就变成了一个简单的多数票通过。
例如,网络总共有1,500 DOTs 。
John - 500 DOTs
Peter - 100 DOTs
Lilly - 150 DOTs
JJ - 150 DOTs
Ken - 600 DOTs
John: 投 `Yes`,并锁仓1个周期 => 500 * 1 = 500票
Peter: 投 `Yes`,并锁仓1个周期 => 100 * 1 = 100票
JJ: 投 `No`,并锁仓3个周期 => 150 * 3 = 450票
支持 = 600票
反对 = 450票
投票总数 = 1050票
代币总数 = 1500
最后结果如下所示,投票将被通过。
我们认为,一项没有否决权的议会多数派协议,标志着一种明智的、或许是不规则的状态过渡。为此,我们使用简单多数进行度量。这方面的一个例外是议会内部已达成决议。在这种情况下,我们假定它标志着一种主要由技术官僚主导、毫无争议的协议变革。因此,我们主张“举证责任”应落在反对提议的人身上,因此我们使用负投票率偏见度量。
公民投票是公开的,很容易包含恶意或考虑不周的行为。在这里,责任必须由支持者承担,因此我们倾向于任何弃权票反对动议,支持(假定安全,因为它的功能足以管理这次投票)现状,并使用积极的投票率偏见。
“投票率偏差”指标使用一种称为自适应仲裁偏差(Adaptive Quorum Biasing)的技术,这是一种基于“投票率偏差”所需的超级多数的简单方法。如下图所示:
1.对于一个公开提案,当采用Positive Turnout Bias策略时,如果该提案只有25%的投票率,则其需要有66%的投票者投支持票才可通过。如果有75%的投票率时,则只需54%的投票者支持就可通过。即投票率越高,需要同意的人数比例可以相对降低。
2.对于由议会提出的全体一致性提案进行投票时,采用Negative Turnout Bias策略,投票总人数越多,需要更大比例的反对票才能拒绝这个提案。比如,对于一个只有25%投票率的提案,需要34%的投票者反对;对于一个75%投票率的提案,需要有46%的人反对,该提案才会被拒绝。
下面是投票率偏差的计算公式B+和负投票率偏差公式B−:
其中tt为投票令牌总数,tt为系统中发出的令牌总数。ayeaye是赞成票的数目,naynay是反对票的数目。
综上:
通过全民投票提出的提案可以使用任何计票机制;
经议会一致同意提交的提案需要获得更多(可能更多)反对票才能被拒绝;
由简单多数议会协议提交的提案必须有多数的赞成票才能被接受;
公开提交的提案必须获得更多(可能多得多)赞成票才能获得批准。
这就是Polkadot 的创始治理机制。基于来自团队、社区和审核员的反馈,它可能(而且很有可能)会在主网上线之前发生变化。