Solana Testnet Validatorの初期セットアップ虎の巻

SolanaのTestnet Validatorの運用を開始したため、初期のセットアップから稼働までをまとめました。
すべての操作を記録しているため(漏れてなければ)、基本的にこのとおりやれば稼働までいけると思います。

バリデーターとは?

POH

Solanaは POH(Proof of History) という、トランザクションとタイムスタンプや順序のブロックを作成して、それをチェーンで繋いでいく仕組みのブロックチェーンです。
バリデーターはそれを運用していく役割を持ちます。

バリデータのAccount構造

SolanaはすべてAccountで管理する仕組みになっているため、バリデーターも複数のAccountから構成されます。

Vote Account: 投票履歴とネットワーク報酬の管理
 |
 +- Authorized Voter Account: 投票TXの承認(そのためSOLが必要)
 |
 +- Authorized Withdrawer Account: ネットワーク報酬の引出し

投票とは?

Solanaのコンセンサスアルゴリズム(合意形成)として投票が行われます。
PoS(Proof of Stake) に、POHを組み込んでいて、バリデーターの投票はその中で使われています。

投票の目的

  • 合意形成: ブロックが提案されたとき、バリデーターはそのブロックが正当かどうかを確認するために投票します。合意形成を確保し、正当なトランザクションをブロックに含めます。
  • リーダーシップの選定: バリデーター(ノード)が次に新しいブロックを生成するリーダー(リーダーシップ)を選びます。これにより、ネットワークが効率的にブロックを生成し続けることができます。

投票の仕組み

  • Vote Account: 各バリデーターが投票するためのアカウントです。
  • リーダーシップの選定: 各バリデーターは新しいブロックのリーダーシップに応募します。この応募は、バリデーターのVote Account を通じて行われます。ネットワークはこれらの応募からリーダーシップを選びます。
  • ブロックの承認: 各バリデーターは新しいブロックが正当かどうかを確認し、それに対して投票します。これにより、正当なブロックがネットワークに追加されます。
  • フォークの解決: 時折、異なるバリデーターが同じ高さで異なるブロックを提案することがあります。これをフォークと呼びます。ネットワークはこれに対して投票を通じて一つのブロックを選び、合意形成を図ります。

前提

  • ネットワーク:Testnet
  • ホスティング:Edgevana
  • バリデータフレームワーク:solv

サーバースペックや稼働状況などの詳細は 256hax/solana-testnet-validator を参照。

バリデーターで何をするのか?

Solana Tour de Sun '22 (略称:TDS22) というプログラムがあり、Testnetで修行を積むというもので、今回はこれに参加しました。
進め方は、これを上から順にやるだけです。

全体の雰囲気は テストネットバリデータ動かしてSOLをもらう(TdS22活動メモ) がわかりやすいです。

お役立ちリンク集

バリデーターの解説

バリデーターのコミュニティ

注意事項

気軽に手を出さないこと

バリデーターの初期セットアップは、非常に大変だったため、気軽に手を出すのは要注意。
うまくいっているときは問題ないですが、なにか問題が起きたときにトラブルシューティングが必要になり、時間がかなり持っていかれます。
Solana TechのDiscordで質問しても返事が来ない場合があり、最終的にいろいろ検証して自力で解決するしかない状況もありました。
また、サーバーの基本的な操作やSolanaとバリデーターの仕組みや知識も必須になるため、そもそも興味があるひとでないと続かないと感じました。

自己責任で参照を

本ページに記載した進め方や内容があっているかどうかはわからないため、事前に十分調べてから自己責任で参照をお願いします。

solvのマニュアルを要参照

バリデーターを始める場合は、バリデーター構築フレームのsolvを使うのがよいです。

solv クイックスタート - Edgevana

私は意図せずsolvのマニュアルを参照せずに、自力でSolana Foundationに申請までしてからsolvのセットアップをしてしまったため、solv推奨の進め方とは異なってしまっています。

なお、本ページとsolvマニュアルでの進め方の違いは以下のとおり。
 本ページの進め方:Solana Foundation申込してからEdgevanaに契約
