Solana validator を建てるメモ

https://docs.solana.com/running-validator/validator-start

https://www.nodes.guru/solana/setup-guide/en

基本は手順に沿えばいけます.

ただ, ネット回線速くないとだめでした(validator になって validator 報酬もらう場合. 100 Mbps ~ 1 gbps は必要そう).

devnet(開発用), testnet(mainnet 運用の前のテスト用) での接続例は

https://docs.solana.com/clusters

にあります.

testnet の場合, genesis hash や known validators を指定しないとうまくいかないっぽいようです.

運用編はこちら:

Solana testnet validator を運用するメモ
https://qiita.com/syoyo/items/359a5f7b7c81683e2acf

## Solana validator 情報

https://docs.solana.com/validator/anatomy

validator = geth でいう full node + voting による PoS という感じでしょうか.

Solana では PoH(Proof of History)という仕組みでつよつよな PC がいります(しかし PoW のようにべらぼうにたくさん計算機を並べて処理する必要はない).

https://medium.com/solana-labs/proof-of-history-a-clock-for-blockchain-cf47a61a9274

https://solana.com/solana-whitepaper.pdf

ここでは PoH あり(Voting で $SOL で報酬がもらえる)で話をしますが, full node 相当(Solana ネットワークを解析したりとか, Solana チェーンでの取引を自前サービスに組み込む)だけでよければ HW 要件などは下げることできるでしょう.

## HW 構成

https://docs.solana.com/running-validator/validator-reqs

それなりのスペックを要求しますが, とりあえず動かすのであれば, 8 コア + 32 GB mem くらいあれば大丈夫です. ストレージは SATA SSD でもいけるかもですが, NVMe SSD がよいでしょう.

Threadripper 1900X(8 core) + 64 GB mem + NVMe SSD 1TB(空きは 500GB)で動作確認しました.

理想は VPS やクラウドで GPU インスタンスですが, GPU 月だと少なくとも月 10 万円以上コースになってしまいます...

自前でつよつよ CPU/GPU があればネットワークだけ転送して自前 PC で処理させたいですよね(=> ネットワーク太くないとダメだった)...

どうしても Solana validator 建てたいというひとは, とりあえず Solana Validator Hosting サービス使いましょう(月額 8 万円くらい)

https://enterprise.nitrado.net/solana-validator-hosting/

ただ, validator のスコアはデータセンターロケーションにも影響ありますので, 他に validator がホスティングされている場合は注意が必要です.
(特定のデータセンター(地理)に集中していると, データセンターが落ちたときに validator も落ちてしまうため, スコアが下がる)

## ネットワーク構成

8000 ~ 11000 あたりの port(UDP 含む)を開放する必要があります. しかしルーターで開放するのが無理か困難, (セキュリティ上)やりたくないケースもあります.

reverse ssh ポートフォワーディングでローカル PC のサービスを外部公開するメモ
https://qiita.com/syoyo/items/969f48ce2ce55713056d

という手もありますが, ポートごとにコマンド建てる必要がありめんどいです(UDP ポートで 10 個くらい必要). また UDP のフォーワードがどうもうまくいかず(UDP -> TCP ssh -> UDP), solana validator 動きませんでした.

結局のところは OpenVPN で validator node とエントリポイントとなる踏み台(proxy)ノードを同一 IP にし,  nginx の udp proxy でフォワードすることで対応しました.

こんな感じです.

```
                               +---------- VPN -------------------------+
                               |                                        |
<internet>  --------- <global ip/10.8.0.1> --------- <10.8.0.6>         |
                         gateway node               local node node     |
                            (nginx)                 (solana validator)  |
                           OpenVPN server           OpenVPN client      |
                               |                                        |  
                               +----------------------------------------+   

```


## とりあえずテストしてみる

`solana-test-validator` でテストできます. ここで Slot をうまく処理できるかどうか確認しましょう.

## GPU

今の所 GPU 使うほどではないですが, そのうちトランザクション増えてきたら GPU で処理が必要になるかもです.

prebuilt は CUDA 10.2 までです.

CUDA 11 とか, 動かす場合は GPU module をソースからビルドする必要があります.

https://github.com/solana-labs/solana-perf-libs

