当前位置:主页 > 列表页 > 正文

以太坊信标链验证者奖励

2021-07-04 21:24 | 出处: ECN以太坊中文社区

来源 | pintail.xyz

作者 | Pintail


我可以赚多少?



以太坊权益共识机制的核心部分于 2020 年 12 月启动了,最终交付了从工作量证明过渡的第一阶段——这是在 2014年就提出的愿景,比以太坊主网上线早了整整一年。在以太坊的权益共识机制里,区块链的安全由验证者来提供,他们需要存入 32 个 ETH 作为保证金,且负责对新的区块链(即信标链) 状态达成共识。他们诚实履行职责的话会得到奖励,失职的话则会遭受相应的惩罚。如果验证者被证明有恶意行为,他们还会受到严重的惩罚,即罚没。


与工作量证明型区块链的区块奖励相比,这些验证者的奖励与惩罚会相对复杂一点。尽管有一些优秀资源,例如 beaconcha.in,可以帮助验证者更好了解他们能赚多少,但并没有明确解释是怎么来的。本文将尝试给验证者解释清楚他们可以赚多少,以及收益差异是怎么来的。


读者可能已经看过运行一个验证者节点的“APR (年化率)估值”,比如在权益证明 launchpad上的图表,并好奇这些数值是否现实——这些数值到底怎么来的?事实上,目前所有的 APR 估值都是基于一系列的假设 (通常没有说明),有些估值甚至用的是旧版本的信标链规范。首先,让我们看一下如果所有验证者都完美参与的话,验证者可以赚取多少。我将依据 Ben Edgington 的注释规范来做预估。请注意:我们将使用 2020 年 12 月信标链上线所用的主网规范。即将要进行的 Altair 信标链分叉将对验证者奖励和惩罚进行完善。


可获得的奖励


以太坊验证者参与网络的每个 epoch (6.4 分钟) 都会获得奖励。他们收到的奖励是 base_reward (基础奖励) 的倍数。信标链有三方面的值需要投票,每个验证者对其中一个当前值投了正确的票 (或用行话说,做了证明) 就会得到一份 base_reward。我会把这三项奖励组合起来称为"正确率奖励 (accuracy reward)"。如果他们的投票 (证明) 马上被打包到信标链区块里,他们还会有第四项奖励——打包奖励 (inclusion reward)。因此,一个验证者在每个 epoch 里可获得的最高奖励是 4 * base_reward。为了搞清楚验证者可赚取多少,那么我们需要了解 base_reward 是如何确定的。


base_reward 的水平是由网络里的活跃验证者数决定的,然后调整为激励合适规模的验证者集。我们希望激励足够多的验证者加入到验证者集里,而不需要支出超过必要的发行量。如果没有那么多的验证者,协议需要提供更高得回报,以鼓励更多验证者加入。但是,如果已经有大量的验证者了,协议可以支出更少,节省发行量。信标链计算这点的函数是一个平方根倒数——也就是说,奖励水平是由除以当前质押的 ETH 数的平方根得出的 (选择使用平方根倒数关系的原因在 Vitalik Buterin 的设计原理文件中有解释)


根据注释规范:

base_reward = effective_balance * BASE_REWARD_FACTOR // integer_squareroot(total_balance) // BASE_REWARDS_PER_EPOCH


规范就是用上面的公式来计算每个验证者的 base_reward,以 Gwei (=10-9 ETH) 为单位,这些术语代表的意义如下:



在理想情况下,一切都会简化,因为所有验证者的有效余额都是 32 个 ETH。因此, n 个验证者的理想基础奖励为:


base_reward512e9 // integer_squareroot(n * 32e9)


(再次提醒,在信标链规范里,计算单位是 Gwei。我们可以除以 10^9 来换算成 ETH)


理想情况


