Firedancer(Frankendancer)を動かす・次世代Solanaバリデーター・クイックガイド
はじめに
こんにちは、DevInoueと申します。
この記事では、Jump Trading Groupが開発を進める新しいSolanaバリデータークライアント「Firedancer」について、主にテストネットでの導入方法や動作環境などを解説いたします。
Firedancerは、Solanaバリデーターをより高速かつ効率的に動作させることを目標としています。オリジナルのRust製バリデーターとは異なるC言語ベースのコードを採用し、暗号処理やネットワークのボトルネック解消を目指す設計になっているため、同じハードウェアでもパフォーマンスやコスト面でメリットが期待されています。さらに、オリジナルのバリデーターコードと異なる実装を導入することで、単一のバグがネットワーク全体に及ぶリスクを下げる狙いもあります。
とはいえ、Firedancerはまだ開発途中であり、現時点で公開されているバージョンは「Frankendancer」と呼ばれる、いわば途中段階のバリデーターです。FrankendancerではFiredancer固有のネットワーク周りの高速化技術が組み込まれていますが、実際のランタイム処理やコンセンサスロジックにはAgaveをフォークしたものが組み込まれています。今後完全に独立したFiredancerバリデーターを完成させる計画とのことです。
本記事では、Frankendancerをテストネットで動かす手順や、使用するサーバー構成の一例をご紹介いたします。まだ日本語の情報はほとんどなく、将来的に仕様変更が生じる可能性もありますが、現時点でのセットアップ手順を把握しておくことで、早めにFiredancerの環境を試すことができるかと思います。
今回の目標
今回はテストネット上で、投票をせずに最新のスロットにキャッチアップすることを目標とします。
この場合、適当なキーペアを生成し、そのキーペアをidentityアカウントとしてセットして実行することになります。
基本的にはサーバー構築やユーザー作成などの初期準備が完了している前提で進めますが、必要に応じてご自身の環境に合わせて調整してみてください。
そもそもFrankendancerとは?
先ほども少し触れましたが、FrankendancerはFiredancerプロジェクトで最初に公開されたバリデーターで、Firedancer独自の高速ネットワーク処理(QUICやUDPのカーネルバイパスなど)とオリジナルのAgaveコードを組み合わせた構成になっています。現在テストネットで運用されているのはこのFrankendancerであり、完全に新規実装されたFiredancerのランタイムやコンセンサスコードは今後順次追加される予定です。
Firedancerのリポジトリには、gitサブモジュールとしてagave
が存在していますが、これはオリジナルのagaveリポジトリをフォークしたものです。agaveオリジナルのコミットと同期していますが、同時にfiredancer用のコミットもしているので、サブモジュールのアップデートが必要なことに注意が必要です。
環境
テストネットでの運用を前提とした環境構築について説明します。特に重要なのはCPUの選定です。Firedancerは高性能な処理能力を必要とするため、使用するCPUについては慎重な検討が必要です。
今回の私の検証環境は以下のような構成です。
CPU.............: AMD Ryzen 9 9950X 16-Core Processor
Memory..........: DDR5 5600MHz 192GB (4 x 48GB 5600MHz)
Disk 1..........: Crucial 4TB NVMe SN: 2441E98EB1A6
Disk 2..........: Crucial 4TB NVMe SN: 2441E98EB1C0
RAID............: No RAID
OS..............: Ubuntu 24.04 LTS
Control Panel...: No Control Panel
IPs.............: 1 Vlan IP (/30)
Bandwidth.......: 1GBPS (10GB Port)
AMD Ryzen 9 9950Xでの動作はコミュニティ内でも複数の成功報告があり、現時点では安定した選択肢の一つと言えます。
明らかに推奨スペックより低いのですが、より低スペックな環境でのキャッチアップ報告も出始めていますので、チューニング次第では安価なサーバーでも可能かもしれません。
具体的な選定にあたっては、最新のSolana Tech Dicordの情報を参考にすることをお勧めします。
構成
ユーザーはfiredancer
という名前で作っておきます。特に特権などは与える必要はありません。
ディレクトリなどは以下のような構成を想定しています
# アカウント
/mnt/accounts
# レジャー・スナップショット
/mnet/ledger
# identity
/home/firedancer/fake-identity.json
# 投票アカウント(追記・なくてもOKです)
/home/firedancer/vote-keypair.json
必要なツールをインストールする
gcc、clang、rustupが必要です。以下のようにインストールしましょう。
gcc
sudo apt install build-essential
clang
sudo apt install clang
rustup(公式サイトのコマンドを優先して使用するように)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
#何か聞かれるが標準インストールしたい場合はEnterを押すだけでいいです
このあとSSHセッションを一度切断して再接続するか、現在のシェルで直接環境変数を読み込めばOK。
Firedancerをcloneする
$ git clone --recurse-submodules https://github.com/firedancer-io/firedancer.git
$ cd firedancer
git checkout v0.302.20104 # Or the latest Frankendancer release
さて、上記は例としてv0.302.20104
にチェックアウトしましたが、更新されている可能性があるので公式ドキュメント、またはSolana Tech Discordのtestnet-announcementで推奨されるバージョンを確認してください。
基本的に(我々普通の人は)mainブランチは使いません。mainは最新の開発状態のため、バリデーター運用として不向きのものです。
またサブモジュールもアップデートしておきます
git submodule update
依存関係を解決する
deps.sh
というスクリプトがあるので、これを実行するだけでOKです。
./deps.sh
[~] This will fetch, build, and install Firedancer's dependencies into /Users/inoue/Documents/GitHub/firedancer/opt
[~] For help, run: ./deps.sh help
[~] Running ./deps.sh fetch check install
[?] Continue? (y/N) y
2回ほど質問されるのでどちらもy
で行きます。1分弱で終わると思います。
インストール後はoptフォルダに保存されるので確認します
ls opt/
bin git include lib
このフォルダを削除し再構築することで再度依存関係を構築することができます。
メインバイナリのビルド
make -j fdctl solana
-j
オプションはCPUコア数を自動検知して並列コンパイルを実行するための指定です。
デフォルトでは自動でアーキテクチャを検出し最大のパフォーマンスを発揮するようなそのアーキテクチャ固有の命令を使用するようにします。
一度コンパイルするとバイナリは ./build/native/gcc/bin
に配置されます。
fdctl
(ファイアダンサー・コントロール)というのが、Firedancer操作の中心的なプログラムとなります。このプログラム1つでFiredancerインスタンスを開始、停止、および監視することができます。
このビルドには少し時間がかかるかもしれません。ちょっと計測し忘れましたが、5分ぐらいだったと思います。
ビルドには十分な計算リソースが必要です。特にメモリに関しては32GiB以上の空き容量を確保しておくことをお勧めします。メモリが不足すると、コンパイル中にエラーが発生する可能性があります。
設定ファイルを作る
設定ファイルであるconfig.toml
をfiredancerユーザーのホームディレクトリ(~/config.toml
)に置きます。
touch config.toml
設定ファイルは以下のようにします
user = "firedancer"
[gossip]
entrypoints = [
"entrypoint.testnet.solana.com:8001",
"entrypoint2.testnet.solana.com:8001",
"entrypoint3.testnet.solana.com:8001",
]
[consensus]
identity_path = "/home/firedancer/fake-identity.json"
vote_account_path = "/home/firedancer/vote-keypair.json" # 追記・または投票アカウントの公開鍵
expected_genesis_hash = "4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY"
known_validators = [
"5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on",
"dDzy5SR3AXdYWVqbDEkVFdvSPCtS9ihF5kJkHCtXoFs",
"Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN",
"eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ",
"9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv",
]
[rpc]
port = 8899
full_api = true
private = true
[layout]
affinity = "auto"
agave_affinity = "auto"
verify_tile_count = 2
bank_tile_count = 1
[ledger]
path = "/mnt/ledger"
accounts_path = "/mnt/accounts"
limit_size = 100_000_000
[snapshots]
minimum_snapshot_download_speed = 52428800 # 50 Mbps
[log]
path = "/home/firedancer/firedancer.log"
[reporting]
solana_metrics_config = "host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea"
「設定ファイルはすべて読む価値はある」と言われていますが、さすがに大量にあります。
以下の部分だけ気をつけた方が良いかなと思います。
user
Firedancerインスタンスを実行するユーザー。実際にはFiredancerは最初はroot権限持ちとして実行されるのですが、その後はここで指定されたユーザーに切り替わります。
ここで指定されるユーザーは最小権限のユーザーであり、セキュリティ上の理由で特権ユーザーではないことが望まれます。
consensus.vote_account_path
ここはjson形式の秘密鍵を渡す必要があります。
agave-validator
プログラムの場合は公開鍵だけで良かったのですが現状はjsonファイルが必要です。
追記・現在は公開鍵だけでも動くようアップデートされたそうです。基本的にagave-validator
に値を渡しているだけの部分だと思うので、これは問題なさそうですね。
rpc
これはデフォルトではオフになっているので設定するようにしましょう
layout
重要な項目です。設定次第では十分にFiredancerが動かない可能性があるので、CPUによって調整することでチューニングが可能です。
snapshots.minimum_snapshot_download_speed
例のように設定するとスナップショットのダウンロードが速くなるそうです。
キーペアを用意する
今回の目標は「最新のスロットまでキャッチアップする」なので、無投票キーペアを作ります。
identityだけ新しく作り、投票アカウントは既存のものを使ってもいいですが、今回は適当に作ります
solana-keygenがないので、ローカルなどsolanaの秘密鍵を生成できるところで作ってSCPでアップロードするなどしてください。実際には投票などに使わないものなので、秘密鍵をコピペでも問題ありません。fake-identity.json
と名付けています。
solana-keygen new -s --no-bip39-passphrase -o fake-identity.json
バリデーターの起動してみる
これでOKです。キャッチアップできるか確認してみましょう。
以下のコマンドは設定を適用するコマンドで、毎回実行する必要があります。
sudo /home/firedancer/firedancer/build/native/gcc/bin/fdctl configure init all --config /home/firedancer/config.toml
以下のようなログが出ると思います
NOTICE hugetlbfs ... unconfigured ... mounts `/mnt/.fd/.huge` and `/mnt/.fd/.gigantic` do not exist
NOTICE hugetlbfs ... configuring
NOTICE RUN: `mkdir -p /mnt/.fd/.huge`
NOTICE RUN: `mount -t hugetlbfs none /mnt/.fd/.huge -o pagesize=2097152,min_size=241172480`
NOTICE RUN: `mkdir -p /mnt/.fd/.gigantic`
NOTICE RUN: `mount -t hugetlbfs none /mnt/.fd/.gigantic -o pagesize=1073741824,min_size=27917287424`
NOTICE sysctl ... already valid
NOTICE ethtool-channels ... already valid
NOTICE ethtool-gro ... already valid
NOTICE ethtool-loopback ... already valid
次にrunコマンドを使います。
sudo /home/firedancer/firedancer/build/native/gcc/bin/fdctl run --config /home/firedancer/config.toml
これでtileが起動します。
何かスタックしているような画面が出ると思いますが、agave側の問題で特に大丈夫だそうです。
Solana Validator Education - Firedancer v0 (Frankendancer) Operational Guide
ここから何か不穏な感じのログは出るのですが、無視して放置しているとsnapshot downloadingという文言とともにスナップショットがダウンロードされます。
あとはいつもの監視コマンドを打って待ちましょう(先ほどビルドしたsolana cliを叩いています)
/home/firedancer/firedancer/build/native/gcc/bin/solana -ut catchup --our-localhost
いつもの画面が出てくればOKです。
上記は424スロット遅れており、平均2slot/secで追いついてます。
この速度が7ぐらいになれば、1000スロットの遅れがあってもすぐに追いつくと思います。
モニタリングについて
agave-validatorでモニタリングしたい!という方は、普通にagaveをインストールしまょう。私は念の為別ユーザーを作って、そちらにagaveをインストールしています。
agave-validator --ledger /mnt/ledger monitor
結びに
以上、駆け足でFiredancer(現状のFrankendancer)の導入について解説してきました。まだ開発段階のプロジェクトということもあり、今回の解説では触れきれなかった部分も多くありますが、Solanaネットワークの将来に向けた重要な一歩として、非常に興味深い取り組みだと感じています。
この記事が、Solanaのバリデーター運用に興味をお持ちの方々にとって、新しい選択肢を検討するきっかけになれば幸いです。また、開発の進捗に応じて、新しい情報や変更点についても随時共有していければと考えています。
最後に、本記事の内容は2025年1月時点のものであり、急速な開発に伴い、セットアップ手順等が変更される可能性があることをご了承ください。最新の情報については、公式ドキュメントやコミュニティの情報を併せてご確認いただければと思います。
参考
公式ドキュメント
Solana Validator Education - Firedancer v0 (Frankendancer) Operational Guide
Discussion