Solana mainnet Jitoバリデータを建ててみた

# 1.ごあいさつ
こんにちは！pico🙄.solです

前回の記事がドヤ天でbotはさっぱり儲からなくなりました！
前回の記事の後編の代わりに過去を懐かしむ回顧記事を、JUP上場戦がひと段落した辺りに書こうと思います

今回はSolanaのメインネットバリデータってどのくらい儲かるのん？という皮算用から実際にバリデータを立てるまでのプロセスを記事にしてみました

すでにtestnetバリデータを運用されている方を主に対象にしています。

~~え、バリデータなんて運用してないよという方は、EnvbestさんのTDS'22に関する記事をご参照ください
簡単に言うと、
「月700～1000ドルくらいのサーバーを借りてTestnetバリデータを運用すると毎月サーバー代の最大2倍の1年ロックSOLがもらえるよ」
というものです~~

TDS'22は2024年3月で終了しました。今後は6か月間$250のサーバー代補填があるみたいな超縮小版になるようです

https://note.com/envbest/n/n78612f831f57

# 2. Solanaメインネットバリデータの皮算用
## 2.1　今までの経緯

TDS'22というTestnetバリデータのインセンティブプログラムに参加していまして、onboarding（←メインネットでも財団から委任してもらえる資格のようなもの？）間近になってきました

１年３ヶ月ほどTestnetで運用していまして、現在順番待ち6位。1週間に25くらいonbordingされていくらしい

![20240124105109.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961158/732428a6-a0dc-978f-eac4-c77729e621d6.jpeg)

もともとメインネットやるつもりはなかったのですが、財団からメインネットで委任をもらうには、onboardingから10 epoch以内にメインネットバリデータを稼働させなくてはいけないらしく、今のうちに皮算用してみようと思いました

なお結論を先に言うと、最初から赤字になることはないけど満足いく利益をあげるためには委任を増やすことが重要です

Solana財団の委任プログラム(SFDP)の基準はこちら

https://solana.org/delegation-criteria

ちょこちょこバージョンアップがされるので最大月数回程度バージョンアップ作業をする必要があります。作業自体はsolvで簡単。
あとはskipレートの条件などが厳格化されたので異常検知したら対応する必要があります


~~財団からの委任額は近いうち（2024年1～2月）に↓のお知らせのように変わるらしいです~~

現在、以下の委任額基準が適用されています。

https://forum.solana.com/t/upcoming-sfdp-changes/772

ポイントは
１．自己委任も含め、財団以外からの委任分にはインセンティブとして財団から同額の委任（マッチング委任）がある（上限100,000 SOL）

２．上記マッチング後の残りの金額を残余委任として基準を満たす参加バリデータで均等に分け合う。上記お知らせだと現状40,000 SOLくらいとのこと

３．投票コスト（約1.1 SOL/日かかる）の負担軽減策導入。onboarding後最初の3ヶ月は100％、以降3ヶ月毎に75％、50％、25％となり、1年後に終了する

~~現在、epoch 560では財団からの委任は57,667 SOLらしい
　上記変更はまだ反映されておらず、マッチングもまだ適用されていなさそう
 　今は基準厳格化だけが適用されているのかな？~~
  
2024年4月8日（epoch 599現在）の残余委任は36,817 SOLです。


## 2-2. 立ち上げ当初の収益見込（月間利益782ドル）
以下、皮算用

・私のTDS'22で溜まってステークしているSOLが約1,400 SOL

・最初は自己委任だけなのでマッチング委任は同額の1,400 SOL 

・残余委任は40,000 SOLとする

・サーバは今EdgevanaからRPC用として借りてる449ドル/月のサーバを流用

https://cogentcrypto.io/ValidatorProfitCalculator
このサイトであれこれシミュレーションしてみる

![20240126182238.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961158/c873def6-5b82-33b4-6c42-9bf799d46bc1.jpeg)

財団からの基本委任は保守的に40,000 SOLと仮定

そうすると月間収益は$782のプラスに

投票コストは最初補填されるので最初3か月の収益は$3,311のプラスと見込まれる

## 2-3. 20,000 SOL委任を集めたらどうなる？（月間利益3,781ドル）
![20240127160142.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961158/7f468228-7952-eebf-b734-cc23295d15f2.jpeg)

20,000 SOL自力で他者から委任集めると、
　・自己委任　　　　　　　 1,400 SOL
 
　・他者委任　　　　　　　20,000 SOL
　・財団のマッチング委任　21,400 SOL
　・財団の残余委任　　　　40,000 SOL
ーーーーーーーーーーーーーーーーーーー
　・他者・財団委任合計　　81,400 SOL
 
投票コスト控除後で3,781ドル。votingコスト100％補填期間なら6,310ドル！
たまにバージョンアップするくらいで月間利益当初約100万円、補填なしでも約50万円ってなかなかお得なのでは？？

