[Symbol] ハーベスト確率の考察

この記事は [nem Advent Calendar 2021](https://qiita.com/advent-calendar/2021/nem) 12日目の記事です。
[QUEST](https://quest-bc.com/quest/V1Smw7AkLr0FptVnR07a)にて投げ銭いただいた方々、ありがとうございます。

# 概要
- Symbolのハーベスティングとは？
- ハーベスト確率について
- ハーベスト期待値シミュレータの紹介

# Symbolのハーベスティングとは？
雑に説明すると、ブロックチェーン取引の認証作業のことで、ビットコインのマイニングのようなものです。
ビットコインのコンセンサスアルゴリズムは **PoW(Proof of Work)** といい、多大な計算量を要する問題（＝特定の条件を満たすハッシュを探す）を最初に解いたものにブロックの承認権を与えています。
それに対して、Symbolのコンセンサスアルゴリズムは **PoS+(Proof of Stake+)** です。
PoS+は3つの要素から成り立っており、これらを基準にブロックを生成する確率が決まります。
1. **コインの保有割合(Stake Score)**
2. **ネットワークへの貢献度(Transaction Score)**
3. **ノードを運営しているか(Node Score)**

## ハーベスティング要件
1. **インポータンススコアが0以上であること**
1. **ノードを運用している or ノードに委任（デリゲートハーベスティング）している**

の2つです。
0より大きいインポータンススコアを獲得するためには、10,000以上のモザイク（xym）を保有している必要があります。
よく「Symbolでハーベストするには1万xym必要」と見ますが、これはインポータンススコアを0以上にするために必要な要件なのです。
また、インポータンススコアは720ブロック毎（約6時間）に計算され、**直近の2つのスコアで小さい方** が使用されます。
新たにウォレットを作成してハーベストを開始するには、1万xymをウォレットに入れてから最大1440ブロック（約12時間）でインポータンススコアが確定し、ようやくハーベスティングが有効化します。


## 報酬
前述したインポータンススコアを元にランダムにアカウントが選ばれ、ブロックに署名を行います。
ブロックに署名を行ったアカウントは、ハーベスト報酬が得られます。
このハーベスト報酬の内、5%はネットワーク保全のための税金として取られます。
また、残りの95%に対して25%はノード運用者に手数料として取られます。
委任ハーベスターの場合は、**ハーベスト報酬全体の95%×75% = 71.25%** が報酬となります。

**ハーベスト報酬＝インフレ報酬＋トランザクション手数料**

また、ハーベスト報酬にはインフレ報酬が設定されており、ブロックの経過とともに最終的に0まで減っていきます。
下記は[Daoka](https://twitter.com/DaokaTrade)さんが作成された、インフレ報酬の推移の表です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183156/541d17d5-bc95-6e6e-fe1a-28db3333b4b9.png)

https://twitter.com/DaokaTrade/status/1373044880650293248

# ハーベストの確率について
```math
ハーベスト確率 = \frac{自分のインポータンススコア} {有効なインポータンススコアの合計}
```
完全に自分のインポータンススコアに比例した確率でハーベストの機会が訪れます。

## インポータンススコアの計算
```math
インポータンススコア = 0.95S + 0.05A
```
95%を占める*S*は**コインの保有割合(Stake Score)**で、残りの5%*A*は**アクティビティスコア(Activity Score)**です。
ほぼステーキング量が決め手と言っても過言ではないですね。

### Stake Score
```math
S(Stake Score) = \frac{自分のxym数量} {全アカウントの合計zym数量}
```
※全アカウント = 10,000xym以上保有アカウント

### Activity Score
```math
A(Activity Score) = \frac{自分の絶対アクティビティスコア} {全アカウントの絶対アクティビティスコアの合計}
```
※全アカウント = 10,000xym以上保有アカウント

### 絶対アクティビティスコア
```math
絶対アクティビティスコア = \frac{10000} {自分のxym数量} (0.8T+0.2N)\\
```
```math
\begin{align}
T(TransactionScore) &= \frac{自分が支払った手数料} {全アカウントが支払った手数料の合計} \\
N(NodeScore) &= \frac{自ノードでのハーベスト回数} {全アカウントのハーベスト回数} 
\end{align}
```
※全アカウント = 10,000xym以上保有アカウント
**絶対アクティビティスコアの式の分母に自分のxym数量**があるので、少ない保有量の方がスコアは高くなります。
これによって、保有量が少ないほど支払った手数料や運営するノードでのハーベスト回数がインポータンススコアに大きく影響してくることになります。
これが単純なPoSとは違うSymbolならではな面白い仕組みですね。
ただ、このアクティビティスコアはインポータンススコアに対して5%の影響しか及ぼさないので、やはりステーキング量が重要だということが分かります。

# 実際に計算してみる
保有xym数量が少ないほどアクティビティスコアの恩恵が受けられるのですが、実際に1万xymのアカウントでどれほどハーベストする確率が変わってくるのかを計算してみようと思います。
最大のアクティビティスコアが得られる下記なシチュエーションと仮定します、

1. 自分の保有数は1万xym
1. ハーベスト参加アカウントのxym合計は2億xym
1. 計算期間（720ブロック）内の手数料全量の1%を自分が支払った
1. 計算期間（720ブロック）内のハーベストの1%が自分の運用するノードで発生した
1. 自分以外の絶対アクティビティスコアの合計は0

（自分以外の絶対アクティビティスコアの合計が0な時点で、3,4の計算は不要ですが試しに計算してみます）

```math
\begin{align}
絶対アクティビティスコア &= \frac{10,000} {10,000} (0.8\times0.01+0.2\times0.01)\\
&= 0.01\\
A(Activity Score) &= \frac{0.01} {0.01} \\
&= 1\\
S(Stake Score) &= \frac{10,000} {200,000,000}\\
&=0.00005\\
インポータンススコア &= 0.95\times0.00005 + 0.05\times1\\
&= 0.0500475
\end{align}
```

となります。
アクティビティスコアが0の場合だとインポータンススコアは`0.0000475`なので、なんと1000倍以上もハーベストの確率が上がります。
これは、1000万xymを保有しているアカウントと同等のハーベスト確率です。
（実際に自分以外の絶対アクティビティスコアが0になることはあり得ませんし、720ブロックの取引手数料の1%を自分が支払えることもあり得ませんので、このようなことにはなりません）

# ハーベスト期待値シミュレータの紹介
実際問題、ほぼ全てのアカウントのアクティビティスコアは限りなく0に近いと思っています。
ハーベストに参加しているアカウント全員のアクティビティスコアが0であるとみなした場合、インポータンススコアの計算はステーキング量のみに依存する形になるため、

```math
ハーベスト確率' = \frac{自分のxym数量} {全アカウントの合計zym数量}
```

となります。
また、Symbolは1日に2880ブロックを生成するので、上記の確率に2880を掛けると**1日あたりの平均ハーベスト回数**（の期待値）が算出できます。
これにその時点のxymの価格を掛けると日利（の期待値）が計算でき、さらにそこに365を掛けると年利（の期待値）が計算できます。
[ハーベスト期待値シミュレータ](https://docs.google.com/spreadsheets/d/1Ri14S9i8NJWKjP2AOaFoxMtgrnfhW5vAianw1USWVpo)に1万～100万xymまでの、**期間ごとのハーベスト回数**、**期間ごとの収益**の期待値を計算していますのでご自由にお使いください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183156/c97b6f1f-e642-3ad4-aa33-66dcc3b02291.png)