アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

Validatorのリワード計算方法

Validatorの報酬の計算方法は以下のページに整理されているが、これはPhaase0の計算式である。
kb.beaconcha.in

Consensus-LayerはAltairとBellatrixの2回のアップデートが加えられており、現在のValidatorの報酬計算式は変更されている。詳しくは以下のページまとめられているが、自分なりにも整理する。
pintail.xyz

なお、ここではConsensu Layerの報酬の計算方法のみを記載している。The Merge後はこれにプラスしてexecution-layerの手数料報酬も得られる。

計算式の変更理由

主な変更理由はproposer rewardが本来予定していたよりも大幅に小さい値になってしまっていたことによる。具体的には実際の想定値よりも1/4の値になってしまっていた。
修正に合わせて、rewardの各報酬もvote対象の重要度に合わせて重みづけするように変更された。また、inclustion delayによる割合減少は削除され、inclusion delayはその投票が有効かどうかのlimitとしてのみ機能するように変更された。

以下、phase0の計算方法を載せた後、変更後となるaltairの計算方法を載せる。最後に実例に対してaltairの計算方法にて近似値が求まることを示す。

phase0の計算方法

base reward

phase0 base reward

Rewards and Penalties - Ethereum 2.0 Knowledge Base より

base rewardはvalidatorが保有しているETHの量とactive validatorのETHの総量によって決まる。なお、この時に参照されるETH量は最大32ETHである。つまり、validatorが33ETH保有していても32ETHまでしか参照されない。

inclusion delayとは、Attestationがblockに格納されたときのdelay値によって報酬が減額される仕組みである。delay値の計算方法は [attestationが含まれたblockのslot] - [attestを行ったvalidatorが割り当てられたslot] によって算出される。

reward and penarty

phase0 reward and penalty

Rewards and Penalties - Ethereum 2.0 Knowledge Base より

attestはHead block, source epoch, target epochの3つに対して行われる。それぞれのattest対象が正しい場合に上記のrewardが得られる。しかし、attest対象が間違っていた場合はpnertyが課される。
head blockへの投票はfork choiceを決定するための、 LMD-GHOSTへの投票である。また、source epochとtarget epochへの投票はfinalityを与えるための、Casper the Friendly Finality Gadget への投票である。

上記計算式は今現在使われていない。以降、現在採用されている計算式について整理する。

Altairの計算方法

base rewardとsync reward



base\ reward = \frac{effective\_balance * Base\_Reward\_Factor(64) }{\sqrt{\sum active\_balance}} \\
sync\ reward = \frac{Sync\_Reward\_Weight(2)  * active\_balance}{\sqrt{active\_balance} * Slots\_Per\_Epoch(32) * Sync\_Committee\_Size(512)}

inclusion speed rewardは削除された。base rewardについてはBase_Reward_Per_Epochが分母から削除され結果としてphase0の値よりも4倍になっている。
また、Light clientのためのvalidationであるsync rewardが追加された。sync rewardは全validatorで同額の報酬となるように計算される。

reward and penarty

WEIGHT_DENOMINATOR(64)を分母とし、それぞれの項目について以下のweight値が加算される。なお、SYNC_REWARD_WEIGHTはLight ClientのためのValidation用に新規で追加されたrewardとなる。

Name Value
TIMELY_SOURCE_WEIGHT 14
TIMELY_TARGET_WEIGHT 26
TIMELY_HEAD_WEIGHT 14
SYNC_REWARD_WEIGHT 2
PROPOSER_WEIGHT 8

また、inclusion delay per epochの代わりに、各rewardに対して、inclusion delayの閾値が設定された。以下の表の閾値を超えたdelayの場合は、該当の報酬はもらえないかpenartyが課される。

Name delay limit
Source  \sqrt{Slot\_Per\_Epoch(32)} = 5
Target Slot_Per_Epoch(32)
Head 1

総合すると、以下の報酬取得のパターンが考えられる。なお、penartyが課されるのはCasper-FFGへの投票部分のみである。

altair reward and penarty

※各rewardにはそれぞれの項目ごとにparticipation_rateが乗算される。そのため、実際の報酬は若干低くなる。
※sync 報酬はheadなしの場合にも得られる可能性があるかは不明。

なお、proposer reward は以下の式で求められる。



proposer\_denominator =  \frac{(Weight\_Denomi(64) - Proposer\_Weight(8)) * Weight\_Denomi(64)}{Proposer\_Weight(8)} \\

attest\ proposer\ reward = \sum_n^{voting\_perticipation} (Proposer\_Weight(8)) * \frac{effective\_balance * base\ reward}{Weight\_Denomi(64)} \\

sync\ proposer\ reward = \sum_n^{sync\_perticipation}(sync\ reward) * \frac{Proposer\_Weight(8)}{Weight\_Denomi(64) - Proposer\_Weight(8)}

実例

validator rewards

https://beaconcha.in/validator/103177

epoch info

https://beaconcha.in/epoch/168096

上記のrewardについては以下のaltair計算式で近似値が取得できた。
(32 * (64 / sqrt(489151 * 32000000000)*1000000000)) * 54 / 64 * 0.995 = 13742.6

※ズレの原因はsource, target, headの各要素ごとのperticipation rateの差によるもの