Staking

Stafi使用NPoS(提名权益证明)作为选择验证者集的机制。NPoS是DPoS的改良版,解决了验证人有过度中心化倾向的问题。NPoS机制中,将Staker分为提名人和验证人两种角色,与DPoS不同的是,出块奖励会均分给当前的所有验证人,而非按照被委托的Staking Token的比例来分配。这样一来,提名人会自动在多个验证人之间平衡委托,避免了马太效应。在创世之初,Stafi将提供数量有限的验证者名额,例如一开始60个,然后扩展到125个,随着时间推移将进一步拓展。

该系统鼓励FIS持有人作为提名人参加。提名者最多可以提名16个验证者作为受信任的验证者候选人。验证者承担共识出块,保证链的最终确定性的功能。

如何参与Staking?

1.确定您是哪个角色

Stake时,您可以是提名人或者验证人。

作为提名者,您可以提名您信任的一个或多个(最多16个)验证者候选人,以帮助您获得通胀奖励。您可以查看提名人指南以了解主网启动时需要执行的操作。

验证者节点需要24/7响应,及时执行其预期职责,并避免任何不当行为。如果您希望成为验证者,深度参与网络维护,获取更高的收益,您可以查看验证者指南

2.提名期

任何人都可以申请成为验证人候选人。候选人列表对所有提名人都公开,每个提名人提交一份其支持的候选人名单。在下一个时期(持续几个小时),将选出16个的具有最多FIS支持的验证者并使其生效。对于FIS持有人成为提名人没有特殊要求,尽管我们希望每个提名人都仔细跟踪验证人的表现和声誉。

提名期结束后,16个验证人被选出,并开始执行他们的任务。

3.Staking奖励分配