solvの進め方:Edgevana契約をしてからSolana Foundationに申込

最終的にsolvを利用して稼働できているため、大きな問題はないと思いますがご留意ください。

Registration progress

バリデータのアカウントを作成すると、以下から進捗状況が確認できるようになる。
反映は即時ではなく、早いと数時間、遅いと1日程度かかった気がします。

Your registration progress

進捗をテキスト化したものは以下のとおり。

Your registration progress
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8

1: Create your keys
2: Apply and pass KYC
3: Start your Testnet validator
4: Start voting
5: Get added to Testnet stake bot
6: Produce blocks
7: Earn Bonus stake
8: Get onboarded to the Delegation Program

STEP1. Mainnet用バリデータアカウント作成

(参考)Generate identity

% solana-keygen new -o ~/mainnet/validator-keypair.json
% solana-keygen new -o ~/mainnet/vote-account-keypair.json
% solana-keygen new -o ~/mainnet/authorized-withdrawer-keypair.json

% solana config set --url http://api.mainnet-beta.solana.com
% solana config set --keypair ~/mainnet/validator-keypair.json

validator-keypairのPublic KeyにMainnetで0.03 SOL送る
% solana address --keypair <KEYPAIRパス> でアドレスがわかる)

% solana create-vote-account ~/mainnet/vote-account-keypair.json ~/mainnet/validator-keypair.json ~/mainnet/authorized-withdrawer-keypair.json

Signature: By6dRQiidf2vFrt8n9kNz3xpp9QAk4CxFRaGR2B9cWVPDD5nnuX4NXzgXdApjf8MfHer9h6qpBQATn7tSsHKYNN

STEP2. Testnet用バリデータアカウント作成

% solana-keygen new -o ~/testnet/validator-keypair.json
% solana-keygen new -o ~/testnet/vote-account-keypair.json
% solana-keygen new -o ~/testnet/authorized-withdrawer-keypair.json
% solana config set --url http://api.testnet.solana.com
% solana config set --keypair ~/testnet/validator-keypair.json

上記で生成したTestnet用のvalidator-keypairのPublic Keyに、Mainnetで0.03 SOL送る(TestnetではなくMainnetのため要注意。ただし、これはひとによって必要/不要がわかれたので謎だった)

% solana create-vote-account ~/testnet/vote-account-keypair.json ~/testnet/validator-keypair.json ~/testnet/authorized-withdrawer-keypair.json

Signature: vhAKSP6HAbSWioaPQhkvguH73axzcXZ7UbJQ4Mo94i9jnN4BmJsRKosJsfNLqtarxw2a4rH374iBonUG5RxoNum

Vote Account(Validator Accountではなく)を見ると、Commissionの項目以外は以下のような見え方になっているはず。

Vote Account

STEP3. Solana Foundationにバリデータ登録

(参考)solana-foundation-delegation-program-cli

$ cargo install solana-foundation-delegation-program-cli
% solana-foundation-delegation-program apply --mainnet ~/mainnet/validator-keypair.json --testnet ~/testnet/validator-keypair.json --confirm

Mainnet Validator Identity: 1uNfVQmQwrqT6XVVCBQLEUpADYEEZcGKxQTXFPV8EmY

Testnet Validator Identity: 8XRkWmiF672BvqLvkNnt8ggaywyTQxoH3pyWAWtEGzzp

Error: "error: send transaction: HTTP status client error (429 Too Many Requests) for url (https://api.mainnet-beta.solana.com/)"

実行したら、「429 Too Many」が出たが、再実行すると「Registration already exists」が表示されるので成功しているっぽい。

Mainnet用バリデータアカウントの最新トランザクションが以下になっていれば成功。

  • #1 謎アカウント(正体はまだ調べてないです)
  • #2 Mainnet用バリデータアカウントのMainnet
  • #3 Testnet用バリデータアカウントのMainnet

現在の進捗状況

Your registration progress
[1] - 2 - 3 - 4 - 5 - 6 - 7 - 8

1: Create your keys
2: Apply and pass KYC

STEP4. KYC