もっと委任を集めたら集めただけ収益はかなり上振れしていく

~~ちょっと人の名前出すのはなんですが、c〇ma〇さんの委任額を前提に計算すると、、、めっちゃ稼いでる！！え～～あんなニコニコしてる裏でえらい稼いどるやん！！~~
以下に書くようにSOLが$32以下だと赤字なので、去年1年くらい赤字に耐えて最近急に収益性が向上したってことか、、、

## 2-4. ストレステスト(SOLが$32以下に下落すると赤字)
![20240127151038.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961158/5ea04f9a-cdd6-2f30-764a-74e19646fc12.jpeg)

自己委任1,400 SOL、財団委任41,400 SOLの前提でSOLが$32以下まで下落すると赤字になる

## 2-5. 結論

当初から赤字になるリスクは低そうだし、委任集められれば夢あるのでやってみようかなという結論

他のバリデータの財団委任の推移はこちらから確認できます

https://solana.org/validators-search?o=&d=&q=&f=

他のバリデータのパフォーマンスはこのあたりから

https://www.validators.app/validators?network=testnet&order=&page=null

https://stakewiz.com/


# 3. 考察
立ち上げ当初は、1,400 SOLを固定しているにも関わらずおいしいと言えるほどの収益ではないので、やっぱり委任をいかに獲得するかが重要

とりあえずは長期安定稼働で実績・信用を作ることが最優先

委任を得るにはマーケティングが大事そう

コミッション（委任者の利益からもらう手数料率）は基本10％で、これをディスカウントしてるバリデータも多い

だけど、上記マッチング委任を前提とすれば、コミッション10％にして実質20％分の収益を得た上で、別の方法で委任者に還元した方がいいのでは？

ポイント制にして委任者に定期的に還元するとか？もうポイントは食傷気味か

独自トークン発行して還元とやりたいけど日本居住の日本人がやるにはたぶん法律の問題が…
SOLでキャッシュバックとかなら問題ないのかな？

marinade、solblazeから委任をもらうための戦略は今後調べる

marinadeの委任戦略のページはこちら

https://docs.marinade.finance/marinade-protocol/validators

# ４．mainnetバリデータの立ち上げ（Jitoバリデータ）
まだonboardingされてませんが、まもなくonboardingだろうということで早速バリデータを立ち上げてみることにしました。なおonboarding前なのでvotingコスト分（1.1 SOL/日）赤字覚悟です

## 4.1 サーバーを借りる
私はすでにRPC用として契約していたEdgevanaのサーバーを転用したのですが、latitudeの方が安いらしいです。（サポートの質は断然Edgevanaらしい）
EdgevanaはTDS'22用、firedancer用、mainnet用とあるけどfiredancer用がなぜか安いです。私はfiredancer用の512G-1Gのサーバーを転用して使ってます。それでokなのかは知らぬ。リファないのでただのリンク
https://srv.edgevana.com/solana-validator-servers?servertype=MB
latitudeはお世話になっているcamaoさんのリファ。$200ドル分のクレジットがもらえるらしい
https://www.latitude.sh/r/8982C826

## 4.2 Jitoバリデータの立ち上げ
　通常のバリデータでもいいんですが、現状はMEV収益も上乗せされるのでJitoバリデータの方がお得です
~~solvがJitoバリデータにも対応してくれるらしく、2月中旬以降はsolvで簡単に立ち上がると思います~~

Jitoバリデータもsolvで簡単に立ち上がります
solvはこちら（testnetもmainnetもRPCノードも簡単に立ち上がります）

https://solv.epics.dev/ja/

~~現状は、以下の手順で立ち上げるのが簡単です
①solvでいったんmainnetバリデータを立ち上げる。commissionは10％以下を指定しましょう（財団委任の基準）。私は10％にしました
いったんsolv stopで止めてから、
②以下のJitoのページの手順を実行（Initial Setupまで）
https://jito-foundation.gitbook.io/mev/jito-solana/building-the-software
③start-validator.shをJitoバリデータ用に書き換え（下記参照）
④/etc/systemd/system/solv.serviceのEnvironmentを以下に書き換え（下記参照）~~

①Jitoのdiscordの#jito-relayerチャンネルで自分のmainnet-validatorアカウントをホワイトリストに追加してくれと依頼
https://discord.gg/H3C8KDNt
②solvのsetupでmainnet, Jitoバリデータを選択


