誓約と報酬についての計算式

2021-09-29

報酬が支払われるまでの計算

エポックごとの報酬計算において、プールに割り当てられる報酬はこの式で表されます。

最初に見た時は、変数がどのような意味を持つのかわからなかったので、読み進むのが難しいと感じました。

今回は式で使われている変数を一つ一つ確認します。

その後に、計算に必要な数値をADApoolsから取得して、式に当てはめて計算してみたいと思います。

最終的にプール報酬がADApoolsと近い値が得られるか確認していきます。

おかしなところや、ご不明点等がございましたら教えていたけますと幸いです。

概要

今回のお話の全体像を解説した時の記事はこちら

報酬がウォレットに届くまでの流れ(計算)は下記になります。

① 特定のプールが受け取ることのできるすべての利用可能な報酬は下記の式(先ほどの式)で表されます。エポックにおいて、パフォーマンスを100%だした時のプールに割り当てられる、最適な報酬合計となります。(実際の報酬量はブロック生成のパフォーマンスも影響を受けるため、ほとんどの場合この値と完全一致はしません)

② 次に①に対してプールのパフォーマンス(ブロック生成をどれだけしたか)を掛け算して、ブロック生成の実績に即した報酬が計算されます。(100%であれば①の値がそのまま導き出されます)

③ ②で得られた報酬をプール内で、プールへの固定費用、手数料を差し引き、ステーク量に応じて委任者に分配されます。私の検証ではぴったりにはならず、0.05430554 ADAの差分が出ました。

この記事では①~②を主に見ていきます。

③はFAQにも記載しております。

参考資料

Cadrdano DocsのPledging and rewards

統計的な情報:ADApools, PoolTool

参考動画: [EDEN] プールさんの動画

例として使用するステーク量などの数値、パラメータは2021年8月時点のものになります。
下記のパラメータは、Cardano上で決まった値になります。(式の中では固定)

k=500
d=0
ρ=0.03
τ=0.2
a0=0.3

関連パラメータ

関係する変数の説明です。

kパラメータ
ネットワークが完全に飽和する時の必要なプール数(最適なプール数)なので、kの数が大きくなれば分散化が進んでいることになります。2020年12月時点で、k=500で、飽和レベルは約64M ADAになりました。500プールに64M ADAの委任が集まった状態が報酬分配として最適な状態となります。

dパラメータ
分散化パラメータです。ネットワークの安定のため、IOGがノードを運営していた時期があります。Shelley期当初はほとんどのブロック生成を担っていました。その割合を示すパラメータです。これでは中央集権型ですが、徐々にSPO(ステーク・プール・オペレータ)のノードがブロック生成する割合が増えていきます。徐々にd=0に近づいていき、2021年3月末にゼロに設定されました。(今回の記事では使用しませんが、0.8以上かそれより低いかでプールパフォーマンスや報酬に影響がありました)

ρ(ロー)
エポックごとに、リザーブ(未発行のADA)からADAが取り出され、仮想ポッドへ移動し報酬に充てられます。その割合がρで、0.3%に設定されています。0.3%の場合、リザーブが半分になるのに4~5年かかります。
ρが高ければ報酬やトレジャリーへの貯えも多くなる半面、リザーブの枯渇が速くなるため、ステークホルダーに対する長期目線の考え方(報酬への魅力)とトレードオフになります。

τ(タウ)
エポックごとに発生する報酬の全体から、トレジャリーへ蓄えられる割合で、20%に設定されています。

Tm
最大ADA供給量(45,000,000,000)

T
ADAの流通量(市場に出ている合計: 2021年8月時点で、約32,500,000,000)

Rt
エポックにおける利用可能な報酬の合計。(Tm-T) * ρ + トランザクション手数料です。一定の割合ρでリザーブから取り出され、それにトランザクション手数料を加えたもの。

トランザクション手数料はあらかじめ予測できないですが、ADApoolsで過去の手数料を確認できます。

Re
エポックにおいてリザーブからρの割合で取り出される報酬額です。

z0 (0~1)
最適なプールの飽和サイズの割合です。
k=500においては、 z0=1/k=1/500=0.002(=0.2%)なので流通量全体の0.2%の値が最適なプールサイズです。

TがADAの流通量なので、プールの飽和サイズは(1/k * T)で割り出せます。

例として、ざっくり計算で、
0.002 x 32,500,000,000 = 65,000,000 = 約 65 M が今のプールの飽和サイズになります。

流通量は増えていくので飽和サイズも増えます。

σ (0~1)
T(ADAの流通量)に対する、プールのステークです。(有効ステーク/流通量)
プールオーナの誓約金と委任者のステークを含みます。

σ’
σ’ = min(σ, z0) で表せて、σ、 z0の間の最小値です。