以降は、一度選択すると前に戻ることはできないため慎重に進める。選択肢を間違えたが訂正できず、1からやり直した(質問しても返事こないと想定して、バリデーターのKeypair作成からやり直し)。

Solana Delegation Program

2「Apply for the Foundation Delegation Program and pass KYC」のApply Nowボタンから登録を進める。

% solana-foundation-delegation-program sign-message <文字列> --keypair ~/mainnet/validator-keypair.json

上記の <文字列> は都度変わるので要注意。画面上のコマンドラインをコピペする必要あり。

質問の「Are you signing up on behalf of a business?」は、Noは「個人」、Yesは「法人」を意味する。
(2度と前の画面に戻れないため慎重に。法人の場合は、会社情報をいろいろ入力が必要)

契約書のサインは、よくわからなかったため、以下を入力した(たぶん間違ってる)。

Role: Developer, Operator: Tokyo, Title: Developer

現在の進捗状況

Your registration progress
1 - [2] - 3 - 4 - 5 - 6 - 7 - 8

2: Apply and pass KYC
3: Start your Testnet validator

STEP5. Tour de Sun ‘22 Signup

  • Wallet Address: Locked SOLを受取る任意のWALLET_ADDRESS
  • Mainnet Beta pubkey: MainnetのValidator Account
  • Wallet Address Signature: 以下コマンドで発行されたsignature
% $ solana-foundation-delegation-program sign-message <Locked SOLを受取るWALLET_ADDRESS> --keypair <VALIDATOR_KEYPAIR>

契約書のサインの項目はよくわからなかったため、ChatGPTに聞いた。

提供された情報に基づいて、おそらく "Operator by" の箇所は、署名者の職務またはポジションに関する情報を提供するためのものでしょう。通常、契約書や同意書などの文書では、署名者がどの組織やポジションで動いているのかを特定するために、役職や役割に関する情報を含めることがあります。

例えば、以下のような形式で入力できるかもしれません:
Operator (Sign): [署名者の名前]
By (Operator by): [署名者の職務またはポジション]
Name (Full Name): [署名者のフルネーム]
Title: [署名者の役職]
Date: [署名日]
Email: [署名者のメールアドレス]

こういった情報を提供して署名することで、文書において署名者の識別と、その署名者がどのような立場や役割で文書に同意しているのかを示すことができます。

STEP6. Edgevana契約

サーバーを契約するときにSSHのPublic Keyが必要になるため発行しておく。

% mkdir ~/.ssh/edgevana
% cd ~/.ssh/edgevana
% ssh-keygen -t rsa
% ls
 id_rsa id_rsa.pub

Tour de Sun '22 の「Provision an eligible server」のGet Serverボタンを押す。
好きなサーバーを選択して、そのまま契約する。SSH入力欄は、「id_rsa.pub」の中身をコピペする。

なお、メールアドレスは、Solana Foundationの申請と同じものを使用する必要あり。

1時間ぐらいするとサーバー利用開始OKのメールが来るため、以下で接続確認する。

% ssh ubuntu@<サーバーのIPアドレス> -i ~/.ssh/edgevana/id_rsa

STEP7. Solvセットアップ

【2023/12までの情報】solv ver1系 がEdgevana、solv ver2系 がLatitude版。
【2024/1/20からの情報】solv ver3系から、ホスティング別に使い分けがなくよくなったそうです。

ubuntu$ sh -c "$(curl -sSfL "https://storage.googleapis.com/epics-bucket/resource/solv/v1.8.4/install")"

・パスワードはsolvユーザー用に新規登録になる(頻繁に打つため覚えやすいもの推奨)
・Full NameなどのInformationはすべて空白

ubuntu$ cd ~ && source ~/.profile
ubuntu$ solv setup

先にキー発行してからSolana Foundationに申請してしまったため、solvのお引越し対応をする。

(参考)バリデータキーの交換(引越し・TDS用)

solv config でkeypairの場所を取得して、ローカルで作成したKeypairに差し替える。MacのCyberduckやSCPだとうまくいかなかったので、viで直接編集した。
(Windowsのひとは、SCPしたあとに権限をsolvユーザーに変更したら、うまくいってた)

