
誓約と報酬の計算式について
報酬が支払われるまでの計算

エポックごとの報酬計算において、プールに割り当てられる報酬はこの式で表されます。
最初に見た時は、変数がどのような意味を持つのかわからなかったので、私自身読み進むのが難しいと感じていました。
しかし、ステーキングについて調べた時によくみるこの式はとても気になっていました。
委任をしている中で、どういう流れで報酬を受け取っているのだろうと、気になったことのある方も多いのではないでしょうか。
今回は式で使われている変数を一つ一つ確認します。
その後に、計算に必要な数値をADApoolsやPoolToolなどから取得して、式に当てはめて計算してみたいと思います。
最終的にプール報酬がADApoolsなどと近い値が得られるか確認していきます。
最終的な計算結果は、サイトによって若干の違いがみられ、私の計算結果も実報酬と乖離があります。
今後も論文や、ドキュメントを調べていきたいと思いますが、結果は大きくは外れておらず、ご参考値としては使えるのかなと思い記事にいたしました。
ご不明点、ここはこうじゃないかという点等がございましたら教えていたけますと幸いです。
今回の話をかみ砕いた内容の記事はこちら
概要

報酬は、リザーブと呼ばれる未発行のADAと、送金時などの手数料をもとにポッドへ集められます。(論文にはデポジットも書かれていますが、Cardano Docには書かれていなく、加えて計算すると大きく結果が変わってしまうため今回は割愛しています)
その後、下記へ分配されます。
・プールへの報酬
・トレジャリーへの蓄え(開発などの資金として)
・リザーブへ返還
「リザーブへ返還」については、誓約金が満たされておらず報酬が支払われなかった、市場に供給されたADAすべてが委任されているわけではない、などが理由に挙げられます。
報酬がウォレットに届くまでの流れ(計算)は下記になります。
① 特定のプールが受け取ることのできるすべての利用可能な報酬は下記の式(先ほどの式)で表されます。エポックにおいて、パフォーマンスを100%だした時のプールに割り当てられる、最適な報酬合計となります。(実際の報酬量はブロック生成のパフォーマンスも影響を受けるため、ほとんどの場合この値と完全一致はしません)