为了解释如何向验证者和提名者支付奖励,我们需要引入验证者池的概念,我们定义一个验证者池由一个验证者和支持它的提名者组成。(注:如果一个提名者n与用自己的stakes支持了多个当选的验证人,比如k个,那么系统会将其Stake拆分为s_1s_2,..., s_k,视为分别支持了v_1v_2,..., v_k ,其中提名者n支持验证人v_i的stake份额为s_i

在这种情况下,提名者n 能获得的奖励,相当于由k个提名人,各自分别用s_i 的Stake份额提名了v_i

验证者池的奖励规则是,两个验证者池在相等的工作量下获得相同数量的FIS,不与他们各自获得支持的FIS量成比例。在验证者池中,奖励分为两部分(比例可配置),一部分支付给验证者,其余部分按比例(即按stake份额)支付给提名者。特别要注意的是,提名者奖励中有可能包含给到验证人的一部分,因为验证人默认是自己的提名人,自己的“票”投给自己。

要估算提名人或验证人每月可获得的FIS数量,您可以查看奖励机制 一节

如果您需要计算金本位收益,而非币本位收益,还须估算通货膨胀率,您可以查看通货膨胀一节

4.NPoS特点

我们重点介绍NPoS的两个特点。第一个是,由于验证者池的报酬是相同的,因此拥有较少委托的池将为每个FIS提名人支付比拥有更多委托的池更高的费用。因此,我们为提名者提供了经济激励,使其逐渐将他们的委托转移到较少委托的验证者。这样做的原因是,我们希望所有验证者池的权益尽可能地平均分配,以避免权力集中在少数验证者中。这种机制推演下来,所有验证者池会逐渐具有相近的委托量,信誉较好验证者有可能委托量更高,但是总体上各验证池会保持均衡。

我们通过示例来阐明以上内容。为简单起见,我们有以下假设:

  • 这些验证者没有自己的利益。

  • 他们不收取任何佣金

  • 奖励金额为100个FIS代币

  • 最少要验证的FIS是350

A-验证者池

提名人(4)

委托量(600)

占比

奖赏

Jane

100

0.167

16.7

Sam

50

0.083

8.3

Anderson

250

0.417

41.7

Boby

200

0.333

33.3

B-验证者池

提名人(4)

委托量(400)

占比

奖赏

Alice

100

0.25

25

Peter

100

0.25

25

John

150

0.375

37.5

Kitty

50

0.125

12.5

两个验证者池A和B都有4个提名者,总委托量分别为600和400。

根据上述奖励分配,同样的FIS本金,池B中的提名人比池A中的提名人获得更多的奖励,因为池A的总体权益更高。Sam已在A池中投入了50个FIS股份,但他只得到8.3的回报,而Kitty则以相同的投入获得12.5的回报。

我们还指出,当系统对验证器的不良行为(例如,验证器离线,冒名顶替等)施以Slash惩罚时时,Slash的数量是固定百分比(而不是FIS的固定数量),这意味着拥有更多委托量的验证者池将被Slash掉更多的FIS。同样,这样做是为了为提名者提供经济动机来改变他们的偏好,由支持最受欢迎的验证者,转而支持他们认为值得信赖的但比较不受欢迎的验证者。

要注意的第二点是,每个验证人候选人都可以自由列出所需的佣金比例以支付运营成本。由于验证者池的薪水相同,因此佣金较低的池向提名人支付的费用要比费用较高的池多。因此,每个验证人可以选择增加其佣金比例以赚取更多的FIS,还是减少其佣金比例以吸引更多提名人并增加其当选机会。我们将让市场在这方面进行自我调节。从长远来看,我们期望所有验证人都需要具有成本效益以保持竞争力,并且信誉较高的验证人将能够收取稍高的佣金。

5.验证人和提名人

由于验证者的席位将受到限制,因此大多数希望参与Stake,维护网络安全并赚取收益的人,都是提名人。验证者承担了大部分复杂的工作:他们在BABE中产生新的区块候选者,在GRANDPA中投票并达成共识,并可能承担更多职责。

另一方面,提名人一旦质押了FIS,就无需做任何事情。提名者的经历类似于“设置并忘记它”,而验证者将通过执行关键操作为网络提供主动服务。

想要参与Staking吗?

  • 提名人指南 -成为Stafi网络上的提名人。

  • 验证者指南 -成为Stafi网络上的验证者。

Staking-Slash机制

Slash是针对验证人在共识中产生不良行为的惩罚,此类型为可能造成共识不稳定,系统崩溃等问题。对于此类问题,NPoS共识通过“罚没”抵押金的方式对产生“非法”行为的验证人进行惩罚。和奖励计算一样,惩罚的计算每个Era计算一次。惩罚的类型和方式如下。

1.离线/未响应

如果验证人在一个Era中不出块也不发送心跳信号,那么该验证人会被判断为离线/未响应。当离线/未响应节点数较多时,为了保证系统运营,系统会开始罚没不良行为验证人的验证池中的一部分质押的FIS,也就是说,这里包括提名人的FIS。.

我们设置以下公式

min((3(k(n/10+1)))/n,1)0.07min((3*(k-(n/10+1)))/n,1)*0.07

其中,n是总的验证人数量,k为离线验证人数量,注意当k - (n / 10 + 1) < 0的时候,惩罚金额0。假设一共有100个验证人,n=100

假设n=100,

k=1~11,Slash的比例为0;

k=12,Slash的比例为 0.03 * 0.07 = 0.0021

k=21,Slash的比例为 0.3 * 0.07 = 0.021

k=31,Slash的比例为 0.6 * 0.07 = 0.042

k=41,Slash的比例为 0.9 * 0.07 = 0.063

k=51,Slash的比例为 1*0.07=0.07

总体来说,Slash的比例最小为0,最大为7%,当所有节点中少于10%离线时,单个节点离线或者没有响应是不会被slash的,当1/3节点同时离线的时候,Slash比例接近5%。

min((3(k(n10+1)))/n,1)0.07min((3*(k-(\frac{n}{10}+1)))/n,1)*0.07

2.双签

在出块阶段(Babe共识)和投票阶段(Grandpa共识),为了保证共识安全,在单个轮次不同链上投票,或者是在同一个高度生成两个新区块,都会被认定为作恶。惩罚公式如下

min((3kn)2,1)min((\frac{3k}{n})^2,1)

其中,n为验证人数量,k为一个Era内混乱或者无效投票的验证人数量。

假设n=100

k=1,Slash的比例为0.03 * 0.03 = 0.0009

k=10,Slash的比例为 0.09

k=21,Slash的比例为 0.3969

k=31,Slash的比例为 0.81

k=41,Slash的比例为 1

k=51,Slash的比例为 1

总体来说,双签的惩罚要比离线严重的多,Slash比例最大的是1,也就是验证人有可能会被罚没100%的Stake。

验证者可以在多台计算机上运行其节点,以确保在其节点之一发生故障的情况下,它们仍然可以执行验证工作。应该注意的是,如果他们在管理签名机方面没有很好的协调,那么双签是可能意外发生的。

验证者如果被发现了任何一种不良行为,都将会被从验证者集中删除,失去当期的奖励,他们将立即被视为不活跃,并将失去其提名人。他们需要重新申请,以再次成为候选验证人,并重新获取提名人。

3.Slash机制细节说明

一个提名人可能提名的多个验证人当选,并可以因为任何一个验证人的不当行为而遭受Slash。在Slash之前,Staking FIS在各个epoch都可以重复使用。提名人用N个FIS连续提名某个验证人E个epoch,如果该验证人因不当行为被Slash,并不意味着您要被Slash掉N * E个FIS,只有N个。

当一个验证人截止被发现时已经有多个不良行为时,我们会按照开出的罚单中的额度最高的罚单来实施Slash,而不是总和。这样可以避免惩罚时验证者本金不足。被发现不良行为的验证者会被退选,以防止被罚验证者的愤怒攻击和故意加害。

三、退选

退选是指从下一个NPoS周期中,从活动的验证者集中删除一个验证者,并取消其与候选候选者集合的资格的行为。

这可能是自愿的,并且是由验证者发起的,例如,验证者的周围环境或服务器托管商出现问题,验证者想要退出以保护自己免受Slash。自愿时,退选将使验证者在当前epoch保持活动状态,但在epoch中将其移动到非活动状态。验证者不会丢失其提名者。

退选也有可能作为惩罚措施使用,退选作为惩罚措施时,会使得验证器在当前epoch被禁用,并在下一个epoch中从验证者集中除名。

Stafi允许一部分验证器被禁用,但是如果禁用的验证器数量过多,将触发新的验证器选择以获取足够多的验证器。被除名的验证者将需要重新提交申请,重新获取提名者的支持。

四、奖励机制

奖励计算

对于每个周期(Era),验证人将按照他们的Era Points的数量按比例支付。Era Points 是指通过以下方式获得的奖励积分。在Stafi的NPoS设计中,验证者以下三个类型的行为可以获得Era Points

  1. 出块(未引用叔块的块)

  2. 叔块出块(引用了之前未被引用过的叔块的块)

  3. 子块出块(引用了叔块的块)

为了保证出块,每个出块人通过VRF算法选出,同时,为了防止选出的出块人不出块,共识还会提前按照Round-Robin的算法选出后补出块人。这样的处理方式能保证每个块槽能正常出块,但是也会使得同一个块槽有多个块产生,此时通过GRANDPA确定的块为最终块,其他的块为叔块,叔块的子块同时也会得到奖励,但是奖励会相对少。

无论是最终块,叔块还是子块,验证人在合法范围中做了相等的工作,所以单个块对验证人的奖励是均等的,同时在NPoS的设计中,每个验证人被赋予相同的选举权重(Voting Power),无论其接受的提名Stake有多少,每个验证人被选上的概率是一样的。当然,Stake的多少决定了你是否能进入验证人集合。

出块机会被平均分配给验证人,这意味着奖励分配和Stake权重并没有直接的关系。很多项目设计的PoS共识中,出块机会和Stake权重成正比,即更多Stake拥有获得更多奖励的机会,从目前运行的项目来看,Stake有向头部集中的趋势,前10名的验证人一般可以占据50%以上的Stake率,NPoS的设计可以很好的避免此类问题,奖励机会均等可以让Stake的分布更加均衡,更加去中心化。

对于提名人来说,提名给越少Stake的验证人,可以获得更多的奖励,相反,则得到更少的奖励。单位FIS的提名在提名少的验证人身上可以获得更丰厚的回报,但是,提名少的验证人可能会出现一些问题,比如长期掉线,或者技术不过关,也可能是因为名气较小,节点业务才刚刚开始,这些不确定性是提名者需要注意的。

为了更好的分发奖励,Stafi以一个epoch为周期记录页每个验证人的奖励,同时,以一个Era为计算奖励周期,验证人可以在一个Era结束后领取(Claim)奖励。领取奖励后,协议会根据Stake的比例给提名人自动分发奖励(警告,奖励如果在84个Era内不被领取,奖励将会被销毁,所以需要验证人提前领取奖励)。

按照规定的奖励类型,每个验证人可以在出块后获得奖励,每种类型的块对应的奖励计数为

类型

出块

叔块

子块

奖励计数

20

2

1

假设验证人为v,在一个Era e中出块数量为n,叔块数量为s,子块数量为x,该验证人在该e中得到的总奖励计数r

re=20n+2s+xr _e=20n+2s+x

假设验证人集合有100人,即有

v1v2,v3v100v_1,v_2,v_3……v_{100}

那么e 中,所有验证人的总奖励计数R

Re=r1+r2+r3++r100=v=1100rvR_e=r_1+r_2+r_3+…+r_{100}=\sum_{v=1}^{100} r_v \quad

进一步可得

Re=v=1100(20nv+2sv+xv)R_e=\sum_{v=1}^{100}(20n_v+2s_v+x_v) \quad

至于每个Era Point相当于多少个FIS,需要根据当时既定的通货膨胀率来确定。

奖励分配

Stafi以一个epoch为周期记录每个验证人的奖励,一个epoch是2400个块,一个块是6s,一个epoch是4h。同时,Stafi以一个Era为周期发放奖励,验证人可以在一个Era结束后领取(Claim)奖励。一个Era是6份epoch,相当于1天。

验证人领取奖励后,协议根据验证人事先设置的比例分配一部分给到提名人(警告,奖励如果在84个Era内不被领取,奖励将会被销毁,所以需要验证人提前领取奖励)。

例如,假设验证者的集体奖励是10个FIS。验证者可以指定佣金 validator_payment = 40%,在这种情况下,验证者将收到4个FIS。然后,剩余的6个FIS,根据每个提名人所拥有的Stake比例,分配剩余的6个FIS,假如验证者本身也质押了FIS,这6个FIS还有一部分要分给验证者。对于此计算,验证者的Stake就像是一个提名自己的提名人一样。奖励可以定向到Stash账户或Controller,奖励也可以选择继续参与质押,或者不参与质押。

年通胀率

针对SV和SSV的奖励来源于系统通胀,和比特币的Coinbase机制类似,Stafi协议在每个块都会产生新的FIS(过程称之为Coinstake),用以激励验证人和特殊验证人付出的计算和存储资源。通胀率的设置是一个经济学问题,按照历史演变和大量数据表明,现阶段的PoS项目年通胀率大概在5%~20之间。

在Stafi协议的设计中,通胀率构成主要有以下几个方面

I=INPoSISlashITxfeeI=I_{NPoS}-I_{Slash}-I_{Tx-fee}

其中

INPoS=ISV+ISSVI_{NPoS}=I_{SV}+I_{SSV}

I_NPoS 为系统共识奖励,在Stafi中包括针对SV和SSV的奖励。Slash的FIS和交易手续费的FIS,都有一部分会分给举报人,一部分会补充到国库中,国库有销毁逻辑。

和Staking率有关系,不考虑其他影响因素,当Stake占越高时系统拥有更高的安全性,Stake越低时安全性相对减弱,高流动性代表着Token具有较低的流动性,在FIS的设计中,通胀率会根据Stake的占比动态调整通胀率,当Stake占比升高时,系统会减少激励,反之,Stake占比降低时会提高激励。在调整过程中,Stafi协议沿用了一个理想的Stake占比50%,即当Stake占比超过50%之后,激励将不再升高, 在2.5%~10%之间,激励曲线如下。第一年的增发率为10%,如果Staking率没有达到理想值,多余的奖励将被流通到国库。

I_SSV 和服务调用有关系,包括多签签名服务和RPC调用服务。Staking过程中,需要多次调用RPC和多签服务,为了支付服务所产生的费用,系统会给与每次调用奖励。初始设置中,协议规定固定增发x%作为服务调用的奖励,x的初始范围设定在【1,2】。

系统按照设定,奖励每笔调用,一个Era计算一次。当前Era中调用获得的奖励小于系统在该Era的增发,那么多出来的奖励将会被销毁。如果调用奖励超过系统在该Era的增发,那多单位调用所奖励的FIS也会相应减低。此策略会在主网上线后的1年时间里,动态调节,后通过线上治理的方式,由社区决定。

I_Slash的通胀并不是确定的数字,在大部分人都是诚实的前提下,Stafi协议应该不会有太大量的Slash情况出现,严重事故发生的几率也比较小。现有PoS项目,发生过几起双签事故,但大多都是验证人失误导致,所以 I_Slash对整体的通胀率影响不大。

I_Tx-fee 的通胀也并不是确定的数字,依赖于Stafi网络的使用情况,特别是rToken的使用,目前并不能评估,但是整体上随着rToken的发展,对通胀是有一定的缩减作用的。