パスワードはsolvユーザーのパスワードを入力

ubuntu$ su - solv
solv$ vi /mt/solana/testnet-validator-keypair.json
solv$ vi /mt/solana/mainnet-validator-keypair.json
solv$ vi /mt/solana/vote-account-keypair.json ← これはtestnet
solv$ vi /mt/solana/authority-keypair.json ← これはtestnet

↓こうなったら成功

$ solv monitor

Ledger location: /mt/ledger/validator-ledger
Identity: 8XRkWmiF672BvqLvkNnt8ggaywyTQxoH3pyWAWtEGzzp
Genesis Hash: 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY

⠓ 13:53:12 | Processed Slot: 242389474 | Confirmed Slot: 242389473 | Finalized Slot: 242389441 | Full Snapshot Slot: 242366325 | Incremental S

以下が表示されたらKeypairが間違っている。

$ solv monitor

Ledger location: /mt/ledger/validator-ledger

⠒ Unable to connect to validator: Connection refused (os error 111)

ターミナル上でコピペすると番号までコピーしてしまっていたり、改行コードがおかしかったりと、結構ミスする。そのため、一度テキスト帳に貼ってから対応するとよい。

どうしてもうまくいかない場合は、 solv 鍵の交換(ローカルコンピュータ → バリデーターノード) を試す。

Voting状況はSolana Explorerでも確認できますし、以下コマンドでも把握できます。

% solana vote-account 6Pxb3bmmTPxmza8mkczTMhoLny4rqLX6A94yPwtEpozL --output json

このあたりから Validators.app で検索すると表示されたような気がします。

現在の進捗状況

Your registration progress
1 - 2 - [3] - 4 - 5 - 6 - 7 - 8

3: Start your Testnet validator
4: Start voting

STEP8. ステーキング

commissionを変更する。デフォルトだと100%なので10%に変更する。
(これがあっているかは不明のため要調査。なお、100%にするとPrivateになるっぽい?)

$ solana vote-update-commission 6Pxb3bmmTPxmza8mkczTMhoLny4rqLX6A94yPwtEpozL 10 /mt/solana/authority-keypair.json

Signature: 4TJum2wTRaw3XSbfAGCCShWoNijJNuBMhFHFyUnJX8XQtskaYq9Yea8faxGN1PXvyhMgUBT3wnWpTEqRE1c3BpQj

もし、「Error: Cannot update commission at this point in the epoch」のエラーが出た場合はEpochが進みすぎて変更できない。

You can only update the commission in the first half of each epoch [1]. Testnet epoch 518 ends in ~21 hours, at which point you'll have a roughly 25 hour window when you can change commission

引用元:Solana Tech Discord

バリデーターのステータスを早めるためにステーキングする。Phantomからステーキングしようと思ったが検索に出てこなかったため、Solana CLIで対応した。
やり方は、QuickNodeが丁寧に解説してくれていて、その操作どおりに実施した。

QuickNode Method 2 - Using Solana CLI

% mkdir -p solana-staking/cli && mkdir -p solana-staking/web3js
% cd solana-staking/cli

ステーキングのテスト用アカウントを作成。

% solana-keygen new --no-passphrase -o wallet.json
=======================================================
62iGBptgZm7aZD3AstxFThAzX2heAk1u5Q7E4ruu1Ne6
=======================================================
% solana airdrop 1 62iGBptgZm7aZD3AstxFThAzX2heAk1u5Q7E4ruu1Ne6
% solana airdrop 1 62iGBptgZm7aZD3AstxFThAzX2heAk1u5Q7E4ruu1Ne6
% solana airdrop 1 62iGBptgZm7aZD3AstxFThAzX2heAk1u5Q7E4ruu1Ne6

ステーキングのSOLが足りないと「Error: delegation amount is less than the minimum」と言われるため、2〜3SOLほしい。おそらく最低1SOL? 0.1 SOLだとダメだった。

% solana-keygen new --no-passphrase -s -o stake-account.json 
% solana create-stake-account stake-account.json 2 \
    ----from wallet.json \
    --stake-authority wallet.json --withdraw-authority wallet.json \
    --fee-payer wallet.json \
    --url testnet