これをビルドすればいいです. nvcc にパス通って入ればとくにはエラーでないと思いますが, コンパイルが遅いのでビルドに時間かかります.

あと, 未検証ですが OpenCL backend もいけるかもしれません.

## PoH の処理速度

PC の性能かネットワークが遅いと PoH(Proof of History) のトランザクションが捌けずエラーがでます. あとはソースからビルドしたときに debug ビルドにしたときとか(`cargo build --release` でリリースビルドにしましょう)

とりあえず無理やり動かすには, エラーログにあるように

`--no-poh-speed-test`

を追加します. ただ, 動きはしますが処理が遅くてトランザクションをさばききれずどんどん遅れていって結局最新に追いつけない(追いつけたどうかは `solana catchup` で確認できます)のでエラー出たらおとなしくどこがボトルネックか調べて対応するのがよいです.

10 MB/s なネットワークではだめでした.
40 ~ 50 MB/s くらいは必要そうです.

80 MB/s でしたら catchup できました.

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">建った建った！ Solana☀️の Validator が testnet で建った! 🥰 Threadripper 1900X + 64 GB mem で catchup できました. ネット速度最低 20~40 MB/s(上り降り) は必要そう(80 MB/s 時 catchup +10 slots/sec でした. catchup できなかった環境での速度は 10 MB/s くらい). <a href="https://t.co/NkH3lwCXdy">pic.twitter.com/NkH3lwCXdy</a></p>&mdash; Syoyo Fujita 🌸 レイトラ ® 🐯 3 周年 🎉 (@syoyo) <a href="https://twitter.com/syoyo/status/1390621970367057920?ref_src=twsrc%5Etfw">May 7, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

### solana catchup

private-rpc を使っている場合は `--our-localhost [port]` の指定が必要です.

https://github.com/solana-labs/solana/issues/8407

https://www.nodes.guru/solana/setup-guide/en

## 注意点

mmap ファイル数の増加と, nofile(一度に開けるファイル数) の上限を上げておかないと, validator がout-of-memory で落ちるので気をつけましょう.
(10~20 分くらいかけてスナップショットファイル(500 MB くらい)を落としたあとに発生するので気づきにくくてめんどい)

https://explorer.solana.com/

2021/08/31 時点では 1,800 TPS(transactions per second)でスナップショットが 1.8 GB になっていました.
Solana は最大 6.5 万トランザクション/秒対応しているっぽいので, そのうちスナップショットが数 10 GB になってしまうかもしれません.

### port forward off?

port forwarding のチェックを強制的に off にして validator 動かすことも一応できます.

ただ, この場合はいくつかの機能が disable されるかもです.

### snapshot の毎回ダウンロード?

validator を立ち上げ直したり, 途中でエラーやセグフォで終了すると, 再度 snapshot(500 MB)ダウンロードやり直しになるようです.
peer との帯域が遅いとこれのダウンロードに 10~20 分くらいかかるので, validator がうまく動かずデバッグするときはめんどいです.

## log rotation

ログ自体結構な量になります(INFO を suppress する手もあるのかもしれませんが)

https://docs.solana.com/running-validator/validator-start#log-rotation

validator プロセスに `USR1` を送ると log ファイルを開き直すので, これを logrotate と組み合わせるのを推奨しています.

`USR1` でファイル開き直しは nginx などサーバプロセスでよく使われているようですね.

https://qiita.com/white_aspara25/items/7c0352cb2c24e5d7268b

## Proxy 経由にする

Validator はクラスタ化するのができますので, Proxy 経由にするのがよさそうです!

https://github.com/project-serum/validators#running-a-cluster-of-validators

https://medium.com/everstake/securing-solana-validator-rpc-with-nginx-server-fbf2cd8a31a8

セキュリティの向上にも期待できます.

最近は DDoS 対策などのために生 UDP ではなくて  QUIC 対応始まりましたが(2022/07 時点では testnet のみで有効), クラスタ化するときもその間は QUIC 化できるのカナ? :thinking: 

proxy で受けて, データは zstd などで圧縮すれば回線細い先で validator 動かす場合でもワンチャンあるかも!?

## validator 情報

keybase(というアプリ)と連携しています. まずは keybase にアカウントを作っておきます.

https://docs.solana.com/running-validator/validator-info

