清水理史の「イニシャルB」

イーサリアム 2.0 Testnetの自宅サバを、インフラ監視ツールで稼働確認!~実際にペナルティも受けてみた

インフラ監視ツール「Prometheus」、可視化ツール「Grafana」を活用

 前回は『自宅サバで作る! イーサリアム 2.0 TestnetのValidatorノード(Prysm版)』と題し、暗号資産(仮想通貨)のテクノロジーに触れるための環境を準備してみた。

 今回は、可視化ツールである「Grafana」を追加でインストールすることで、詳細な稼働状況を確認できる環境を整えてみよう。さらに、Testnetで実際にサーバーを運用しつつ、わざとペナルティを受けてみたり、環境のバックアップとリストアの方法を確認したりして、サーバーの運用管理や監視などのノウハウを蓄積得ることも目指す。

詳細な稼働状況確認(Prometheus+Grafana)

 インフラ監視ツールの「Prometheus」と、可視化ツールの「Grafana」を利用することで、Prysmの稼働状況をより詳細に確認できるようになる。Validatorノードがダウンした際の通知なども受け取れるため、インストールを推奨する。

準備

 PrysmではPrometheus用のポートに以下を利用する。これらは標準で有効化されているが、冒頭でも触れた通り、マシンの設定によってはufwなどであらかじめ接続を許可しておく必要がある。

Prometheus+GrafanaをPrysmと同じマシンで稼働させる場合

  • Prometheus監視用
      TCP 9090
  • Grafana接続用
      TCP 3000

Prometheus+GrafanaをPrysmとは別のマシンで稼働させる場合

別マシンで稼働させる場合、Prysm.shで`--monitoring-host`オプションの指定が必要

  • Prometheus監視用
      TCP 8080(beacon node)
      TCP 8081(Validator)
      TCP 8082(Slasher)
  • Prometheus node-exporter用(外部から監視する場合)
      TCP 9100
  • Prometheus接続用
      TCP 9090
  • Grafana接続用
      TCP 3000
screen -dmS PrysmBeacon $HOME/prysm/prysm.sh beacon-chain --http-web3provider=http://127.0.0.1:8545/ --monitoring-host=192.168.1.18 --pyrmont --log-file=$HOME/log/prysmBeaconChain.log

screen -dmS Validator $HOME/prysm/prysm.sh validator --web --grpc-gateway-host=192.168.1.18 --wallet-password-file=$HOME/.password/password.txt --monitoring-host=192.168.1.18 --pyrmont --log-file=$HOME/log/validator.log

screen -dmS Slasher $HOME/prysm/prysm.sh slasher --monitoring-host=192.168.1.18 -pyrmont --log-file=$HOME/log/slasher.log

Prometheusのインストール

 Prometheus本体とマシンの情報を取得するためのPrometheus node-exporterをインストールする。Prysmの状態はPrysmから取得できるが、マシンそのものの状態(メモリやCPUなど)を取得するにはnode-exporterが必要だ。
 前回の記事で、すでにマシンへPrysmをインストール済みだが、Prometheusについては公式ウェブサイトからダウンロードしてインストールしてもいい。

sudo apt install -y prometheus prometheus-node-exporter

 Prometheusに監視先のノードを追加する。

sudo nano /etc/prometheus/prometheus.yml

 設定ファイルを開き、以下を追記する。なお、PrometheusおよびGrafanaを別のマシンにインストールする場合、「localhost」の部分を、PrysmをインストールしたマシンのIPアドレス(Prysmのmonitoring-hostで指定したアドレス)へ変更する。

#Etherreum2
  - job_name: 'validator'
    static_configs:
      - targets: ['localhost:8081']
  - job_name: 'beacon node'
    static_configs:
      - targets: ['localhost:8080']
  - job_name: 'slasher'
    static_configs:
      - targets: ['localhost:8082']

 インストール後、`sudo systemctl restart prometheus`で再起動してから、「http://192.168.1.18:9090/targets」で設定が反映されているかを確認する。また、「http://192.168.1.18:9090」でクエリをテストできる。Grafana用のパネルを作成する際に、独自のQueryを使いたい場合は、このページを利用する。

