LoginSignup
1
0

More than 3 years have passed since last update.

RaspberryPi4をETH2 Validatorにする(Nimbus Eth2使用)

Posted at

概要

RaspberryPi4 4GBでNimbus Eth2(Validator)を実行するまでの手順メモです。

やること

  • ETH2メインネットでのNimbus実行環境を整える。
    • テストネットで実行する際も、手順は基本的に同一だが、テストネット用のETHをデポジットして、実行時の引数も置き換える必要がある。
  • サービス登録して起動時に自動実行する。
  • グローバルIPアドレスの変更に自動追従する。

基本的に、Nimus公式のガイドを参考にしています。
Eth2 Staker Checklistも参照。
また、基本的にメインネット前提に記載していますが、最初はテストネットで試した方が良いと思います。

環境

  • Raspberry Pi4 4GB
  • SSD(書いた人はTranscend SSD 480GB 2.5インチを使用)
    • 性能の低い製品だとNimbusの動作に追いつかないので注意。
  • ブロードバンド環境
    • グローバルIPを占有できる接続環境が必須。
    • 速度は1Mbps/s程度で良い(実行中は13GB/day程度、通信量を消費)
      • Wimaxルータは、大半(全部?)の使い放題プランでも10GB/3dayの通信量制限がある。制限を超えると混雑時(夕方から深夜帯)に1Mbps/s程度に速度制限されるが、Nimbusの動作は問題無い模様。
  • 作業用PC(書いた人はWindows:Linuxの方が良いと思います)

事前準備

  • infuraのアカウントを取得
  • ETH2 Launch Padで32ETHをデポジット
    • デポジット後、ValidatorがActivateされた後、Nimbus(に限らずValidatorクライアント)が動作していないとペナルティとなるので注意。
    • デポジットからActivateまでには、2021/1/30時点で16日程度待たされる)ので、それまでにセットアップを完了させる。(ノード同期に数日-1週間程度かかる)
    • ValidatorのActivateは遅れるが、安全のためにデポジットを後回しにしても可。
    • テストネット用のLaunch Padはこちら。

RaspberryPi4のセットアップ

64bit RaspberryPi OSのインストール

64bit版のイメージをDLし、Raspberry Pi Imagerを使用してmicroSDに書き込み、起動ディスクを作成。
microSDをラズパイのスロットに挿入すれば起動できる。

セキュリティ設定

以下を設定する。
参考:ラズパイでやらなければいけない4つのセキュリティ対策!

  • rootのパスワードを設定
  • 操作用のユーザーを追加
  • "pi"(デフォルト)ユーザーを削除
  • 自動ログインを無効化
  • SSH設定変更
    • パスワード認証無効(公開鍵認証のみ有効)
    • 空パスワード無効
    • root接続無効
    • SSH接続ポート番号変更

ファイアウォール(UFW)設定

NimbusはデフォルトでTCP&UDP 9000番ポートで待ち受けるため、このポートだけ開放する。(SSH使用する場合は、該当ポートも開放)
参考:Raspbianにファイアウォールufwのインストールと設定

初期状態ではUFWはインストールされていないので、まずインストールする。

sudo apt install ufw

インストール直後はdisable&受信は全て拒否なので、Nimbus待ち受けポートを開放した後有効化する。

#TCP&UDP 9000番ポートの受信を開放
sudo ufw allow 9000
#有効化
sudo ufw enable
#再起動
reboot

Nimbusの依存関係をインストール

sudo apt-get install git

パフォーマンス関連の設定

※ラズパイ上の処理が間に合っていない場合、Nimbusのログに以下出力が大量に残る。

Catching up on validator duties

Swapメモリの設定

Nimbus公式によると、2GB以上のSwapを設定すべきとのこと。
参考:increase-swap-size-to-2gb

※2021/1/30時点でNimbusでValidator実行中のメモリ消費量は700MB(GUI使用でもシステム全体で950MB)程度。
 今のところ、あまり必要ないかも。

OSのログ出力を削減

Nimbusは大量にSSDアクセスするので、OSログを出来るだけ減らした方が良い。
参考:【STEP-29】Raspbianのログ出力を抑制してSSDを延命化

SSDから起動可能にする

こちらを参考に、microSDの内容をSSDにコピー。
※この段階までに、ここまでのRasperryPi OSの設定を行っておく。
 SSDにコピーした後のmicroSDを保管しておけば、
 SSDが破損したときなどに、別のSSDへコピーしなおすことで、環境を迅速に復旧できる。
 (Nimbus停止中は、動作中の報酬と同程度のETHがペナルティとして減ってゆくので、迅速に復旧が必要)

Nimbusの実行

ビルド

#ソースコードを取得
git clone https://github.com/status-im/nimbus-eth2
#取得したソースのフォルダに移動
cd nimbus-eth2
#ビルド
make nimbus_beacon_node

最近のリリースではバイナリがUPされているので、それを使用してもよい。

Validatorキーのインポート

"nimbus-eth2/validator_keys"下に、ETH2 Launch Padでデポジットした時に出力したkeystoreファイルを配置し、"nimbus-eth2"下で以下コマンドを実行。

build/nimbus_beacon_node deposits import --data-dir=build/data/shared_mainnet_0

"nimbus-eth2/build/data/shared_mainnet_0"下の"secrets"と"validators"はバックアップしておく。

Nimbus(Validator)実行

単に実行するだけなら、オプション無しの以下コマンド。

