清水理史の「イニシャルB」
自宅サバで作る! イーサリアム 2.0 TestnetのValidatorノード(Prysm版)~資産の減少を防ぐにはどう運用管理する?
2021年5月10日 06:00
暗号資産(仮想通貨)に興味はあるが、投資するまでには踏み切れない……。そう考えている人は、実際に手を動かして暗号資産のテクノロジーに触れてみるところから始めてみてはどうだろうか?
特に、サーバー管理やネットワーク監視などに興味がある人にとって、ブロックチェーンのネットワークを自宅で運用することができるのは、なかなか「やりがい(遊びがい)」のある魅力的な話だ。
例えば、イーサリアム(Ethereum)は2020年末にEthereum 2.0と呼ばれる大規模なアップデートの初期段階のフェーズ(フェーズ0)がスタートし、ブロックチェーンのコンセンサスメカニズムを従来の「PoW(プルーフオブワーク)」から「PoS(プルーフオブステーク)」への切り替えを開始した。
これにより、32ETHを2年ほど預ければ、誰でもEthereum 2.0の「Validator(バリデーター)」としてネットワークに参加することができ、現実的な性能のコンピューティングリソースの元で、ブロックの承認をすることができる。
従来のPoWでは、マイニングに高いコンピューティングパワーが要求されたが、PoSではValidatorの中からランダムに選択されたユーザーがブロックの承認をするため、いわゆる計算競争をする必要がない。つまり、高価なグラフィックカードなどを用意することなく、ブロックチェーンのネットワークに参加することができるわけだ。
もちろん、暗号資産の価格高騰が続く現在(2021年4月)では、「32ETH(700万円以上)を預ける」という時点で、とてつもなく敷居が高くなってしまったが、本番環境となるMainnetとは別のTestnetを利用することで、こうした費用負担なく(もちろん報償も通貨的な価値はない)、ValidatorとしてEthereum 2.0の世界を体験することができる。
自宅サーバーでイーサリアム 2.0のステーキングの世界を実現
本稿は、こうしたEthereum 2.0のステーキングの世界を、自宅に設置したサーバーで実現するための方法を記したものとなる。
Eth1のGoerli Testnet、およびEth2のPyrmont Testnetを利用し、無償で手に入れられる33GoETH(テストネット用の通貨)をデポジットして、実際にEthereum 2.0のValidatorを稼働させる方法を紹介している。
サーバーの構築はもちろんのこと、自宅で運用する際に重要になるネットワーク帯域のコントロール、PrometheusとGrafanaを使った監視、バックアップとリストアなどの運用管理、さらにはサーバーがオフラインになった場合に課せられるペナルティについても検証することで、より実践的な内容になることを目指した。
Mainnetであれば、相場変動によって大きな資産減に見舞われたり、障害によって700万円が大きく失われたり、ペナルティによって資産が日々目減りしていく様子を見続ける恐怖が常に付きまとうが、Testnetであれば実際の費用負担なく、こうした様子だけを実際に体験することができる。
ここで、その恐怖を少し体験してみよう。本稿でも紹介しているが、[beaconcha.in]の「Validator Statking Leaderboard」から、「LAST」の項目を参照してみて欲しい。
赤文字で表示されているのは、預けた資産がペナルティによってマイナスされているValidatorの状態だ(もちろんMainnetなので実際の価値を持つ資産)。何らかの理由でサーバーがオフラインになっている、もしくはリストアの失敗やクラスター構成の不備で二重起動によるペナルティ(スラッシング)を受けたValidatorがずらりと並んでおり、中には長期間放置されたままの(要するにサーバーが停止していることに気付いていない)例もある。
Mainnetで、これをやったら致命的だが、Testnetなら、実際のリスクなく、こうした状況を体験することもできる。
Validatorノード稼働の準備
Validatorノードを稼働させるための環境を用意する。
ハードウェアはノートPCなども利用可能だが、ここでは仮想マシンを利用する。
CPUやメモリ、ストレージはMainnetでの運用も想定した場合はリッチな環境が必要となるが、Testnetのみであればメモリは8~16GB、ストレージもTestnetを利用する場合は200GB程度で運用が可能。
回線は、外部にポート公開が可能であることが必須(TCP/UDP 30303、TCP 13000、UDP 12000)。また、大量の通信が発生する点に注意が必要。Testnetの場合で1日平均15GBほどとなる。
OS:64-bit Linux、macOS、Windows
CPU:Intel Core i7-4770以上(CPU PassMark 5000以上推奨)
メモリ:8GB
ストレージ:200GB SSD
インターネット:Broadband Connection
ホストマシン | 仮想マシン | |
OS | ESXi 7.0.1 | Ubuntu 20.04 |
CPU | Intel Core i5 9400 | 4 vCPU(平常時585MHz使用) |
メモリ | 64GB | 16GB(平常時2.56GB使用) |
ストレージ | 500GB SSD+1TB SSD | 500GB |
ネットワーク
IPアドレス:192.168.1.18(固定割り当て)
回線:auひかり 10Gbps
ルーター:BL1000HW
Mainnetを利用する場合は、2021年4月時点で、Eth1の同期に340GB程度のストレージが必要となる上、今後の増加も見込まれるため、SSDは1TBを推奨。メモリも16GBを推奨(Slasherを稼働させるなら32GB推奨)。
加えて、ネットワーク帯域にも注意が必要だ。Mainnetでは1日の平均転送量が30GBを超えるため、契約しているISPによっては、帯域制限が発生する可能性がある。
例えば、上記構成例の「auひかり」の場合、上りの帯域において、特定の通信で1日あたり30GBを超える通信が連続すると、上り帯域が制限される。Testnetでは問題ないが、Mainnetを利用する場合、Eth1の接続ピア数を減らさないと、帯域制限によってValidatorの稼働率が下がるか、通信を遮断されペナルティが発生する可能性がある
ネットワークの設定
ポートフォワード
あらかじめ通信に利用するポートを公開する。ルーターの「ポートフォワード」や「ポート転送」などの機能を利用して以下のポートを仮想マシンのIPアドレス宛てに転送しておく。この設定はノードセットアップ後に実施しても構わない。
- Geth通信用(Eth1)
TCP/UDP 30303 - Prysm通信用(Eth2 beacon node)
TCP 13000
TCP 12000
なお、SSHやPrysm ウェブインターフェースなどの管理用のポートは外部に公開するのは避けること。どうしても自宅外から管理したい場合はVPNの利用を検討する。
ファイアウォール
また、マシン上でファイアウォールを利用する場合は、必要なポートへのアクセスを許可しておく必要がある。
共通で必要
- Geth通信用(Eth1)
TCP/UDP 30303 - Prysm通信用(Eth2 beacon node)
TCP 13000
TCP 12000 - SSH接続用
TCP 22 - Prysmウェブインターフェース
TCP 7500
Prometheus+GrafanaをPrysmと同じマシンで稼働させる場合
- Prometheus接続用
TCP 9090 - Grafana接続用
TCP 3000
ログディレクトリ作成
ログ用のディレクトリを作成しておく。
mkdir $HOME/log
セットアップ
プログラムのインストール
インストール先のマシンを準備しておく。
インストールするOSはubuntu 20.04。apt updateおよびapt upgradeによるアップデートを実行したり、SSH接続を構成したり、パスワードなどの設定を済ませてから、以下のプログラムをインストールする。
ファイアウォールについてはufwを利用するが、詳細は後述する。
各プログラムはサービスとして動作させることも可能だが、後からパラメーターの構成を柔軟にできるように手動で起動し、screenを使ってバックグラウンドで動作させることにする。
また、障害発生回復のために別のマシンに設定をリストアするときなど、意図せず同一キーを使用した二重起動が発生するとスラッシングの対象になりかねないため、少なくともValidatorに関しては、サービスによる自動起動は避けた方が無難である。
screenインストール
sudo apt install screen -y
gitインストール
sudo apt install git -y
Ethereumインストール
Eth1のブロックチェーンを同期するためのプログラムをインストールする。さまざまなものがあるが、今回はGeth(Go Ethereum)をインストールする。
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt install ethereum -y
Prysm Clientインストール
Eth2のビーコンチェーンを同期したり、Validatorノード(やSlasherノード)を起動するためのプログラムをインストールする。こちらも複数選択肢があるが、今回は「Prysm」をインストールする。
git clone https://github.com/prysmaticlabs/prysm.git
- Prysmatic Labs
https://prysmaticlabs.com/ - Installing Prysm with prysm.sh
https://docs.prylabs.network/docs/install/install-with-script
Eth1&Eth2ノードの起動
Eth1ノード起動
Gethを起動して、Eth1のブロックチェーンを同期する。接続先はGoerli Testnetを利用する。
screen -dmS Geth -L -Logfile $HOME/log/geth.log /user/bin/geth --http --goerli
- screen -dmS Geth
「Geth」という名前のscreenをバックグラウンドで作成 - -L Logfile $HOME/log/geth.log
screenの機能を使ってログを取得。保存先はログインしているユーザーのホームディレクトリの「log」 - /user/bin/geth
Gethを起動 - --http
PrysmからアクセスするためのHTTPポートを作成。標準は「http://127.0.0.1:8545」 - --goerli
Goerli Testネットワークに接続
※Gethのオプションの詳細はこちらを参照
https://geth.ethereum.org/docs/interface/command-line-options
Mainnetを利用する場合は、「--goerli」オプションを削除する。また、転送量を抑えたい場合は「--maxpeers 15」などと接続ピア数を制限する。一般的なISPの場合、ウェブページで条件が公開されているので、Grafanaなどで帯域をチェックしながら、制限を超えないようにピアを制限しないと、意図せぬ通信断などで、Validatorがペナルティを受ける可能性がある。
Eth1同期確認
screenで起動しているので、screenの基本操作を確認するが、普段はあまり使わない。
screen -ls
スクリーンに移動する。
screen -r Geth
スクリーンから抜ける。
Ctrl+a d
基本的な管理は、ログを確認するかGethを利用する。まずは、ログを確認する。
tail -f $HOME/log/geth.log
Gethを利用して同期状況を確認する。同期状況が表示される場合は待機。「false」と表示されれば同期が完了している。
geth attach http://127.0.0.1:8545
eth.syncing
ctrl+d
Eth2 Beacon Chain起動
Prysmを利用してEth2のBeacon Chainを起動する。ここではpyrmont testnetに接続する。Gethによる同期が完了してから実行する。
screen -dmS PrysmBeacon $HOME/prysm/prysm.sh beacon-chain --http-web3provider=http://127.0.0.1:8545/ --pyrmont --log-file=$HOME/log/prysmBeaconChain.log
- screen -dmS PrysmBeacon
「PrysmBeacon」という名前のscreenをバックグラウンドで作成 - $HOME/prysm/prysm.sh beacon-chain
beacon-chainモードでprysmを起動 - --http-web3provider=http://127.0.0.1:8545/
Gethに接続 - --monitoring-host=192.168.1.18
PrometheusやGrafanaを利用して監視する場合で、かつ監視マシンを外部に用意する場合に必要。このアドレスで接続を待ち受ける。同一マシンにPrometheusやGrafanaをインストールする場合は不要(Default: 127.0.0.1) - --pyrmont
pyrmont testネットワークに接続 - --log-file=$HOME/log/prysmBeaconChain.log
ログファイルを指定
※Prysmのオプションの詳細はこちらを参照
https://docs.prylabs.network/docs/prysm-usage/parameters/
Prysmの使用許諾に同意
Prysmをはじめて起動したときは、使用許諾への同意が必要。
screen -r PrysmBeacon
`accept`と入力し、`ctrl+a d`で抜ける。
Eth1の同期が完了していれば、ETH2のbeacon nodeとして稼働が開始されるが、初回は同期が必要。時間がかかる上、比較的多めのCPUパワーを消費する。CPUパワーの消費を押さえたい場合は、`--p2p-max-peers=25`オプションを付けて同期をある程度制限する(その分、時間はかかる)。同期が完了すると下のような画面になる。
Mainnetを利用する場合は、`--pyrmont`オプションを削除する。また、Mainnetでは転送量が多くなりがちなので、抑える必要がある場合は、`--p2p-max-peers=25`などで接続数を制限する
Validatorアカウントの作成
テスト用の33GoETHの入手
Goerli Testnetで使用するためのGoETHを入手する。StatkingにはGas代を含め33GoETHが必要となる。
まずはGoETHを受け取るウォレットを準備する。このみのウォレットアプリをインストールして、自分のETHアドレスを確認しておく。
ここではChromeの拡張機能として使える「METAMASK」を利用した。
- METAMASK
https://metamask.io/
GoETHの入手方法は複数ある。例えば、以下のような方法で入手できる。
- ETHStaker CommunityのDiscordから入手(即座に入手可能)
コミュニティの[ウェブサイト](https://ethstaker.cc/)からDiscordに参加し、「request-goerli-eth」に次のメッセージを書き込むとBOTによってGoETHが送信される。
!goerliEth [自分のウォレットのアドレス]
- Prysmatic LabsのDiscordから入手(登録から2週間経過すると入手可能)
こちらの[ウェブページ](https://docs.prylabs.network/docs/faq)などにあるリンクからPrysmatic Labsの[Discord](https://discord.com/invite/prysmaticlabs)に参加し、「request-goerli-eth」に次のメッセージを書き込むとBOTによってGoETHが送信される。
!send [自分のウォレットのアドレス]
Mainnetを利用する場合は、取引所などを通じて32ETH+Gas代を入手しておく。
キーペアの生成
バリデーターのアカウントで利用するキーストアを生成する。このデータは非常に重要。仮にマシンに障害が発生した場合でもキーストアのバックアップがあればValidatorアカウントを復元できるため、外部に必ず保存しておくこと。ただし、外部に漏洩すると悪用されるので管理は厳重に。
1. eth2.0-deposit-cliダウンロード
まず、キーストア生成用のツールをダウンロードする。次のページから最新版のファイルのリンクを取得し、wgetでダウンロードする。
- 「eth2.0-deposit-cli」リリース版
https://github.com/ethereum/eth2.0-deposit-cli/releases
2021年4月5日時点では1.2.0が最新版となるので、次のアドレスとなる。
wget https://github.com/ethereum/eth2.0-deposit-cli/releases/download/v1.2.0/eth2deposit-cli-256ea21-linux-amd64.tar.gz
tar xvzf eth2deposit-cli-256ea21-linux-amd64.tar.gz
2. eth2.0-deposit-cliの実行
展開したプログラムを実行し、パスワードの設定をする。キーストアのパスワードは忘れないように控えておくこと。
cd eth2deposit-cli-256ea21-linux-amd64
./deposit new-mnemonic --num_validators 1 --chain pyrmont
- new-mnemonic
新しいニーモニックフレーズを生成 - num_validators 1
稼働させるバリデーターの数。通常は1 - chain pyrmont
接続するネットワーク。ここではPyrmont Testnet
-- chain mainnet
3. ニーモニックフレーズを控える(重要!)
画面上に24個の単語で形成されるニーモニックフレーズが表示される。ウォレットの復元などに必要なので忘れないように控えると同時に、漏洩しないようにしっかりと管理する。
4. デポジットデータのダウンロード
eth2.0-deposit-cliによって生成されたファイル(eth2deposit-cli-XXXXXXX-linux-amd64/validator_keysにある)のうち、次のLaunchpadから登録する必要があるデポジットデータファイル(deposit_data-XXXXXXXXXX.json)をダウンロードする。キーストアもダウンロードして保管しておく。
Teratermの場合は、[ファイル]-[SSH SCP]で[From]に「eth2deposit-cli-XXXXXXX-linux-amd64/validator_keys/deposit_data-XXXXXXXXXX.json」を指定し、Toにダウンロード先のフォルダーを指定して「Receive」でダウンロード可能
アカウントインポート
作成したキーストアをValidatorにインポートする。上で作成したキーペアの情報を利用して、Validatorにアカウントを登録する操作となる。キーストアのパスワードを入力することでインポートできる。
これにより、walletが作成される。walletのパスワードを設定するので忘れないように控えておくこと。
cd prysm
./prysm.sh validator accounts import --keys-dir=$HOME/eth2deposit-cli-XXXXXXX-linux-amd64/validator_keys
- --keys-dir
eth2.0-deposit-cliで生成したキーペアのディレクトリ
デポジットデータのダウンロード、およびキーペアのインポートができたら、「validator_keys」ディレクトリは使用しない。オフラインの安全な場所に保管しておくことをお勧めする。
パスワードファイル保存
Validator実行時にパスワードをファイルから入力できるようにするためにファイルに保存しておく(保存先やアクセス権に注意)。
mkdir .password
chmod 700 .password
echo [walletパスワード] > .password/password.txt
chmod 600 .password/password.txt
Eth2 Pyrmont Launchpad(テストネットワーク用)の実行
Validatorを稼働させるための方法がステップバイステップで紹介されている「Eth2 Launchpad」を利用してセットアップを進める。
- Eth2 Pyrmont Launchpad(テストネットワーク用)
https://pyrmont.launchpad.ethereum.org/ja
Laucnpadの内容のほとんどは、上記で実行したものなので、ほぼ確認作業だが、デポジットデータのアップロードと32GoETHの送信が必要。
Launchpadは、Mainnet用とPyrmont Testnet用の2種類が用意されているので、テストで利用する場合は右上の表示が「Pyrmont」になっていることを確認。「Mainnet」の場合は、32GoETHではなく、32ETHが必要。
- Eth2 Launchpad(Mainnet用)
https://launchpad.ethereum.org/en/languages
2. アドバイザリーを読む
10項目の注意事項が表示される。概要や入金、ペナルティ、キー管理、リスクなどが表示されるので確認しておく。なお、ペナルティについては別項で詳しく紹介するが、Testnetなので深刻に考える必要はない。
3. Eth1クライアントの選択
Eth1ノードを実行するクライアントを選択する。ここでは、すでにGethを稼働させているので、このステップは確認のみとなる。一応、「Geth」を選択して、「--Goerli」でTestnetに接続していることや「--http」オプションでJSON RPCエンドポイントを稼働させていることを確認する。
4. Eth2クライアントの選択
Eth2ノードのクライアントを選択する。ここでは、すでにPrysmを稼働させているので、このステップも確認のみで構わない。一応、「Prysm」を選択し、「続行」をクリックする
5. キーペアを生成
キーペア作成方法が表示される。上記の「eth2.0-deposit-cli」で実行した手順なので確認のみで構わない。[私は自分のキーを安全に保管し、私のニーモニックフレーズを書き留めています]にチェックを付けて、[続行]をクリック。
7. walletの接続
ステーキングに必要な32GoETHを送信するために自分のwalletを接続する。ここではMETAMASKをインストールしているので「METAMASK」を選択。接続されると、アドレスや「Balance(残高)」が表示される。
8. 32GoETHの送信(これ以降は戻れないので注意)
1バリデーターあたり32GeETHのステーキングが必要なので、これを送信する。画面上の注意事項や送信先のアドレスなどを確認し、「続行」をクリック。
Validatorの起動
全ての準備が整ったら、Validatorを起動する。beacon chainの同期が完了していないとValidatorは稼働しないが、デポジット後にValidatorとして承認された後、Validatorを稼働させないと次の画面のようにペナルティが発生し続けるため、すみやかに稼働させることをお勧めする。
Validatorを起動するには次のコマンドを利用する。
screen -dmS Validator $HOME/prysm/prysm.sh validator --web --grpc-gateway-host=192.168.1.18 --wallet-password-file=$HOME/.password/password.txt --pyrmont --log-file=$HOME/log/validator.log
- screen -dmS Validator
「Validator」という名前で新しいscreenを作成 - $HOME/prysm/prysm.sh validator
validatorモードでprysmを起動 - --web
GUI操作が可能なウェブインターフェースを有効化。省略可 - --grpc-gateway-host=192.168.1.18
ウェブインターフェースにLAN上のPCからアクセスするための設定 - --wallet-password-file=$HOME/.password/password.txt
walletのパスワードを指定 - --pyrmont
pyrmont testnetに接続 - --log-file=$HOME/log/validator.log
ログファイルを指定
`--pyrmont`オプションは不要
Validator起動確認
Validatorの稼働状況は`screen -r Validator`で確認するか(ctrl+a dで抜ける)、次のコマンドでログを確認する。
tail -f $HOME/log/validator.log
また、ウェブインターフェースを有効にしている場合は、「http://192.168.1.18:7500」でアクセスして動作状況を確認可能。初回はパスワードの設定が必要なので、「--web」でウェブインターフェースを稼働した場合は、すみやかにパスワードを設定すること。
Slasherの起動
不正なノードを検出し報告するためのSlasherを起動する(任意)。2021年4月5日時点ではslasherコマンドで実行するが、将来的にprysm validatorコマンドのオプションになる予定。
screen -dmS Slasher $HOME/prysm/prysm.sh slasher -pyrmont --log-file=$HOME/log/slasher.log
- screen -dmS Slasher
「Slasher」という名前で新しいscreenを作成 - $HOME/prysm/prysm.sh slasher
slasherモードでprysmを起動 - --pyrmont
pyrmont testnetに接続 - --log-file=$HOME/log/slasher.log
ログファイルを指定
スタートアップスクリプトの管理
再起動の際などに簡単に各プログラムを実行できるようにするためにスタートアップスクリプトを作成しておく。ただし、Validatorの二重起動はペナルティの対象となるので要注意。
nano starteth2.sh
#!/bin/sh
echo "Start Geth!"
screen -dmS Geth -L -Logfile $HOME/log/geth.log /usr/bin/geth --http --goerli
echo "Start Beacon-chain!"
screen -dmS PrysmBeacon $HOME/prysm/prysm.sh beacon-chain --http-web3provider=http://127.0.0.1:8545/ --pyrmont --log-file=$HOME/log/prysmBeaconChain.log
echo "Start Validator!"
screen -dmS Validator $HOME/prysm/prysm.sh validator --web --grpc-gateway-host=192.168.1.18 --wallet-password-file=$HOME/.password/password.txt --pyrmont --log-file=$HOME/log/validator.log
echo "Start Slasher!"
screen -dmS Slasher $HOME/prysm/prysm.sh slasher -pyrmont --log-file=$HOME/log/slasher.log
chmod -x starteth2.sh
基本的な稼働状況確認
ログの確認
各ログを確認する。
tail -f $HOME/log/geth.log
tail -f $HOME/log/prysmbeacon.log
tail -f $HOME/log/validator.log
tail -f $HOME/log/slasher.log
ウェブインターフェースでの確認
ネットワーク内のPCからPrysmのウェブインターフェース「http://[仮想マシンのアドレス]:7500」にアクセスする。
- Validator Gains & Losses
バリデーターの稼働状況やBeaconノードの状況を確認できる。残高や収益が表示される
- Account List
インポートされているアカウントを確認可能。アドレスも確認できる - Wallet Information
Walletのディレクトリやキーストアファイルを確認可能
Wallet & Accounts
- System Logs
ValidatorおよびBeacon Nodeのログを確認可能
Process Analytics
- Peer locations map
接続されているピアの場所をマップ上で表示可能
- Change Password
パスワードの変更が可能
Security
- Read the Docs
ドキュメントへのリンク
beaconcha.inでの確認
Pyrmont Beacon Chain(Testnet用)の状況を確認できる。
[Ethereum 2.0 Beacon Chain (Phase 0) Block Chain Explorer - Index - beaconcha.in - 2021](https://pyrmont.beaconcha.in/)を利用すると、外部からの視点でValidatorの稼働状況をチェックできる。
自分のEth1アドレスを入力して検索し、一覧から、Validatorキーをクリックすると状況が見られる。赤文字のマイナスがペナルティ。スラッシングされると、その旨も表示される。
- Eth2 Launchpad(Mainnet用)
https://beaconcha.in/