Grafanaインストール

 可視化ツールのGrafanaをインストールする。以下のページを参考に最新版をインストールする(バージョン番号を置きかえ)。

sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/oss/release/grafana_7.5.2_amd64.deb
sudo dpkg -i grafana_7.5.2_amd64.deb

 インストール後、サービスとして稼働させる。

sudo systemctl enable grafana-server.service
sudo systemctl start grafana-server

 アドレス「http://192.168.1.18:3000/login」からアクセスしてパスワードを設定し、動作を確認する。初期アカウントはadmin/admin。

 最初にデータソースを追加する。左側の[Configuration]から[Data Source]を選択し、[Add data source]で[Prometheus]を追加。URLに「http://localhost:9090」を設定しておく。

Grafanaダッシュボードの構成

1. Prysmダッシュボードの追加

 Prysmを監視するためのGrafanaのダッシュボードをダウンロードする。以下の2種類が用意されているが、通常はsmall amountの方で構わない。

 jsonファイルをダウンロードできたらGrafanaにインポートする。左側の[+]から[import]を選択し、[Upload JSON file]でインポートする。

 標準では最上部にREADMEが表示されるので、ドラッグして場所を移動しておくと見やすくなる。

2. node-exporterダッシュボードの追加

 マシンそのものを監視するためのダッシュボードを追加する。以下から、「node exporter」などで検索して好みのダッシュボードをダウンロードし、上記と同じ手順でインポートする。

 今回は「1 Node Exporter for Prometheus Dashboard EN v20201010」を利用した。CPUやメモリなどに加えてネットワーク帯域も監視できるため、1時間あたりの転送量が一定を超えたタイミングでアラートを受け取ることなどができる。

3. アラート受信

 アラートを受け取れるようにしておく。左側のメニューの[Alerting]から[Nortification Channels]を選択し、[New channel]からアラート先を登録する。メールやDiscord、Google Chatなどで受け取ることが可能。

 続けてアラートを受け取る項目を設定する。[Alerting]の[Alert Rules]を開き、[Edit alert]から作成したAlert channelを登録しておく。