② 次に①に対してプールの成功したブロック生成数に応じたパフォーマンスを掛け算し、実績に即した報酬が計算され、プールへ報酬が割り当てられます。(100%であれば①の値がそのまま導き出されます)
③ ②で得られた報酬をプール内で、プールへの固定費用、手数料を差し引き、ステーク量に応じて委任者に分配されます。私の検証ではぴったりにはならず、数ADAの差分が出ました。
参考資料
Cadrdano DocsのPledging and rewards
統計的な情報:ADApools, PoolTool, Cardanoscan
参考動画: [EDEN] プールさんの動画
論文: Design Specification for Delegation and Incentives in Cardano
全体を通して、例として使用するステーク量などの数値、下記の固定パラメータは2021年8月時点のものになります。
k=500
d=0
ρ=0.03
τ=0.2
a0=0.3
関連パラメータ
関係する変数の説明です。
解説もしながら計算していきます。
ここだけでは読みづらいと思うので、補足としてお使いください。
kパラメータ
ネットワークが完全に飽和する時の必要なプール数(最適なプール数)なので、kの数が大きくなれば分散化が進んでいることになります。2020年12月時点で、k=500で、飽和レベルは約64M ADAになりました。500プールに約64M ADAの委任が集まった状態が報酬分配として最適な状態となります。実際はすでに2000以上のプールがあり、ステーク量も分散されているので、あくまでも「最適な」値です。
dパラメータ
分散化パラメータです。ネットワークの安定のため、IOGがノードを運営していた時期があります。Shelley期当初はほとんどのブロック生成を担っていました。その割合を示すパラメータです。これでは中央集権型ですが、徐々にSPO(ステーク・プール・オペレータ)のノードがブロック生成する割合が増え、d=0に近づいていき、2021年3月末にゼロに設定されました。(今回の記事では使用しませんが、0.8以上かそれより低いかでプールパフォーマンスや報酬に影響があったという経緯があります)
ρ(ロー)
エポックごとに、リザーブ(未発行のADA)からADAが取り出され、仮想ポッドへ移動し報酬に充てられます。その割合がρで、0.3%に設定されています。0.3%の場合、リザーブが半分になるのに4~5年かかります。
ρが高ければ報酬やトレジャリーへの貯えも多くなる半面、リザーブの枯渇が速くなるため、ステークホルダーに対する長期目線の考え方(報酬への魅力)とトレードオフになります。
τ(タウ)
エポックごとに発生する報酬の全体から、トレジャリーへ蓄えられる割合で、20%に設定されています。トレジャリーはCatalystに関わる開発資金などへて充てられます。
T∞
最大ADA供給量(45,000,000,000)
表現が複数あるようなので、論文に記号を合わせます。
T
ADAの流通量(市場に出ている合計: 2021年8月時点で、約32,800,000,000)
η(イータ)
エポック内で実際に生成されたブロック数と生成される期待数の比率です。
期待されるブロック生成について、「Slots and epochs」によると、平均して20秒ごとに1ノードがブロック生成に指名されるようになっており、1エポックとしては合計で21,600ブロックとなるようです。そのため、ここでは21,600として計算していきます。Design Specification for Delegation and Incentives in Cardano を確認すると、この割合を掛け算することで、missed blocksを取り扱っています。
Rt
エポックにおける利用可能な報酬の合計。min(η,1)ρ(T∞-T) + トランザクション手数料です。一定の割合ρでリザーブから取り出され、それにトランザクション手数料を加えたもの。
トランザクション手数料はあらかじめ予測できないですが、ADApoolsで過去の手数料を確認できます。
min(η,1)に関しては、Ouroboros ClassicとOuroboros Praosで扱いが違うようです。論文の中には書かれているため、今回は付け加えて計算いたします。
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 が2021年8月時点のプールの飽和サイズになります。
流通量は増えていくので飽和サイズも増えます。
σ (0~1)
T(ADAの流通量)に対する、プールのステークです。(有効ステーク/流通量)
プールオーナの誓約金と委任者のステークを含みます。
σ’
σ’ = min(σ, z0) で表せて、σ、 z0の間の最小値です。例として、
10M 委任されているとすると、σ’ ~= 0.0003
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.0003
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 のため、
T(ADAの流通量)
= Tm(最大ADA供給量) – リザーブにあるADA
= 45000000000 – 12155122184.95
= 32844877815
エポック277において、ポッドへ取り出された報酬全体(Rt)を確認します。手数料を加えることで、報酬全体となります。
Rt = min(η,1)ρ(Tm-T) + 手数料
ρ=0.003
実ブロック生成合計=21323 *
η=実ブロック生成数合計/エポックで生成されるブロック期待数
=21323/21600
=0.987
手数料=30145
Rt = 0.987 * 0.003 * (45000000000 – 32844877815) + 30145
= 36021461.79
* エポック277のブロック生成数と手数料はADApoolsから確認しました。
Rtの中から80%がプールの報酬(R)へ割り当てられ、20%がトレジャリーヘ蓄えられます。
R = Rt * (1- τ)
τ=0.2
R = 36021461.79 * (1 – 0.2)
= 28817169.43
次のステップは、リワードポッドに集められた利用可能な全体の報酬から、それぞれのプールへ報酬の割り当てがされていきます。

1プールに対する、「最適な報酬」を計算します。

に、R、a0、z0、σ’ 、s’ を代入して計算するので、これらの変数を再確認します。
R= 28817169.43
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, σ) = 9730.27432
これがプールが100%のパフォーマンスの時に得る報酬になります。(実際の計算はエクセルでやりました)
(例: 10のブロックを割り当てられたときに10ブロック生成した場合10/10=1*100=100%)
② プールのパフォーマンス