を参考にしてファイルをアップロードすればいけます!
(pubkey ファイルがあるかどうかで判断し, validator 情報を更新する)


## Delegation criteria

Foundation delegation を受けるための基準

https://solana.foundation/delegation-criteria#testnet


## commission rate の変更

デフォルトでは 100%

https://docs.solana.com/cli/usage#solana-vote-update-commission

```
solana vote-update-commision ...
```

で変更する.

## 収益

まず費用として, PC の費用(クラウド, VPS など使っている場合はその費用も) + validator として参加するのに最大 1.1 SOL/day 搬出しないといけない.
(2021/04/27 時点 1 SOL 5,000 円(!)くらい)

少なくとも 1.1 SOL/day + PC 費で, 20 万/月くらいはでていきそうです(PC 代は年 50 万想定).

収入としては validation による fee 収入があります.

https://docs.google.com/spreadsheets/d/1g7-Rw4uswIDQ1cppwV8kDIWMBhJe9rO20u8eb2SCUz8/edit#gid=617442442

それに加えて, delegation による commission 収入(`$SOL` 自体 Staking で今は年 9.5 % くらい(これは年が経つごと減っていくが)得られるので, それに delegation する. commission 率は自由に決められるようだがだいたい 8% くらい?(つまり 9.5% の収益に対する 8%))があります.

delegation fee については, 上記シートを参考にすると, validator だけの場合の break even が `$SOL` 320 だとするとそれのおよそ 100 倍 32,000 `$SOL` くらいを集める必要があります.

ただ, 上記シートは少し古く `$SOL` 13 USD くらいのときです. 今は 5000 円くらいですから, `$SOL` 値上がりで支出も増えますから, 少し収益出すくらい(年 150 万の収益)には 10 万 `$SOL` くらい必要になります. 日本円で 5 億円くらい集める必要があります. 

いい(?)振る舞いをする validator node には staking の delegation が集まり, validator の手数料収入を得られる... となります(どのようにして集めるかは, 君の腕のみせどころ!).

https://www.stakingrewards.com/earn/solana

トップの Validator は 500 億円くらいぶんの `$SOL` を集めています. 単純計算で Validator の delegation 収益は 500 億円 * 9.5% * 8% = 3.2 億円/年の収益になるのでしょうか?
(`$SOL` 価格が変わるので, 要調整(しかし基本的には $SOL が上昇すると思われるので, より収益は大きいであろう))

ただ, 自身が `$SOL` を搬出せず今からここまでの `$SOL` を他者から集めるには相応の苦労が必要そうな気もします...
(Delegate してくれるのは, `$SOL` で財を成して余りまくっている富裕層くらいしかいなさそう...ですが, validator が分散していないっぽいので Solana 財団自体がいくらか delegate してくれるっぽい)

ステーキングでは APR 9.5% なので, 普通の庶民は DeFi で `$SOL` 増やしたほうが得ですし.

税金面とかで `$SOL` HODL したほうがいいってひとから集めるのがいいのでしょうか?

## Tour de SOL

https://solana.com/validator-registration

テストネットの Validator として寄与すると $500 ぶんの Sol 報酬がもらえるっぽいプログラム(しかしそろそろ終了っぽい).

Solana 自体は Permission-less(Decentralized)なので, validator として参加するには特に登録などはいらない. なにか寄与して $SOL 報酬ほしいときに regist してね, という感じです.

## Delegation program

Tour de SOL の変わりに Delegation program が始まりました. ただ申し込んでも順番待ちで数ヶ月かかるっぽいです.

https://forums.solana.com/t/foundation-delegation-program-community-faq/2033
 
## TODOF

* [x] どれだけの性能の PC があればよいか(GPU あるといいのか?) + $SOL がどれだけ得られるか検証する
  * validator fee だけだと年間 1000 `$SOL` くらい稼げばいけるか 
  * それ以上は delegation 増やして delegation の収入を狙うことになる.  
* [ ] Validator のクラスタを作って処理性能上げる
  * エントリポイントは VPS 上で, トランザクションさばくのだけローカルのつよつよ GPGPU マシンに転送するとかできるかな? 
  * https://github.com/project-serum/validators
  * クラスタ構成にする場合もいずれにせよネットワーク帯域はそれなりが必要そう