~~上記手順をそのまま実行すると、active_releasesフォルダにもとのsolana validatorが、releasesフォルダにjito-solana validatorが入ってるものと思います。jito-solana validatorの方を指定
（※このあたりのフォルダ構成はsolvがJito対応したら違う可能性があります）~~
```/etc/systemd/system/solv.serviceの一部
Environment=PATH=/home/solv/.local/share/solana/install/releases/bin
```
~~start-validator.shは参考までに私のを貼っときます。
私のサーバーはNYなのでrelayerとblock engineはNYにしてありますが、ご自身のリージョンに近いところで~~
https://jito-labs.gitbook.io/mev/searcher-resources/block-engine/mainnet-addresses

~~ここで指定している--comission-bpsオプションはJitoのMEV収益に対するものです。私は10%にしたので1000にしてありますが、8％とかがいいなら800で~~

```start-validator.sh
#!/bin/bash
exec solana-validator \
--identity /home/solv/mainnet-validator-keypair.json \
--vote-account /home/solv/mainnet-vote-account-keypair.json \
--log /home/solv/solana-validator.log \
--accounts /mnt/accounts \
--ledger /mnt/ledger \
--entrypoint entrypoint.mainnet-beta.solana.com:8001 \
--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \
--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \
--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \
--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \
--known-validator DE1bawNcRJB9rVm3buyMVfr8mBEoyyu73NBovf2oXJsJ \
--known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \
--known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \
--known-validator C1ocKDYMCm2ooWptMMnpd5VEB2Nx4UMJgRuYofysyzcA \
--known-validator GwHH8ciFhR8vejWCqmg8FWZUCNtubPY2esALvy5tBvji \
--known-validator 6WgdYhhGE53WrZ7ywJA15hBVkw7CRbQ8yDBBTwmBtAHN \
--known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \
--dynamic-port-range 8000-8020 \
--rpc-bind-address 0.0.0.0 \
--rpc-port 8899 \
--wal-recovery-mode skip_any_corrupted_record \
--limit-ledger-size \
--tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \
--tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \
--merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \
--commission-bps 1000 \
--relayer-url http://ny.mainnet.relayer.jito.wtf:8100 \
--block-engine-url https://ny.mainnet.block-engine.jito.wtf \
--shred-receiver-address 141.98.216.96:1002
```

## 4.3　起動後にやること
### 4.3.1　キーペアの書き換え
solv setupすると新規でキーペアが作られてしまうので、いったんsolv stop
・mainnet-validator-keypair.json
・mainnet-authority-keypair.json
・mainnet-vote-account-keypair.json
・validator-stake-wallet.json
を自分のものに書き換えましょう
その後 solv startを実行（solv restartはいろいろ初期化されてしまうので注意！）

### 4.3.2　うまく起動できてるか確認
testnet運用されている方はもうご存じのことですが、まずは
・solv get monitorで正常に立ち上がったか
・solv get catchupでキャッチアップできてるか
・solv log --errorでなにか変なエラーは起きてないか
を確認しましょう

### 4.3.3　自己委任
その後はかなり昔にやった作業
・自分のvote-accountにSOLを委任しましょう。mainnetで財団委任を受けるためには最低100 SOLの自己委任が必要です。念のため110くらいにしときますか

最初はsolflareとかにvalidatorとして認識されていないので、CLIで委任する必要があります

stake-keypair.jsonは新規に作成するステークアカウントのキーペアなのでお好きな名前で
私はtds報酬アカウントからそのままmainnetにも委任することにしたので--keypairで指定しました

```
solana create-stake-account ~/stake-keypair.json 110 --keypair mainnet-authority-keypair.json
```

mainnetのvote-acccountに委任しましょう（私はtestnetのvote-accountと同じアカウントにしました）
```
solana delegate-stake ~/stake-keypair.json ~/mainnet-vote-account-keypair.json --keypair mainnet-authority-keypair.json
```
stakeのCLIの公式の解説はこちら

https://docs.solanalabs.com/operations/guides/validator-stake

### 4.3.4 validator-infoを指定する
とりあえずpico-sol.comというドメイン取ってみたのですが、ページはほぼ中身なしです。アイコンのpngも指定
```
solana validator-info publish "pico🙄.sol +MEV🚀" -w "https://pico-sol.com" -i "https://pico-sol.com/pico-sol.png"
```
公式のガイド

https://docs.solanalabs.com/operations/guides/validator-info

### 4.3.5 voting開始を待つ
自己委任した後、次のepoch開始から投票が始まります
votingがうまくいってるか確認。solscanでtransaction見てもOK

```
solana vote-account mainnet-vote-account-keypair.json
```
このころにはsolflareに下のように表示されてるはず。ようやくvalidatorとして認識されましたね

![IMG_2959.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961158/36b023f8-1d4a-9089-5608-83a616e15be8.jpeg)

と、とりあえず稼働させてepoch終了時にはstake-accountに報酬が降ってくるところまで確認しました

あとは今のところonboardingを待つだけです。投票コストで赤字だから早く財団委任ちょうだい！！

今回はここまで！