#概要
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)がある。
- ラズパイがルータの背後にいる場合、他のノードから見つけられない。結果、peer(接続する他ノードの数)が低くなる。
- peerは最大160で、正常に接続できていれば1時間かからず到達するが、この状態だと20-40程度までしか上がらなくなる。peerが少ないとattestation(検証)がネットワークに伝達されず(?)、失敗扱いになり、その分の報酬がマイナスとなる。(最悪50%程度失敗する)
- 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を共有している。
- WimaxルータはグローバルIPの占有設定が利用できる(有料)
- しかし、占有してもWimaxルータのグローバルIPは定期的に変わってしまうため、都度"--nat:extip"を設定して再起動が必要。
- 設定後、外部からアクセス可能かはZenmapで確認可能。
- ポケットWifiや、集合住宅のネット接続サービスでは、他の回線利用者とグローバルIPを共有している。
まずノードの同期が必要(数日かかる)で、その間はValidator実行状態にならない。
ETH2 Launch Padでのデポジット後、Activateされるまで時間がある(2021/1/30時点で16日程度待たされる)ので、それまでに同期を完了させる。
###Nimbusをサービスに登録
ここまででもNimbusは実行できるが、サービスに登録しておけば、OS起動時に自動実行できる。
また、次節のグローバルIP変更追従のためにもサービス登録が必要。
以下"nbc.service"を作成し、"/etc/systemd/system/"に保存する。
実行時のグローバルIPを反映するよう、ExecStartPreを追加。
参考:systemd の Environment / EnvironmentFile では変数展開できません
[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を動かす
#現在のグローバル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程度増加。