./run-mainnet-beacon-node.sh

実行すると、ETH1クライアントのURLを求められるので入力。
※ETH1クライアントはGethなどを自分で立ち上げるのが理想だが、さらに大容量のSSD(2021/1時点で350GB以上)が必要なので、infuraで代替する。(フリープランで十分利用可能)

ただ、オプション無しでは以下の問題(大きいのは1)がある。

  1. ラズパイがルータの背後にいる場合、他のノードから見つけられない。結果、peer(接続する他ノードの数)が低くなる。
    • peerは最大160で、正常に接続できていれば1時間かからず到達するが、この状態だと20-40程度までしか上がらなくなる。peerが少ないとattestation(検証)がネットワークに伝達されず(?)、失敗扱いになり、その分の報酬がマイナスとなる。(最悪50%程度失敗する)
  2. Nimbus動作中は、結構な量のログを出力する。特に同期中は長時間化の要因になるので出力を削減した方が良い。

そのため、以下のオプションを追加してNimbusを起動する。

#"--nat:extip:$(curl ifconfig.io)":グローバルIPを設定
#"--log-level=NOTICE":ログ出力量を削減
./run-mainnet-beacon-node.sh --nat:extip:$(curl ifconfig.io) --log-level=NOTICE

※Nimbus公式のLog-levelsには、利用可能なオプションが示されている。

ルータ設定について

上記の"--nat:extip"を設定しても、ルータ側にも設定を行わないと、9000番ポートで待ち受けが出来ないので、結局peerが上がらない。

  • ルータでTCP&UDP 9000番ポートをラズパイのIPアドレスのフォーワーディング設定する。
  • グローバルIPアドレスを占有する。
    • ポケットWifiや、集合住宅のネット接続サービスでは、他の回線利用者とグローバルIPを共有している。
    • 設定後、外部からアクセス可能かはZenmapで確認可能。

まずノードの同期が必要(数日かかる)で、その間はValidator実行状態にならない。
ETH2 Launch Padでのデポジット後、Activateされるまで時間がある(2021/1/30時点で16日程度待たされる)ので、それまでに同期を完了させる。

Nimbusをサービスに登録

ここまででもNimbusは実行できるが、サービスに登録しておけば、OS起動時に自動実行できる。
また、次節のグローバルIP変更追従のためにもサービス登録が必要。

参考:Set up a systemd service

以下"nbc.service"を作成し、"/etc/systemd/system/"に保存する。
実行時のグローバルIPを反映するよう、ExecStartPreを追加。
参考:systemd の Environment / EnvironmentFile では変数展開できません

/etc/systemd/system/nbc.service
[Unit]
Description=Nimbus beacon node

[Service]
WorkingDirectory=【Nimbusのルートフォルダ("nimbus-eth2")フルパス】
ExecStartPre=+/bin/sh -c "/bin/systemctl set-environment VALIDATOR_GLOBAL_IP=$(curl -s ifconfig.io)"
ExecStart=【Nimbusのルートフォルダ("nimbus-eth2")フルパス】/build/nimbus_beacon_node \
  --non-interactive \
  --network=mainnet \
  --data-dir=build/data/shared_mainnet_0 \
  --web3-url=【ETH1クライアントのURL】 \
  --rpc:on \
  --metrics:off \
  --nat:extip:${VALIDATOR_GLOBAL_IP} \
  --log-file=【ログ出力先フルパス】 \
  --log-level=NOTICE
User=【ログインユーザ名】
Group=【ログインユーザ名】
Restart=always

[Install]
WantedBy=default.target

上記を保存したうえで、systemctlを実行。

sudo systemctl daemon-reload
sudo systemctl enable nbc --now

グローバルIPアドレス変更に自動追従してNimbusを実行

サービス実行しても、前述のとおり、グローバルIPが定期的に変更されてしまうネット環境では、そのIPを反映してNimbusを再起動する必要がある。
グローバルIPアドレス変更をトリガに、nbcサービスを再起動するスクリプトを、
cronにサービス登録することで、自動追従する。

参考:
Lubuntuで自宅IPの変更通知
ラズベリーパイ4でcronを動かす

AutoRestartNBC.sh
#現在のグローバルIPを取得.
ipaddress=$(curl -s ifconfig.io)
#/tmp/global_ipaddressに前回実行時(1分前)のグローバルIPを格納.
global_ipaddress=$(cat /tmp/global_ipaddress)

#現在と前回実行時のグローバルIPを比較して,変更していたらnbcサービス再起動.
if [ "${ipaddress}" != "${global_ipaddress}" ]; then

  datetime=$(date +%Y%m%d_%H%M%S_%3N)
  echo "IP Address chenge:${datetime}  IP:${ipaddress}" >> 【ログ出力先フルパス】
  echo ${ipaddress} > /tmp/global_ipaddress  

  #nbcサービスを再起動.
  systemctl restart nbc.service
  datetime=$(date +%Y%m%d_%H%M%S_%3N)
  echo "nbc.service restart:${datetime}" >> 【ログ出力先フルパス】
fi

上記スクリプトをcronに登録して、定期実行する。

sudo crontab -e
#crontabの編集モードになるので,末尾に以下を追記(毎分実行する設定になる).
* * * * * 【AutoRestartNBC.shのフルパス】

その他

SSDの消費量について

2021/1/30時点でDBサイズは4.6GB。今のところ2.3GB/Month程度増加。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0