Signature: 42NFT6kqkPNyEX9AjKwVjSmo21MzfxogXeePAWkTsVffRqRmEaHvhKD1MgypN6p8fFG4YPTuZexUdMyFnUZ34yUr
% solana delegate-stake stake-account.json 6Pxb3bmmTPxmza8mkczTMhoLny4rqLX6A94yPwtEpozL \
    --stake-authority wallet.json \
    --fee-payer wallet.json \
    --url testnet \
    --with-memo "Delegating stake test."

Signature: 5sPMhrQKf3uixnHuDH8Stjktnww3guh8F3BDvH6GBkQRoyY8kC7vwjA4DACtEHihcF4TwhZxCY9gwovHNdA1YXyj

ステーキングしてから数日(Epoch終了時点?)で、PhantomからTestnetで自分のバリデータアカウントを検索すると出るようになりました。

現在の進捗状況

Your registration progress
1 - 2 - 3 - [4] - 5 - 6 - 7 - 8

4: Start voting
5: Get added to Testnet stake bot

STEP9. バリデータ情報の更新

バリデータ情報の公開

Validators.app - Testnet を見ると、自分のスコアが閲覧できる。

バリデータ情報には、名前やアイコン、Webサイトなどを公開できる。
Solana Publishing Validator Info

デフォルトだと「Published Information Score」が0点になってる。
バリデータ名とアイコンだけ登録したみた結果、以下のとおり1点だった。

Validators.app - FAQ を見ると、以下のような記載がある。

Published Information
stakeholders or delegators want to know who is running a node. The Published Information Score measures the contact information that the validator has posted to the blockchain using the `solana validator-info` feature.
 (2 points) means that the validator has published all four data elements (Name, Avatar, Website URL, and Details).
 (1 point) means that the validator has published two or three parts.
 (0 points) means that the validator has published only one, or zero, pieces of contact data.

「Name, Avatar, Website URL, and Details」を登録することで2点にできるため、以下コマンドで対応する。

登録コマンド:

% solana validator-info publish \
--keypair /mt/solana/testnet-validator-keypair.json \
"<任意のバリデータ名>" \
-i "<アイコンの画像URL(ArweaveとかXとか)>" \
-w "<自分のWebサイトのURL(自社ページとかXとか)>" \
-d "<バリデーターの詳細説明>"

公開情報の取得コマンド:
grepで該当の上下10行を抽出。

% solana validator-info get | grep -A 10 -B 10 <バリデータアドレス または バリデータ名>

Validators.appの項目説明

Root Distance

Skipped vote measures the percent of the time that a leader fails to vote.
スキップされた投票は、リーダーが投票しなかった時間の割合を測定します。

Vote Distance

Vote distance is very similar to the Root Distance. Lower numbers mean that the node is voting near the front of the group.
投票距離はルート距離と非常に似ています。数値が小さいほど、ノードがグループの先頭近くで投票していることを意味します。

Skipped Slot

Skipped slot measures the percent of the time that a leader fails to produce a block during their allocated slots. A lower number means that the leader is making blocks at a very high rate.
スキップされたスロットは、割り当てられたスロット中にリーダーがブロックの生成に失敗した時間の割合を測定します。数値が低いほど、リーダーが非常に高い割合でブロックを作成していることを意味します。

STEP10. Testnetステークボットの獲得

いつのまにか、ステークボットが来て、30,000SOLほどステーキングされました。

「ステークボットがなかなか来ない」という話はよく聞きます。1年近く来なかったひともいました。
自分の場合は2〜3週間ほどできました。

何がきっかけで来てくれるのかわかりませんが、以下がポイントになる可能性あり。

  • Skip Rateを下げる(高いとダメ)
  • 数百SOLを自分自身にステーキング
Your registration progress
1 - 2 - 3 - 4 - 5 - 6 - [7] - 8

5: Get added to Testnet stake bot
6: Produce blocks
7: Earn Bonus stake
8: Get onboarded to the Delegation Program