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

Staking:实践中的验证者奖励

2021-08-18 02:13 | 出处: ECN以太坊中文社区

来源 | pintail.xyz

作者 | Pintail

翻译 | 林晗

校对 | ECN


评价验证者表现



在上一篇文章《以太坊信标链验证者奖励》中,我们回顾了验证者在参与信标链共识过程所获得的奖励和惩罚,并基于验证者的网络参与率和正常运行时间,构建出了一个模型来估计预期的净收益。


在本篇文章中,我们将对主网的实际运行数据进行查验,并将其与模型预估值相比较。为此,我们将使用由 Jim McDonald 设计的价值非凡的Chaind工具对信标链进行索引。另外,为了避免2021 年 4 月下旬的意外暂停出块事件对研究结果产生影响,我们的研究范围主要聚焦于主网前 32,000个时段 (大约 4.5 个月) 的数据。


对平均净收益进行建模


首先,本研究将对来自主网的汇总数据展开查验。通过汇总超过 120,000 个验证者的数据,我们得以了解验证者所能获得的平均奖励或者惩罚值。在上一篇文章中,模型所估算出的数值都是预测 (即平均值) 值,基于此,我们能对模型预测值与实际运行结果之间的差异有比较清晰的认知。这将有助于我们对单个验证者以及其奖惩机制展开深入研究,同时也有助于我们准确地分析,究竟是哪类问题导致了最终实际运行结果的不佳。


预期净收益模型公式如下:


我们对主网进行了整体建模,在我们的模型中,每个验证者的正常运行时间 U是呈线性的,因此,我们可以将U 等同于整体网络参与率 P,由此可得:


至此,我们的模型只剩下两个参数——参与率 P 和基本奖励 B,而后者又由全网活跃质押额所决定。为简单起见,我们假设参与率 P 在所考虑的时期内是恒定的,即为网络的平均值。在每一时段中,该数值P等于活跃余额(即所有活跃验证者的有效余额)除以总余额(即所有验证者的有效余额)。


输入、常数、连接数据库

代码如下:

import time
import math
import statistics
import csv
from datetime import datetime
from datetime import timedelta

import psycopg2
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd

FAR_FUTURE_EPOCH 2**64 - 1 # as defined in spec
END_EPOCH 32000

# open/restart connection to chaind database
try:
cursor.close()
connection.close()
except:
pass

connection psycopg2.connect(user"chain", host"127.0.0.1", database"chain", password"medalla")
cursor connection.cursor()


找到平均数、参与率

cursor.execute(f"SELECT f_active_balance, f_attesting_balance FROM t_epoch_summaries "
f"WHERE f_epoch < {END_EPOCH} ORDER BY f_epoch")
active_balance, attesting_balance list(zip(cursor.fetchall()))

p_rate [attesting_balance[i] / active_balance[i] for i in range(len(active_balance))]
average_p_rate sum(p_rate)/len(p_rate)

print(f"average participation rate: {100average_p_rate:.1f}%")


输出:

平均参与率:99%


如上述计算,在前 32,000 个时段中,网络平均参与率为 99%。有了这个数字,我们就可以根据每个时段活跃验证者质押的 Ether 数量对预期奖励进行建模估测。


实际平均奖励


为了进行比较,我们还需要计算实际的平均奖励值。这可以通过查验 chaind 记录的活跃验证者余额的变化来实现。不过,我们需要对汇总数据进行一些调整,以准确反映主网奖励和惩罚值:


1.我们排除了错误质押的情况,用户错误地向活跃验证者进行eth1存款;


2.我们排除了被罚没的验证者,因为罚没的惩罚金额相对较大,而且仅在同一验证者同时运行多个实例或行使可证明的恶意行为时才会发生;


3. 我们排除了罚没他人的验证者,因为这些验证者获得的巨额奖励可能会扭曲整体奖励情况。


如果排除罚没者和被罚没者,那么我们排除了大约多少比例的验证者呢?通过将被排除的验证者的数量 (即被罚没者的数量加上罚没者的数量) 除以活跃验证者数量的最小值 (比如说创世验证者的数量),可以简单粗暴地计算出这一比例的上限。


计算被排除验证者百分比的上限

代码如下:

cursor.execute("SELECT COUNT(*) FROM t_validators WHERE f_slashed")
n_to_remove 2 cursor.fetchone()[0]

print(f"number of slashed/slasher validators: {n_to_remove}")

cursor.execute("SELECT COUNT(*) FROM t_validators WHERE f_activation_epoch = 0")
n_genesis cursor.fetchone()[0]

print(f"minimum number of active validators: {n_genesis}")
print(f"upper-bound percentage of validators excluded from average: {100 n_to_remove / n_genesis:.1f}%")


输出:

slashed/slasher 验证者的数量:268最小活跃验证者数量:21063从平均值中排除的验证者的上限比例:1.3%


正如上述计算所示,在最坏的情况下,我们从研究中排除了 1.3% 的验证者。因此,我们推测,这并不会对平均净奖励值的计算产生显著影响。[注意:用于计算平均奖励并将相关数据存储在Chaind数据库中的代码,是在本文章写就开始之前运行的。]


计算和绘制模型和平均奖励

代码如下:

def base_reward(active_balance, effective_balanceint(32e9)):
return effective_balance 64 // math.isqrt(active_balance) // 4

cursor.execute(f"SELECT * FROM t_epoch_extras WHERE f_epoch < {END_EPOCH} ORDER BY f_epoch")
_, aggregate_reward, aggregate_reward_nonslashed, active_balance_nonslashed list(zip(cursor.fetchall()))

average_reward_nonslashed []
modelled_reward []
for e in range(END_EPOCH):
# look at the average reward received by a supposed 32 ETH validator
# (almost all validators have a 32 ETH effective balance)
average_reward_nonslashed.append(32e9 aggregate_reward_nonslashed[e] / active_balance_nonslashed[e])

p average_p_rate
b base_reward(active_balance[e])
modelled_reward.append(3bp**2-3b(1-p)(7/8)bp**2math.log(p)/(p-1)(1/8)bp**2)

rewards pd.DataFrame({
‘average_reward_nonslashed‘: average_reward_nonslashed,
‘modelled_reward‘: modelled_reward
})

fig plt.figure(figsize(12, 8))
ax1fig.add_subplot(111, label‘1‘)
ax2fig.add_subplot(111, label‘2‘, frame_onFalse)
ax1.plot(range(END_EPOCH), average_reward_nonslashed, label‘actual reward‘)
ax1.plot(range(END_EPOCH), modelled_reward, label‘modelled reward‘)
ax1.legend()
ax2.plot([datetime(2020,12,1,12,0,23), datetime(2021,4,22,17,13,59)], [0,0], linestyle‘None‘)

ax2.set_title(‘Modeled vs. average reward for an Ethereum validator‘)
ax1.set_xlabel(‘epoch‘)
ax1.set_ylabel(‘Average per-epoch reward (gwei)‘)
ax2.xaxis.tick_top()
ax2.xaxis.set_major_formatter(mdates.DateFormatter(‘%b-%Y‘))
ax2.xaxis.set_label_position(‘top‘)
ax2.yaxis.set_visible(False);



以太坊验证者模型预测奖励与实际奖励之对比


如上图所示,我们构建简单模型似乎与实际情况非常相近,但总体而言,它预测的奖励值略高于实际奖励值。让我们计算一下溢价程度:


计算模型溢价

代码如下:

相关文章