🔍

スナップショット高速ダウンロードツール、solana-snapshot-finderの紹介

2025/02/10に公開

はじめに

これは何?

solana-snapshot-finderはc29r3氏の個人プロジェクトで、スナップショットを公開するRPCノードのうち高速ネットワークを優先的に見つけて、スナップショットをダウンロードするツールです。

そもそもスナップショットって何?という方は始めにこちらをお読みください。
https://zenn.dev/devinoue/articles/9c0428aeeb427f

なぜ必要か?

スナップショットは古びたり、壊れたりします。
RocksDBのshredは壊れやすく、保存されたスナップショット自体が壊れている可能性があります。そして「壊れた」という事実を追求することは難しいです。はっきりいってそんな時間はありません。なぜスナップショットがあるのに、クライアントはうまく読み込んでくれないんだ?ということはしばしばあり、その間に刻一刻とスナップショットは古びていきます。
その時最終手段の一つとして、スナップショットを全てバックアップディレクトリに移動して、他のバリデーターなどから取得する必要があります。

かつてsolana-validatorのスナップショットのダウンロードは非常に遅いのが一般的でした。その間にスロットリーダーが周ってくればスキップしてしまいます。
2024年頃からSolanaバリデータークライアントの更新のためか、スナップショットのダウンロードが劇的に向上した印象があるのですが、これはknown-validatorに問題がないときの話です。

つい先日、テストネットバリデーターをFiredancer(Frankendancer)に以降したのですが、そのときどのknown-validatorからも反応がないというときがありました。
こういう場合のSolana Snapshot Finderが役に立ちますので、その使い方について紹介していきます。

環境

私の環境は以下の通りです

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 24.04.1 LTS
Release:	24.04
Codename:	noble

またスナップショットを保存するディレクトリは以下のようなledgerと同じ場所とします

/mnt/ledger

セットアップ

今回はDockerを使わない方法を紹介します。

(ドキュメント通りに)python3-venvとgitをインストールします

sudo apt-get update \
&& sudo apt-get install python3-venv git -y

リポジトリをcloneし、カレントディレクトリを移動します

git clone https://github.com/c29r3/solana-snapshot-finder.git \
&& cd solana-snapshot-finder

venvという名前の仮想環境を作り、必要なパッケージをインストールします

python3 -m venv venv \
&& source ./venv/bin/activate \
&& pip3 install -r requirements.txt

ここまで問題なければ、一度仮想環境を終了します。

終了するには以下のコマンドを打ちます

deactivate

以上でセットアップは完了しました。次回以降は(基本的には)パッケージをインストールなどのコマンドは不要です。

スナップショットをダウンロードする

事前確認

スナップショットをダウンロードする前に、以下の確認をしてください。

  • 停止させているタイミングでスロットリーダーにならないかチェックする
    • 最低でも5分は必要ですが、1時間ぐらいのスパンを見積もってください
  • バリデータークライアントを停止させてください
  • 既存のスナップショットはバックアップディレクトリに移動してほうが良いかもしれません。
  • towerファイルはロックアウトの関係で消さないようにしましょう。
  • スタートアップスクリプトに--no-snapshot-fetchオプションの記載があることを確認ししましょう
    • これがないとスナップショットをknown-validatorからダウンロードしてしまいます。

スナップショットをダウンロードする

まず、あらためて仮想環境を有効化します。

source ./venv/bin/activate

スクリプトを実行します。以下はテストネット環境のものです

python3 snapshot-finder.py --snapshot_path /mnt/data/ledger -r http://api.testnet.solana.com

なにやら大量の文字列が出てくると思いますが、終了まで待ちましょう

ダウンロード終了したら仮想環境も終了させます。

deactivate

バリデータークライアントを起動させる

あとはいつもどおりにバリデータークライアントを起動すればOKです。
停止時間によりますが、5分程度でslotが最新のものに追いつくと思います。
スナップショットダウンロード後にもたもたしているとまたスナップショットが古くなってしまいますので、早めに再起動するようにしましょう。

どう動いているのか?

ドキュメントの解説では以下のように動作しているようです。

  1. 利用可能なすべてのRPCを見つける
  2. 現在のスロット番号を取得する
  3. マルチスレッドモードで、すべてのRPC上のすべてのスナップショットのスロット番号をチェックする
    ※バージョン0.1.3以降、最初の10個のRPCの速度のみがループでテストされます。詳細はこちら
  4. 最小レイテンシーでソートされたRPCのリストを作る slots_diff = current_slot - snapshot_slot
  5. 最新のスナップショットを持つRPCからのダウンロード速度をチェックする。download_speed < min_download_speedの場合、その次のノードの速度をチェックする
  6. スナップショットをダウンロードする

コード自体は短いので、全部読んでもいいかもしれません。

注意点

solana-snapshot-finderはサードパーティのツールです。Solana教育ビデオシリーズなどでも利用されているため多くの人が使用しているようですが、あくまで非公式です。使用する際は自己責任となります。

また内部的には公開されているRPCのスナップショットを取得しています。改ざんされたスナップショットもダウンロードする可能性もあります(その場合検証作業で弾かれるとは思うのですが)

以上の点を踏まえて、とくにメインネットで使用するときは気をつけてください。

終わりに

2024年頃以降、バリデータークライアントのスナップショットダウンロード速度が高速になった印象があります。ただそれでもたまに異様に時間がかかることがあるので、まだまだ念の為いつでもスナップショットを高速ダウンロードできるようにしておくと安心感が違うかと思います。

実際、自分も最近の再起動で通常の方法ではスナップショットがダウンロードできなかったことがありました。そこで最終手段の一つとしてknown-validatorを諦めて、慌ててsnapshot-finderに頼りました。

作成者の方はもうバリデーターを動かしていないとのことですが、比較的最近も更新してくれており、大変ありがたいです。

以上となりますが、内容に間違いなどありましたら、コメント欄で教えて頂けると助かります。

Discussion