10M 委任されているとすると、σ’ = 0.000369231 ~= 0.037%
65M 委任されているとすると、σ’ = 0.002 = 0.2 %
100M 委任されているとすると、σ’ = 0.2 % (この値が飽和サイズのため)

となります。

z0 (=0.2%)に近づくにつれて報酬は増え続けますが、越えてしまうと増加はしなくなります。

プールが飽和していなければσ’ = σと考えてよいと思います。

σa (シグマ・エー)
全体の有効なステークに対する、ステークプールの有効なステークの割合
(プールの有効ステーク / ネットワーク全体の有効ステーク)

有効なステークの相対量で、プールがブロック生成できる確率に関わります。

s (0~1)
T(ADAの流通量)に対する、プールオーナのステークの割合(オーナの有効ステーク/流通量)

s’
s’ = min(s, z0) で表されて、 s、 z0の間の最小値です。

σ’ と同じ考え方ですが

10M 誓約されているとすると、s’ = 0.000369231 ~= 0.037%
65M 誓約 されているとすると、s’ = 0.002 = 0.2 %
100M 誓約 されているとすると、s’ = 0.2 % (この値が飽和サイズのため)

となります。

z0 (=0.2%)に近づくにつれて報酬は増え続けますが、越えてしまうと増加はしなくなります。

プールが飽和していなければ sと考えてよいと思います。

R
エポックで利用可能な報酬の合計

a0 (0~∞の値をとる)
ステーク・プール・オペレータの誓約(Pledge)がプールに与える影響力を示したもので、報酬に影響します。誓約はカルダノネットワークをシビルアタックから守るために必要となります。
例えば、 誓約 がない、もしくは誓約の影響力(a0)が低すぎる状態だと、1人のステーク・プール・オペレータがたくさんのプールを容易に作れ、委任を集め、ネットワークを支配してしまうことが可能になります。51%以上集めることで51%アタックになります。なので誓約を設定することで(報酬が高まり)委任者を引き付けるという設定が大切になってきます。

仮に、この式の中で a0 =0(誓約の影響がなし)とすると

式は単純化され、

R(エポックで利用可能な報酬の合計)と σ’(全体のステークに対する、プールのステークの割合) の積のみで表されます。

β(ベータ)
エポックにおける、全体(全てのステークプール)で生成したブロック数(約21600)に対する、特定のステークプールが生成したブロック数の割合
(プールが生成したブロック数 / ネットワーク全体で生成されたブロック数)

β/σa
プールのパフォーマンスです。

計算式

① エポックごとの「最適な報酬」

エポック277のSUGARステークプールを例として計算していきたいと思います。

最大供給量(Tm=45b)から流通量(T)を引いたADAがリザーブにある状態(未発行のADA)です。

リザーブから毎エポック一定の割合(ρ=0.3%)のADAが取り出され、報酬とトレジャリーへ充てられます。

そのため、時間が経つにつれて、流通しているADAの量は増えていき、対してリザーブのADAが減っていきます。

リザーブの量が減って、そこから取り出す量も減るため、毎エポックにおける報酬が少しずつ減っていくということになります。

今回は正確な流通量の情報が確認が難しかったため、ADApools/potsで確認できるリザーブの量から流通量を割り出しました。

リザーブにあるADA=12155122184.95 のため、
(Reと誤植してましたが、 正しくは「リザーブにあるADA」の表現でした。失礼いたしました。計算自体は別途エクセルでしているため、影響はございません)

T(ADAの流通量)
= Tm(最大ADA供給量) – リザーブにあるADA
= 45000000000 – 12155122184.95
= 32844877815

エポック277において、リザーブから取り出された報酬全体(Re)を確認します。

Re = (Tm-T) *ρ
ρ=0.003

Re = (45000000000 – 32844877815) *0.003 = 36,465,366.555

Reの中から80%がプールの報酬(R)へ割り当てられ、20%がトレジャリーヘ蓄えられます。

R = Re * (1- τ)
τ=0.2

R = 36,465,366.555 * (1 – 0.2) = 29172293.24

「最適なプールの報酬」を計算します。

に、R、a0、z0、σ’ 、s’ を代入して計算するので、これらの変数を確認します。

R= 29172293.24
a0 = 0.3
z0 = 1/k = 1/500 = 0.002

σ’ は、T(ADAの流通量)に対する、プールのステークです。

σ’ = min(σ, z0) で表せて、プールに委任されたステークと、z0の間の最小値です。ADApoolsのプールのRewards情報から取得できます。

SUGARステークプールの有効ステーク = 14413722.46
T(合計流通量) = 32844877815
σ = 14413722.46 / 32844877815 = 0.000438842
σ’ = min(σ, z0) = min(0.000438842, 0.002) = 0.000438842