根据上面的信息,如果所有验证者都完美参与 (即验证者在每个 epoch 里获得 4*base_reward,我们可以计算可得奖励的最大值,然后用它来乘一年的 epoch 数,就可以算出一年的理想奖励金额。这就是一年的秒数 ((31556952) 除以一个 epoch 的秒数 (384),得出每年有接近 82180 个 epoch。每个验证者每年得到的理想奖励如下图,由关于质押的总 ETH 的函数得到。


输入1

# define annualised base reward (measured in ETH) for n validators# assuming all validators have an effective balance of 32 ETHimport math
EPOCHS_PER_YEAR = 82180
def annualised_base_reward(n): return EPOCHS_PER_YEAR * 512 / math.sqrt(n * 32e9)


输入 2

# plot ideal ETH staking return
import matplotlib.pyplot as plt
n_validators = [n for n in range(524288//32,int(10e6)//32,3200)]ideal_reward = [4 * annualised_base_reward(n) for n in n_validators]
fig = plt.figure(figsize=(12, 8))
ax1=fig.add_subplot(111, label="1")ax2=fig.add_subplot(111, label="2", frame_on=False)
ax1.plot(n_validators, ideal_reward)ax2.plot([n * 32e-6 for n in n_validators], [100 * r / 32 for r in ideal_reward])
ax1.set_xlabel(‘Number of validators‘)ax1.set_ylabel(‘Ideal annual per-validator reward (ETH)‘)
ax2.set_title(‘Ideal annual validator returns‘)ax2.xaxis.tick_top()ax2.yaxis.tick_right()ax2.xaxis.set_label_position(‘top‘) ax2.yaxis.set_label_position(‘right‘) ax2.set_xlabel(‘Total ETH staked (millions)‘)ax2.set_ylabel(‘Annual yield on 32 ETH deposit (%)‘);



现将图中的一些数值制成如下列表,以供参考:


输入 3

# tabulate a few values for validator return
import pandas as pd
n_validators = [524288 // 32, 50000, 100000, 150000, 200000, 250000, 300000, 10000000 // 32]staked = [32 * n for n in n_validators]ideal_reward = [4 * annualised_base_reward(n) for n in n_validators]annual_yield = [100 * r / 32 for r in ideal_reward]data = { ‘n_validators‘: n_validators, ‘total_staked (ETH)‘: staked, ‘annual_reward (ETH)‘: ideal_reward, ‘annual_yield (%)‘: annual_yield}
df = pd.DataFrame(data)
pd.options.display.float_format = ‘{:,.2f}‘.formatdf.set_index(‘n_validators‘)




区块奖励


上面的图和表格给了我们一个高度理想化的版本,即当所有验证者都完美参与,所有奖励都平均分配的情况。但是,这个版本其实漏掉了一项重要组成部分,即信标链的区块奖励 (block reward)。


区块奖励并不改变支付给验证者的 ETH 总额,但它意味着部分可得奖励会分配给出块者 (block producer)。负责出块的是每个 slot 里 (一个 slot 是 12 秒,一个 epoch 里有 32 个 slot) 随机挑选的一个验证者。该区块是由其他验证者提交的信标链证明组成的,且出块者获得的奖励占区块证明全部打包奖励的一部分。这意味着出块者有动力将他们能收集到的所有有效证明都打包到区块,以最大化他们的以及所有提供他们打包证明的验证者的收益。


在信标链规范中,给出块者的打包奖励比例由一个叫 PROPOSER_REWARD_QUOTIENT(提议者奖励商) 的常数决定,它的值是 8。也就是说,⅛ 的打包奖励 (相当于每个 epoch 全部奖励的 ¹⁄₃₂) 是给出块者的,⅞ 是给所作证明被打包到区块的验证者的。


由于每个验证者被选出做区块提议的机会是均等的,从长远来说,奖励应该也是均等的,与上图相符。但在任何有限的时间里,验证者获得的奖励会很不一样,因为有些验证者运气比较好,获得比平均水平更多机会提议区块,有些则运气比较差,提议区块的机会更少。


为了计算出运气因素在区块提议频率中的重要性,我们可以应用一些基本的统计数据。每个验证者被选出做提议的机会是均等的——每年 31556952 / 12 = 2629746 个 slot。如果有 100,000 名验证者,被选出做提议的机会是 10-5 次。每个验证者得到区块提议机会的数量将由二项式分布决定。


下图绘制的概率质量函数图直观地呈现了验证者可期望有多少区块提议机会:


输入 4

# plot pdf

from scipy.stats import binom

x = [el for el in range(51)]y = binom.pmf(x, 31556952/12, 1e-5)

fig, ax = plt.subplots(figsize=(12, 8))ax.bar(x, y)ax.set_xlim(xmin=0)ax.set_ylim(ymin=0)ax.set_title(‘Probability mass function (100,000 validators) — number of block proposal opportunities per year‘)ax.set_xlabel(‘Number of block proposal opportunities in a year‘)ax.set_ylabel(‘Probability‘)

lmu = binom.ppf([0.01, 0.5, 0.99],31556952/12, 1e-5)avg = 31556952 / (12100000)print(f"With 100,000 validators, the mean number of blocks proposed per validator per year is {avg:.2f} ")print(f"The unluckiest 1% of validators will have the opportunity to produce at most {int(lmu[0])} blocks in a year")print(f"The median (average) validator will have the opportunity to produce {int(lmu[1])} blocks in a year")print(f"The luckiest 1% of validators will have the opportunity to produce at least {int(lmu[2])} blocks in a year")


output:

With 100,000 validators, the mean number of blocks proposed per validator per year is 26.30

The unluckiest 1of validators will have the opportunity to produce at most 15 blocks in a yearThe median (average) validator will have the opportunity to produce 26 blocks in a yearThe luckiest 1of validators will have the opportunity to produce at least 39 blocks in a year


输出:

如果有 100,000 个验证者,每个验证者每年平均获得 26.30 次提议区块的机会
  
相关文章