4. パネルの追加

 [ETH staking dashboard]にパネルを追加する。

 まずは、Prometheusのウェブインターフェース(http://192.168.1.18:9090)を使ってクエリを試す。

 一番上のボックスに文字列を入力して検索するか、[Execute]の右側のドロップダウンボックスから[node_network_transmit_byte_total]を選択し、[Execute]をクリックすると、Prometheusからの返答が表示される。これをベースにGrafanaのパネルを作成する。

 また、[Element]に表示された情報を確認しておく。[device=]や[instance=]、[job=]などは環境によって異なるため、Grafanaのパネルに設定する際にここを環境に合わせて設定する必要がある。

 Grafanaに戻り、画面上部の[Add Panel]から[Add new panel]をクリックし、[Metrics]に次の文を入力する*(Prometheusに表示されたdeviceやinstance、jobなどに書き換えが必要)*。

increase(node_network_transmit_bytes_total{device="ens160",instance="localhost:9100",job="node"}[60m])

 この例では、`increase`と`[60m]`で、1時間あたりの増加量を表示するようになっている。

 そのままでは見にくいので、グラフをカスタマイズする。[Settings]の[Panel title]にタイトルを表示し、[Axes]の[Left Y]で[Unit]を[DATA]の[bytes(SI)]に変更することで、MB単位で表示されるようになる。

 最後に[Alert]タブで[Create Alert]をクリックし、アラートの条件を次のように設定する。

WHEN avg() OF query(A, 5m, now) IS AVOBE 500000000

 そして、[Send to]で[+]をクリックし、上で登録したアラート通知先(標準はalert)を選択すると、5分平均で500MB以上の通信が発生した場合に、指定したメールやメッセージツールにアラートが届くようになる。

ペナルティを体験する

 今回の構成はTestnetでの構成のため、意図的にノードをダウンさせ、どのような状況でペナルティが発生するのかを体験することができる。

ペナルティの概要

 Ethereum 2.0のステーキングでは、次のような動作をしたときにペナルティが発生する。

  • スラッシング
    誤った投票による罰則
  • オフライン
    投票をしなかったことによる利益の喪失

 深刻なのはスラッシングされることで、多くの資産(Testnetの場合はGoETH)を失う可能性がある。

スラッシング

 スラッシングは、悪意のある攻撃を防ぐための機能となっているが、意図せず発生する可能性もある。具体的には、同じキーを使って2重にValidatorを稼働させた場合などである。意図せず稼働させてしまう場合もあるが、クラスター構成でバックアップノードに移行する際に一時的に発生するケースなども考えられる。この場合、一定期間、ステークしたETHがロックされ、スラッシュが解除されるまでペナルティを受け続けることになる。

 以下は、Mainnetの[Beaconcha.in](https://beaconcha.in/)から確認できるSlashingの例である。EPOCH28345でAttestation Violation(二重投票など)の理由で[Status]が[Slashed]となっており、-0.239627251ETHのペナルティが発生し、現状は[Exited]となっている。

 預けたファンド(最初に送信した32ETHから収益やペナルティを差し引いた残高)を引き出せるのはEPOCH36532以降となり、それまでEPOCHあたり(6分半ごと)に-0.00003ETH前後のペナルティが引かれ続けることになる。

オフラインペナルティ

 一方、オフラインのペナルティは、メンテナンスのためにマシンを一時的に停止したり、トラブル発生時にバックアップからリストアしたりすることもあるため、こちらは日常的に発生する可能性がある。

 オフラインによるペナルティの例を見てみよう。次は、Pyrmont Testnetのオフラインペナルティの例だ。

 [Active]が赤いアイコンになっている上、Validator Historyで「Miss」が連続して表示されているので、おそらくオフラインのまま放置されていると考えられる。先の例のように、スラッシュされた場合は、[Status]が[Slashed]と表示されるが、こちらは[Active]のままだ。

 このようにStakingでは、オフラインでValidatorが機能しない場合にペナルティが発生し、その間、一定のETHがマイナスさせる仕組みになっている。

 具体的にどれくらいマイナスされるかは状況によって異なるが、2021年4月時点の上記例では、エポック(6分半ごとに発生)あたり0.0002~0.00003ETHがマイナスされる。これが積み上がると、上記のサイトの例では、1日オフラインの状態が続くと合計で0.0055ETHほどが失われることになる。

 仮にMainnetで運用している場合、Ethereumの価格は2021年4月6日時点で1ETH=23万円前後なので、1日オフラインになると1300円前後が失われていくことになる。

 このため、Mainnetで運用する場合は、先に述べたGrafanaなどで状態を監視したり、アラートを受け取ることで速やかにトラブルを発見、回復できるようにしておくことが重要である。

Testnetでオフラインペナルティを受けてみる

 市場で取引されているETHではなく、テスト用のGoETHを利用している場合は、実際の資産が目減りするわけではないので、こうしたペナルティの状況を自分で体験することができる。

  間違ってもMainnet環境では実行しないこと!

 まず、自分のValidatorキーを確認する。Prysm WEBインターフェース(http://192.168.1.18:7500/)にアクセスして、[Account List]から自分の[Validator Public Key]をクリックしてコピーする。

 続いて、以下のサイトにアクセスして、検索ボックスにコピーしたValidator Public Keyを貼り付けて自分のValidatorの状況を表示する。Validatorが正常に動作していれば、以下のように表示される。

 準備ができたら、マシンを停止したり、Validatorモードで動作しているPrysmを停止するなどして、Validator Historyの状況をチェックする。

 この際、Grafanaでアラートを設定している場合は、Validatorが停止したことを知らせるアラートを受け取れるはずなので、着信しているかどうかを確認しておくと安心(マシンが停止した場合はGrafanaも停止してしまうためアラートは届かないので注意。このため監視サーバーは分けた方が安心)。

 オフラインになってから実際にペナルティが発生するまでにラグがあるので、2EPOCH(12分前後)経過すると、MISSの表示が出るようになり、ペナルティとして0.00002~0.00003ETH(GoETH)がマイナスされていく様子を確認できる。

バックアップとリストア

インポートによるアカウントの復元

 もっともシンプルなバックアップとリストアは、「validator_keys」ディレクトリを利用したアカウントのインポートとなる。仮にマシンが復旧不可能になった場合でも、「validator_keys」さえ手元にあれば、新たな環境(Geth、Prysmをインストールし、同期させておく)を用意した上で、Validatorに以前と同じvalidator_keysをインポートすることで復元が可能となる。

 インポートする際は、新たに作成するウォレットに対して新しいパスワードを設定することと、インポート元のキーペアに設定されたパスワードの入力が必要。

 ただし、同期に時間がかかるため、ダウンタイムが長くなり、ペナルティを受ける時間が長くなるので注意が必要となる。

 なお、この方法は、Validatorとして稼働させるマシンを移行したい場合にも利用できる。

cd prysm
./prysm.sh validator accounts import --keys-dir=$HOME/validator_keys
**注意**

Slashingの対象となるため、同じアカウントを利用して複数台のマシンで同じキーペアを利用し、同時にValidatorを起動しないこと! Slashingペナルティにより多くのETH(GoETH)が失われることになる

データベースも含めたフルバックアップ

 マシンをフルバックアップできる環境を用意できるのであれば、データベースも含めたフルバックアップとリストアも可能。この方法では再同期よりも短時間で復元できるため、オフラインによるペナルティの量を少なくできる。

 方法はさまざまあるが、筆者の環境ではSynologyのNASに搭載されているActive Backup for Businessを利用し、ESXiの仮想マシンをまるごとNASにバックアップすることで対応している。仮想マシンを削除し、リストアする実験を何度か実行したが、問題なく復元して再稼働させることができた。

Validatorの解除

 Validatorを解除したい場合は次のコマンドを利用する。この際、Beacon-chainに解除要求を送信するため、必ずBeacon-chainが稼働している状態で解除する必要がある。

cd prysm
./prysm.sh validator accounts voluntary-exit

 実行するとWalletのパスワードを問われるので入力し、解除するアカウントを選択する。確認が表示されたら「Y」を入力し、さらにファンドの引き出しに関する[注意事項](https://docs.prylabs.network/docs/wallet/exiting-a-validator/#withdrawal-delay-warning)を確認し、そのページの最後に記載されている単語(**Exit my validator**)を入力する(最後の「.」不要)。

**注意**

解除せずにマシンを停止すると、シンプルにオフラインと見なされペナルティが発生し続けることになる。Validatorとして稼働させる意志がない場合は必ず解除すること

**注意**

解除してもすぐには預けた32ETHを引き出すことはできないので注意。Phase2になるまでは預けたままになる

 Exit要求の状況は、Prysmのウェブインターフェース(http://192.168.1.18:7500)、またはhttps://pyrmont.beaconcha.in/(Pyrmont Testnet)やhttps://beaconcha.in/(Mainnet)から自分のアカウントを検索すると表示される。しばらくの間は、稼働させたままにしておく。

 最終的に「Exited」となり、ペナルティも発生しなくなったこと(「Inac」になる)を確認したら、マシンを停止しても問題ない。

実体験で仕組みを学べる

 以上、暗号資産(仮想通貨)に興味はあるが、投資するまでには踏み切れないと考えている人に向け、実際に手を動かして暗号資産のテクノロジーに触れられる方法を紹介してみた。

 どうなったら資産が目減りするのか? どうすれば資産減少を最小限に留めることができるのか?

 こうした課題を持ちつつ、Testnetで実際にサーバーを運用することで、サーバーの運用管理や監視などのノウハウを蓄積することが本稿の最終的な目的だ。複雑でとっつきにくいEthereum 2.0の仕組みを理解する手助けにもなるので、ぜひ挑戦してみることをお勧めしたい。

清水 理史

製品レビューなど幅広く執筆しているが、実際に大手企業でネットワーク管理者をしていたこともあり、Windowsのネットワーク全般が得意ジャンル。最新刊「できる Windows 10 活用編」ほか多数の著書がある。