s’は、T(ADAの流通量)に対する、プールオーナのステークの割合です。

s’ = min(s, z0) で表されて、 プールに誓約されたされたステークと、 z0の間の最小値です。

PoolToolで、プールのReward Accountから確認できます。

SUGARステークプールの誓約されたステーク = 54931
T(合計流通量) = 32844877815
s = 54931 / 32844877815 = 0.000001672437337393
s’ = min(s, z0) = min(0.000001672437337393, 0.002) = 0.000001672437337393

変数が全部そろったので、式に代入します。

f(s, σ) = 9850.183811

これがプールが100%のパフォーマンスの時に得る報酬になります。(実際の計算はエクセルでやりました)
(例: 10のブロックを割り当てられたときに10ブロック生成した場合10/10=1*100=100%)

② プールのパフォーマンス

ただ、毎回同じブロック数を割り当てられ、同じブロック数を生成する(理想のパフォーマンス)わけではありません。

そこに関わってくる、「期待値に対してどれくらいプールにパフォーマンスが出たか」を f(s, σ)に掛け算します。

β/σaで表されるので、まずβを求めます。

βは、全体(全てのステークプール)が生成したブロック数に対する、ステークプールが生成したブロック数の割合です。

全体(全てのステークプール)のブロック数 = 21603.8500507 *
SUGARステークプールが生成したブロック数 = 14
β = 14 / 21600 = 0.000648148

* ADApools/epochsから確認できます。Blocks=21323, missed=1.3% (280.8500507 blocks)
ここでは、全てのブロック数にMissed blocksも含めて計算します。扱いが記載されているドキュメントがありましたら教えていただけますと幸いです。

σa は全体の有効なステークに対する、ステークプールの有効なステークの割合なので、

SUGARステークプールの有効ステーク = 14413722.46
全体の有効ステーク数 = 23196599475 **

σa = 14413722.46 / 23196599475 = 0.000621372

β/σa = 0.000648148 / 0.000621372 = 1.042946758

** ADApools/epochsより

パフォーマンスは約104%ほどになります。

これと最適な報酬として得た f(s, σ) = 9850.183811 を掛け算すると

9850.183811 * 1.04 = 10273.21727

となり、これがプールに支払われる報酬合計になります。

③ プール手数料と報酬

プールに割り当てられる報酬が決まった後、ステークホルダ(手数料、プールの委任者)の中で分配されます。

流れは以下です。

① 固定手数料が引かれ、プールに入ります。
② 委任手数料が引かれ、プールに入ります。
③ 報酬を有効なステーク量の割合に応じて委任者へ分配します。

固定手数料: 340 ADA
委任手数料 0.01 % (エポック277時点)
のため、
プールの手数料 = 340 + (10273.21727 *0.001) = 341.0273217
報酬 (delegators) = 10273.21727 – 341.0273217 = 9932.189951

ADApoolsで答え合わせをしてみますと、下記の通りでした。

まとめ

最初に記載したCardano Doc、EDENプールさんの動画を参考にさせていただきました。(分かりやすい解説ありがとうございました!)

全体として、プールにどれくらいの割合のステークが集まっているか、プールが全体のブロックのうちどれくらい生成を成功させたかで計算されていることが分かりました。ADApoolsと近似値を得ることができました。

また、プールのパフォーマンス、Luckについてももう一歩理解が深まったと思います。

最終的に20 ADAほどの差分があったのはどこかで考慮や確認不足があるためと思いますので、引き続き、確認出来たら更新したいと思います。

考えられること
・取得したデータに工夫が必要?: ADApools/pots で、エポックの一行を足すと45bになるのですが、式やドキュメントにはワードとして入っていないRewars、Depositsなどがあります。今回はすべて「流通量の合計」として計算しています。

→ 実際はLovelace(1ADA = 1000000 Lovelace)という単位で計算されるため端数が丸められた可能性はあります。

・Missed blocksの扱い: 今回は「全体のブロック」としてカウントに入れると考えました(入れないと大きく結果の数値が合わなくなるため。Missed blocks分の報酬はどこへ行くのか?)

・手数料の扱い: 手数料を加えて計算すると10 ADAほど報酬 (delegators) が増えてしまいます。

・ADAの流通量合計: 今回の記事を書くにあたって、サイトによって確認できる値が違いました。どこの断片を取得するか、考え方により値が変わってくる可能性が考えられます。BlockfrostのAPIを使った場合も断面的な流通量を取得することが難しそうです。

今後関連ドキュメントや、サイト仕様など調べてみたいと思います。

長い記事を最後までお付き合いいただきありがとうございました。

疑問点や、ここはこうではないか、などありましたらご指摘いただけますと幸いです。

よろしければ、SUGARステークプールとステーキングのご検討もよろしくお願いします。