毎回同じブロック数を割り当てられ、同じブロック数を生成する(理想のパフォーマンス)わけではありません。
そこに関わってくる、「期待値に対してどれくらいプールにパフォーマンスが出たか」を上で得たf(s, σ)に掛け算します。
パフォーマンスは下記で表されます。

まずβを求めます。
βは、全体(全てのステークプール)が生成したブロック数に対する、1ステークプールが生成したブロック数の割合です。様々なランダム要素の結果になります。(スロットリーダ選出、ネットワーク、他のプール、など)
全体(全てのステークプール)のブロック数 = 21323
SUGARステークプールが生成したブロック数 = 14
β = 14 / 21323
= 0.000656568
* Blocks(=21323)はADApools/epochsから確認できます。
σa は全体の有効なステークに対する、ステークプールの有効なステークの割合なので、
SUGARステークプールの有効ステーク = 14413722.46
全体の有効ステーク数 = 23196599475 **
σa = 14413722.46 / 23196599475
= 0.000621372
β/σa = 0.000656568 / 0.000621372
= 1.056642068
** ADApools/epochsより
よってパフォーマンスは1.057ほどになります。
これと最適な報酬として得た f(s, σ) = 9730.27432 を掛け算すると
9730.27432 * 1.056642068 = 10281.41718
となり、これがプールに支払われる報酬合計になります。
③ プール手数料と報酬

プールに割り当てられる報酬が決まった後、ステークホルダ(手数料、プールの委任者)の中で分配されます。
流れは以下です。
① 固定手数料が引かれ、プールに入ります。
② 委任手数料が引かれ、プールに入ります。
③ 報酬を有効なステーク量の割合に応じて委任者へ分配します。
固定手数料: 340 ADA
委任手数料 0.01 % (エポック277時点)
のため、
プールの手数料 = 340 + (10281.41718-340) *0.001
= 340.9941417
報酬 (delegators) = 10281.41718 - 340.9941417
= 9940.423038
となりました。
ADApoolsでの値を確認すると9908.6388ADA
Cardanoscanでは9915.1064
ブロックチェーンから取得した値は9908.638757
でした。
計算結果の方が30 ADAほど多い結果となりました。
実際はすでに計算、記録されているため、ツールによりデータを直接取得することが可能です。
まとめ
最初に記載したCardano Doc、EDENプールさんの動画を参考にさせていただきました。
全体として、プールにどれくらいの割合のステークが集まっているか、プールが全体のブロックのうちどれくらい生成を成功させたかで計算されていることが分かりました。ADApoolsと近似値を得ることができました。
また、プールのパフォーマンス、Luckについてももう一歩理解が深まったと思います。
最終的に30ADAほどの差分があったのはどこかで考慮不足があるためと思いますので、引き続き、確認し記事も更新したいと思います。
考えられること
・取得したデータに工夫が必要?
ADApools/pots で、エポックの一行を足すと45bになるのですが、式やドキュメントにはワードとして入っていないRewards、Deposits(論文には報酬としてカウントするように書いてあります)などがあります。市場に出ているという意味で、今回はすべて「流通量の合計」として計算しています。
・計算通貨の単位?
今回はADAの単位で計算をしてみましたが、実際はLovelace(1ADA = 1000000 Lovelace)という単位で計算されるため端数が多少丸められた可能性はあります。こちらは大きな影響はありません。
・ADAの流通量合計?
一番大きな要素としては、今回の記事を書くにあたって、サイトによって確認できる流通量の値が違いました。Blockfrost というツールを使い、ブロックチェーンから情報を確認してみたところ、「あのエポック時点での流通量」という情報の取得は難しいことがわかりました。どこの断片のデータを取得するかにより結果が変わってくる可能性が考えられます。
今後、関連ドキュメントや、サイト仕様など機会があれば調べてみたいと思います。
長い記事を最後までお付き合いいただきありがとうございました。
疑問点や、ここはこうではないか、などありましたらご指摘いただけますと幸いです。
よろしければ、SUGARステークプールとへの委任のご検討、ご協力をよろしくお願いいたします。