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

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

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

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

しかし、ステーキングについて調べた時によくみるこの式はとても気になっていました。

委任をしている中で、どういう流れで報酬を受け取っているのだろうと、気になったことのある方も多いのではないでしょうか。

この記事では式で使われている変数を一つ一つ確認します。

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

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

最終的な計算結果は、サイトによって若干の違いがみられ、私の計算結果も実報酬と乖離があります。

今後も論文や、ドキュメントを調べていきたいと思いますが、結果は大きくは外れておらず、ご参考値としては使えるのかなと思い記事にいたしました。

ご不明点、ここはこうじゃないかという点等がございましたら教えていたけますと幸いです。

今回の話をかみ砕いた内容の記事はこちら

概要

2021年8月時点で、未発行のADAは約122億 ADA、市場流通量は約328億 ADAになります。

報酬は、リザーブと呼ばれる未発行のADAと、送金時などの手数料をもとにポッドへ集められます。(論文にはデポジットも書かれていますが、Cardano Docには書かれていなく、計算に加えると結果が大きく変わってしまうため今回は割愛しています)

その後、下記へ分配されます。

・プールへの報酬
・トレジャリーへの蓄え(開発などの資金として)
・リザーブへ返還

「リザーブへ返還」については、誓約金が満たされておらず報酬が支払われなかった、市場に供給されたADAすべてが委任されているわけではない、などが理由に挙げられます。

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

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

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

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

参考資料

Cadrdano DocsのPledging and rewards

統計的な情報:ADApools, PoolTool

参考動画: [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時代当初はIOGがほとんどのブロック生成を担っていました。IOGとコミュニティプールの割合を示すパラメータです。徐々に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エポック = 5日 = 432000秒なので、合計で 432,000/20 = 21,600ブロックとなるようです。そのため、ここでは21,600として計算していきます。Design Specification for Delegation and Incentives in Cardano を確認すると、この割合を掛け算することで、missed blocksを取り扱っています。

Rt

エポックにおける利用可能な報酬の合計。min(η,1)(Tm-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 が今のプールの飽和サイズになります。

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

σ (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の流通量)
= T (最大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 = Re * (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, σ)に掛け算する必要があります。

パフォーマンスは下記で表されます。

画像7

まずβを求めます。

βは、全体(全てのステークプール)が生成したブロック数に対する、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

委任者のリワード = 10281.41718 – 340.9941417
= 9940.423038

計算結果と、実際の値は下記となります。

  • ADApools: 9908.6388 ADA
  • Cardanoscan: 9915.1064 ADA
  • ブロックチェーンから取得した値: 9908.638757 ADA

計算結果の方が30 ADAほど高い結果となりました。

実際はすでに計算、記録されているため、ツールによりデータを直接取得することが可能です。

まとめ

最初に記載したCardano Doc、EDENプールさんの動画を参考にさせていただきました。
* 以前「手数料の扱い」と「Missed blocksの扱い」については疑問があったのですが、論文を参考に手数料、実ブロック生成数などの計算を加えております。

全体として、下記の二点が重要な要素として計算されていることが確認できました。

  • 全体に対して、プールにどれくらいの割合のステークが集まっているか
  • 全体のブロックのうち、プールがいくつのブロック生成を成功させたか

最終的に30ADAほどの差分があったことについては、引き続き、確認し記事も更新したいと思います。

考えられること
・取得したデータに工夫が必要?
ADApools/pots で、エポックの一行を足すと45bになるのですが、式やドキュメントにはワードとして入っていないRewards、Depositsなどがあります。(論文には報酬としてカウントするように書いてあります)などがあります。市場に出ているという意味で、今回はすべて「流通量の合計」として加えて計算しています。

・計算通貨の単位?
今回はADAの単位で計算をしてみました。実際はLovelace(1ADA = 1000000 Lovelace)という単位で計算されるため端数が多少丸められた可能性はあります。こちらは大きな影響はありません。

・流通ADAの合計?
一番大きな要素としては、今回の記事を書くにあたって、サイトによって確認できる流通量の値が違いました。Blockfrost というツールを使い、ブロックチェーンから情報を確認してみたところ、「あのエポック時点での流通量」という情報の取得は難しいことがわかりました。どこの断片のデータを取得するかにより結果が変わってくる可能性が考えられます。

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

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

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

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