自宅のサーバーでETHをステーキングする方法

目次

イーサリアムのPoWからPoSへの移行について

イーサリアムの初期チェーン1.0は PoW (プルーフ・オブ・ワーク)という合意形成アルゴリズムが採用されていますが、数年以内にPoS (プルーフ・オブ・ステーク)を採用しているイーサリアム2.0に完全移行する予定です。移行はフェーズ0、フェーズ1、フェーズ2と段階的に実施され、現在はフェーズ0が完了しています。

※PoWや PoSといった、ブロックチェーンの合意形成アルゴリズムの違いについてはこの記事を参考にしてください。

(参照元:The Eth2 upgrades | ethereum.org

2020年12月に稼働したフェーズ0では、ステーキング参加者の統率をとるためのビーコンチェーン(Beacon Chain)が実装されました。イーサリアム2.0の記録係はバリデーター(Validator)と呼ばれ、ビーコンチェーンはバリデーターの仕事を割り振る機能しかないため、まだ通貨の送受信やスマートコントラクトの利用はできません。電車が乗客なしで試運転してるようなイメージです。

通貨の送受信はフェーズ1で導入されます。また、このフェーズでイーサリアムのチェーンは複数のシャード(Shard)に分割され、分割した数だけ処理可能なトランザクション数(取引数)が向上します。次のフェーズ2までは、通貨の送受信のみが可能なイーサリアム2.0と、通貨の送受信とスマートコントラクトの両方が可能なイーサリアム1.0とが共存することになります。

フェーズ2で、イーサリアム1.0はイーサリアム2.0のシャードの1つとして取り込まれ、PoWは完全に廃止されます。取り込まれた直後にスマートコントラクトを使用できるシャードは元イーサリアム1.0のシャードのみの想定ですが、必要に応じて増える見込みです。

※2021年4月追記:フェーズ1のシャード分割をすっ飛ばして、先にフェーズ2を実施する(イーサリアム1.0とイーサリアム2.0をマージしてPoWを廃止する)案が発表され、主要な開発者の殆どが合意しています。背景にはマイナー達がEIP-1559に反発して51%アタックをアピールしようとした事案があり、マイナーを必要とするPoWは今すぐにでも廃止すべきという考えが浸透したためです。マージは2021年内を目標にしていますが2022年までかかるかもしれません。マージが完了しても直ぐにはステーキングのデポジットは引き出せるようになりません(引き出し用のコントラクトが実装されるのを待つ必要があります)。詳細はこのサイトにまとめられています。

ステーキングをするメリット・デメリット

ステーキングをすることで以下のメリットがあります。

  • 約7.6%(2021年5月現在)の年利報酬を得られる:バリデーターがオンラインである時間に応じて報酬が支払われ、半分くらいオフラインだと年利報酬がプラマイゼロになります。ネットワーク全体でステーキングされているETHの総量によって報酬は変動するため、正確な年利は公式のローンチパッドを参照してください。
  • イーサリアムのセキュリティを上げることに貢献する:バリデーターを個人で運用する人が増えれば増えるほど、イーサリアムのセキュリティは上がります。単なる投資手段としてステーキングに参加する人には関係のない話かもしれません。笑
  • サーバー知識が増える:自宅のサーバーでステーキングする場合はLinuxなどのサーバー知識が増えます。仕事や副業に活かせるかも。

逆に、ステーキングのデメリットは以下の通りです。

  • 担保のETHは約2年間引き出せない:自宅のサーバーでステーキングする場合は、イーサリアム2.0への移行が完了するまで担保としてデポジットしたETHは引き出すことができません。もちろん報酬も引き出せません。ステーキングを開始した後にやっぱりやめようと思った場合、ペナルティーのない任意退出(Volunatary exit、バリデーターの権限を返上してオフラインになってもいい状態にすること)はできますが、イーサリアム2.0の移行完了までETHが戻ってこないことに変わりありません。ただし、バイナンスなどにステーキングを委託する場合は、担保のETHと引き換えに貰うBETHを使用することができます(1ETH ≈ 1 BETH)。
  • 資産を失う可能性がある:自宅のサーバーでステーキングした場合は、ETHを引き出すときに必要な24単語のバックアップフレーズを紛失するとETHは絶対に引き出せなくなります。また、複数のサーバーで同じバリデーターを実行するなど、不正とみなされる行為をすると担保のETHの一部を没収(Slashing)され、バリデーターとしての資格を失います。2021年5月現在、過去5か月でSlashingを受けたバリデーターは135/129,892(約0.1%)です。この記事の通りに運用していればSlashingされることはまずありません。バイナンスなどにステーキングを委託する場合は、アカウント凍結や会社の倒産によって資産を引き出せなくなるリスクがあります。
  • メンテナンスをする必要がある:自宅のサーバーでステーキングする場合はクライアントのアップデート等のメンテナンスをする必要があります。バイナンスなどにステーキングを委託する場合は、メンテナンスの必要はありません。
  • 電気代がかかる:自宅のサーバーでステーキングをする場合はパソコンを24時間365日つけっぱなしにするため、月に500円程度の電気代がかかります。ステーキングの報酬に比べると500円は誤差の範囲です。バイナンスなどにステーキングを委託する場合は電気代がかかりません。
  • 32 ETHの単位でしかステーキングできない:自宅のサーバーでステーキングする場合、32 ETHの単位でしかステーキングができません。32 ETHは2021年5月現在の価格で約1,200万円です。バイナンスなどにステーキングを委託する場合は、ETHの保有量が32以下でもステーキングできます。

気付いた人もいるかもしれませんが、バイナンスなどにステーキングを委託した場合のデメリットは殆どありません。強いて言うならばアカウントの凍結や会社の倒産リスクくらいです。自宅のサーバーでステーキングすることによって年利報酬以外のメリットが得られるようになりますが、資産紛失のリスクは上がります。自宅でサーバーを運用する自信のない人は、ステーキングをバイナンスなどに委託することをお勧めします。手順4の「イーサリアム2.0のビーコンノードを同期する」まではETHを担保としてデポジットしなくても実施できるのでお試しでやってみてはいかがでしょうか。また、ETHのデポジットもお試しでやってみたい人は、イーサリアムのテスト環境であれば架空のETHを使用して実践できるのでSomer Esatのテスト環境での手順を参考にしてみてください。

自宅サーバーでのステーキング運用は何があっても自己責任でお願いします。このブログ以外にも、英語になりますがSomer Esatの手順や、CoinCashewの手順をリソースとして活用してください。この記事はSomer Esatの手順がベースとなっています。

自宅サーバーでのステーキングに必要なもの

  • 最低32 ETH:バリデーター1つあたり32 ETHを担保としてデポジットします。1つのサーバーで複数のバリデーターを運用することが可能です。
  • サーバーとしてステーキングに使用するパソコン
    推奨性能
    PassMarkが5000点以上のCPU
    ■ 1TB以上のSSD(HDDだと遅すぎです)
    ■ 16GB以上のメモリ
  • ステーキングに使用しないパソコン:インターネットに繋がっていれば性能はなんでもいいです。自分はWindowsを使いましたが、Macでも大丈夫です。ブラウザでETHをデポジットをしたり、サーバーを遠隔操作するのに使います。
  • エアギャップ用のパソコン:必須ではないですが推奨します。バリデーターの秘密鍵はエアギャップされた(インターネットにつながっていない)環境で作成するのが一番安全です。使わなくなった古いノートパソコンとかで大丈夫です。
  • ご自身のインターネット環境:ルーターの設定をいじるため公共インターネットでは難しいです。
  • USBメモリ:SDカードでも代用可能です。
  • 有線LANケーブル:サーバーは無線LANで運用してもいいですが初期設定で有線LANが必要になります。

ステーキング開始までの大まかな流れ

サーバーで以下のソフトを常時起動させておく必要があります。

  • イーサリアム1.0のノード:イーサリアム1.0の全トランザクション(取引)をダウンロードし、常に最新のトランザクションが同期されるようにします。
  • イーサリアム2.0のビーコンノード:バリデーターに仕事を割り振るために使われる出勤簿のようなものです。常に最新の情報が同期されるようにします。
  • イーサリアム2.0のバリデーター:イーサリアム2.0の取引記録係です。フェーズ1までは空のブロック(トランザクションのひとまとまり)を記録し続けます。

ステーキング開始までの流れは以下の通りです。
ダウンロードの待ち時間を含めると2日くらいかかります。実際の作業時間は5時間もないと思います。

  1. Ubuntu Serverのインストール
    自宅サーバーとなるパソコンにオープンソースのUbuntu ServerというOSをインストールします。
  2. Ubuntu Serverの細かい初期設定
    Ubuntu Serverのインターネットの設定など、細かい初期設定をします。
  3. イーサリアム1.0のノードを同期する
    イーサリアム1.0の全トランザクションをダウンロードし、常に最新のトランザクションが同期されるようにします。300GB以上あるのでダウンロードに1日程度かかります。
  4. イーサリアム2.0のビーコンノードを同期する
    バリデーターに仕事を割り振るために使われるビーコンノードをダウンロードし、常に同期されるようにします。ダウンロードに5時間ほどかかります。
  5. ETHをデポジットしてウォレットを作成する
    ステーキングに参加するため、バリデーター1つあたり32 ETHを担保としてイーサリアム2.0にデポジットします。デポジット後にバリデーターのウォレットを作成します。
  6. バリデーターを設定する
    取引の記録係であるバリデーターを設定し、常に起動されている状態にします。
  7. バリデーターの状況確認用のアプリをスマホにインストールする
    受け取った累計報酬などをアプリで確認できます。バリデーターがオフラインになったら通知してくれます。

ステーキングの開始手順

1. Ubuntu Serverのインストール

Ubuntu Serverのインストール方法はこの記事を参考にしてください。

2. Ubuntu Serverの細かい初期設定

SSH(遠隔操作)やセキュリティの設定をします。
各記事を参考にしてください。

  • セキュリティアップデートの自動更新:Ubuntuのセキュリティアップデートが自動で適応されるようにします。
  • IPv6の無効化:今のところステーキングにはIPv6が必要ないので無効化します。
  • ECNの無効化:念のためECNを無効化しておきます。
  • DNSサーバーの変更:グーグルのパブリックDNSを使用します。
  • ユーザーの作成:ethereumというユーザーを作成し、sudoというグループに入れてください。今後サーバーで作業をするときはこのユーザーを使用してください。
  • ファイアーウォールの設定:サーバーにアクセス可能なポートを制限します。任意のポート番号の他に、30303(Go Ethereum)と9000(Lighthouse)を許可してください。
  • 正確な時刻の設定:常に時刻が合っている必要があるためNTPをインストールします。
  • IPアドレスの固定:SSHで他のパソコンからサーバーを遠隔操作する場合は、IPアドレスを固定しないと面倒くさいことになります。
  • ルーターのポート開放:厳密にはUbuntu Serverの設定ではありませんが、ルーターのポート転送を設定します。ファイアーウォールの設定で変更した任意のポートと30303(Go Ethereum)と9000(Lighthouse)が固定したIPアドレスに転送されるように設定してください。
  • SSHの設定:他のパソコンからサーバーを遠隔操作できるようにします。
  • スワップ処理の無効化:スワップ処理によって無駄にCPUとSSDの負荷が増えないようにします。
  • (Wifiで運用する場合)Wifiの設定:標準ではWifiが使えないので使えるようにします。
  • (AMDのCPUを使用している場合)処理落ちを防ぐためこの記事の設定をしてください。

詳細設定の完了後は念のためサーバーを再起動してください。

sudo reboot

3. イーサリアム1.0のノードを同期する

イーサリアム1.0の全トランザクションをダウンロードし、常に最新のトランザクションが同期されるようにします。300GB以上あるのでダウンロードに1日程度かかります。今回は「Go Ethereum」というクライアントを使用します。

  1. Go Ethereumをインストールできるようにする。
sudo add-apt-repository -y ppa:ethereum/ethereum
  1. Go Ethereumをインストールする。
sudo apt update && sudo apt install ethereum -y
  1. Go Ethereum実行用のユーザーを作成する。
sudo useradd --no-create-home --shell /bin/false goeth
  1. ノードを保存するディレクトリを作成し、ユーザーgoethにアクセス許可を与える。
sudo mkdir -p /var/lib/goethereum
sudo chown -R goeth:goeth /var/lib/goethereum
  1. OS起動時にGo Ethereumが起動されるための設定ファイルを作成する。
sudo nano /etc/systemd/system/geth.service
  1. 以下を入力し、保存する。
[Unit]
Description=Ethereum go client
After=network-online.target 
Wants=network-online.target

[Service]
User=goeth 
Group=goeth
Type=simple
Restart=always
RestartSec=5
ExecStart=geth --http --datadir /var/lib/goethereum --syncmode=snap

[Install]
WantedBy=default.target

※イーサリアム1.0のノードとイーサリアム2.0のノードを別々のサーバーで運用する場合は、ExecStart=のパラメータに--rpc --rpcaddr 0.0.0.0 --rpcport 8545を追加し、ポート8545を開放してください。

※同期が完了したらExecStart=のパラメータに--maxpeers 10を追加すればデータの送受信を抑えられます。

  1. daemonをリロードし、Go Ethereumがちゃんと動くか確認する。
    active (running)と緑で表示されれば OK、Q で閉じる)
sudo systemctl daemon-reload
sudo systemctl start geth
sudo systemctl status geth
  1. OS起動時にGo Ethereumが起動されるようにする。
sudo systemctl enable geth
  1. 同期状態を確認する。(Ctrl + Cで閉じる)
sudo journalctl -fu geth

※全ての取引データがダウンロードされ、同期が完了するまで1日程度かかります。ログにImported new chain segmentが表示されるようになれば同期完了です。同期完了までは次の手順に進まないでください。

※急いでいる場合は、gethの同期を待たずにInfuraを併用して次の手順に進むのもありです。Infuraの設定方法は「SSDの容量を回復する方法」を参考にしてください。

4. イーサリアム2.0のビーコンノードを同期する

バリデーターに仕事を割り振るために使われるビーコンノードをダウンロードし、常に同期されるようにします。ダウンロードに5時間ほどかかります。利用可能なクライアントは4種類(Prysm、Lighthouse、Nimbus、Teku)ありますが、今回はビーコンノードとバリデーターに「Lighthouse」というクライアントを使用します。

  1. Lighthouseをインストールするのに必要なパッケージ(rustなど)をインストールし、PATHを通す。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
sudo apt install -y git gcc g++ make cmake pkg-config libssl-dev
snap install rustup --classic
  1. Lighthouseのリポジトリをクローン(ダウンロード)する。
cd ~
git clone https://github.com/sigp/lighthouse.git
  1. Lighthouseのバイナリをコンパイル(インストール)する。
cd lighthouse
make
  1. ビーコンノード実行用のユーザーを作成する。
sudo useradd --no-create-home --shell /bin/false lighthousebeacon
  1. ビーコンノードを保存するディレクトリを作成し、ユーザーlighthousebeaconに権限を付与する。
sudo mkdir -p /var/lib/lighthouse/beacon
sudo chown -R lighthousebeacon:lighthousebeacon /var/lib/lighthouse/beacon
  1. コンパイルしたLighthouseのバイナリをコピーする。
sudo cp /$HOME/.cargo/bin/lighthouse /usr/local/bin
  1. OS起動時にビーコンノードが起動されるための設定ファイルを作成する。
sudo nano /etc/systemd/system/lighthousebeacon.service
  1. 以下を入力して、保存する。
[Unit]
Description=Lighthouse Beacon Node
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=lighthousebeacon
Group=lighthousebeacon
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/lighthouse bn --network mainnet --staking --datadir /var
/lib/lighthouse --eth1-endpoints http://127.0.0.1:8545

[Install]
WantedBy=multi-user.target

※イーサリアム1.0のノード参照先(--eth1-endpoints)はスペースなしのカンマで複数指定することができます。複数ある場合、まずは1つ目のノードが参照され、ノードが最新の状態でなければ2つ目のノードが参照されます。1つ目にローカルで動かしているgethを指定し(http://127.0.0.1:8545)、2つ目に予備としてInfuraを指定するといいと思います(https://mainnet.infura.io/v3/9.....)。家の別のサーバーで動かしているgethを指定したいときは、IPアドレスとポート番号8545を指定します(例:http://192.168.0.88:8545)。

  1. systemdをリロードし、ビーコンノードがちゃんと動くか確認する。
    active (running)と緑で表示されれば OK、Q で閉じる)
sudo systemctl daemon-reload
sudo systemctl start lighthousebeacon
sudo systemctl status lighthousebeacon
  1. OS起動時にビーコンノードが起動されるようにする。
sudo systemctl enable lighthousebeacon
  1. 同期状態を確認する。(Ctrl + Cで閉じる)
sudo journalctl -fu lighthousebeacon

※全てのデータがダウンロードされ、同期が完了するまで5時間以上かかります。ログに「Synced」が表示されるようになれば同期完了です。同期完了を待たずに次の手順に進んで問題ないです。

5. ETHをデポジットしてウォレットを作成する

ステーキングに参加するため、バリデーター1つあたり32 ETHを担保としてイーサリアム2.0のデポジットコントラクトに送金します。その後、バリデーターのウォレットを作成します。

※以下の手順ではステーキング用のサーバーで鍵を作成していますが、可能であれば別のエアギャップしたパソコンで鍵を作成し、USB経由でステーキング用のサーバーに鍵をコピーし、鍵を作成したパソコンはインターネットに繋ぐことなくOSの初期化をすることを推奨します。

  1. 必要なパッケージをインストールする。
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip git -y
  1. デポジット用のリポジトリをクローンしてインストールする。
cd ~
git clone https://github.com/ethereum/eth2.0-deposit-cli.git
cd eth2.0-deposit-cli
sudo ./deposit.sh install
  1. サーバーの電源を落とし、インターネットの接続を完全に切り、再起動する。
sudo reboot
  1. 運用するバリーデーターの数を指定し(例:--num_validators 2)、デポジット用のソフトを実行する。
cd ~/eth2.0-deposit-cli
./deposit.sh new-mnemonic --num_validators バリデーター数 --chain mainnet --mnemonic_language english
  1. 案内に従ってkeystoreにパスワードを設定する。
    24単語のバックアップフレーズは紙にメモし、安全な場所に保管してください!
    くれぐれもインターネットに接続されている環境に保存しないでください!!
    バックアップフレーズを紛失したり、他人に盗まれたらETHを失ったと思ってください!!!
    (バックアップフレーズはkeystoreファイルを復元する際やETHを引き出す際に使用します。)

    サイの絵が表示されたら完了で、~/eth2.0-deposit-cli/validator_keysに2種類のファイルが作成されます。
    deposit_data ⇒ 担保のETHをデポジットする際に使用するファイルで、複数のバリデーターを運用する場合であっても1つだけ作成されます。
    keystore ⇒ バリデーターのウォレットを作成するときに使用するファイルで、複数のバリデーターを運用する場合はバリデーターの数だけ作成されます。

    正式なファイル名にはdeposit_data-1615115954.jsonのように作成時の時刻が含まれているため、以下のコマンドで確認してください。
ls ~/eth2.0-deposit-cli/validator_keys
  1. USBかSFTPを使用してdeposit_dataをWindowsに送る。
    以下はSFTPを使った場合のWindowsで実行するコマンドです。
sudo sftp -i SSH用の秘密鍵のディレクトリ -P ポート番号 サーバーユーザ名@サーバーIP
# 例
sudo sftp -i /home/myuser/key -P 1234 ethereum@192.168.0.33

get ~/eth2.0-deposit-cli/validator_keys/deposit_data-1615115954.json deposit_data.json
  1. Windowsでイーサリアム2.0の公式ローンチパッドを開き、案内に従いdeposit_dataをアップロードして32 ETHをデポジットする。デポジットが処理されるまで10時間ほどかかるため、それまでに手順6の「バリデーターを設定する」を完了させてバリデーターをオンラインにしておいてください。
  1. バリデーターのウォレットを保存するディレクトリを作成し、ログイン中のユーザーethereumに権限を与える。
sudo mkdir -p /var/lib/lighthouse
sudo chown -R ethereum:ethereum /var/lib/lighthouse
  1. バリデーターのウォレットを作成する。
cd ~/lighthouse
lighthouse account validator import --network mainnet --directory $HOME/eth2.0
-deposit-cli/validator_keys --datadir /var/lib/lighthouse
  1. バリデーターのウォレットが作成されていることを確認する。
lighthouse account_manager validator list --network mainnet --datadir /var/lib/li
ghthouse
  1. ウォレットのディレクトリの権限を外す。
sudo chown root:root /var/lib/lighthouse

6. バリデーターを設定する

取引の記録係であるバリデーターを設定し、常に起動されている状態にします。

  1. バリデーター実行用のユーザーを作成する。
sudo useradd --no-create-home --shell /bin/false lighthousevalidator
  1. ユーザーlighthousevalidatorにウォレットのディレクトリ権限を与える。
sudo chown -R lighthousevalidator:lighthousevalidator /var/lib/lighthouse/validator
s
  1. OS起動時にバリデーターが実行されるための設定ファイルを作成する。
sudo nano /etc/systemd/system/lighthousevalidator.service
  1. 以下を入力し、保存する。
[Unit]
Description=Lighthouse Validator
Wants=network-online.target
After=network-online.target
BindsTo=lighthousebeacon.service

[Service]
Type=simple
User=lighthousevalidator
Group=lighthousevalidator
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/lighthouse vc --network mainnet --datadir /var/lib/lighth
ouse

[Install]
WantedBy=multi-user.target
  1. systemdをリロードし、バリデーターがちゃんと動くか確認する。(active (running)と緑で表示されれば OK、Q で閉じる)
sudo systemctl daemon-reload
sudo systemctl start lighthousevalidator
sudo systemctl status lighthousevalidator
  1. OS起動時にバリデーターが実行されるようにする。
sudo systemctl enable lighthousevalidator
  1. バリデーターのログを確認する。(Ctrl + Cで閉じる)
sudo journalctl -fu lighthousevalidator

※ビーコンノードの同期が完了しないとバリデーターは仕事をしてくれません。

7. バリデーターの状況確認用のアプリをスマホにインストールする

受け取った累計報酬などをアプリで確認できます。バリデーターがオフラインになったら通知してくれます。

  1. iPhoneの場合はApp Storeから、Androidの場合はPlay StoreからBeaconchain Dashboardというアプリをダウンロードします。
  1. アプリを開き、Validatorsタブから自身のバリデーターを検索し、お気に入りに登録する。
  1. Preferencesタブで受け取りたい通知の種類を選択する。
  1. 累計報酬などはDashboardタブで確認できます。

動作確認するときのコマンド

geth、lighthousebeacon、lighthousevalidatorのログを確認する。

sudo journalctl -fu geth
sudo journalctl -fu lighthousebeacon
sudo journalctl -fu lighthousevalidator

# 指定した時刻以降のログを出力(現在時刻はdateで確認)
sudo journalctl -u geth --since="2021-02-23 12:30:00"

# ログの容量を確認
sudo journalctl --disk-usage
# 3日以上経ったログを削除
sudo journalctl --vacuum-time=3d

時刻の同期(NTP)を確認する。

ntpq -pn -c rv

CPU、メモリの使用量を確認する。

htop

NVMeの温度を確認する。

sudo nvme smart-log /dev/nvme0n1

SSD容量を確認する。

df -h

データ通信料を確認する。

# RXが受信量、TXが送信量(OS起動してからの累計)
ifconfig
# OS起動日数
uptime

クライアントのアップデート方法

geth(イーサリアム1.0のノード)のアップデート方法

  1. アップデートの必要があるか確認する。ppaethereum-unstableが付いてない方)と同じバージョンならアップデートの必要なし。
geth version
  1. 実行中のgeth、ビーコンノード、バリデーターを止める。
sudo systemctl stop lighthousevalidator
sudo systemctl stop lighthousebeacon
sudo systemctl stop geth

※バリデーターが落ちた事を感知して再起動するスクリプトをこの記事で設定している場合は、スクリプトが実行されないようにします。(行の初めに#を追記してコメントアウトすると実行されなくなります)

sudo crontab -e
  1. geth、ビーコンノード、バリデーターが止まっているか確認する。
sudo systemctl status lighthousevalidator
sudo systemctl status lighthousebeacon
sudo systemctl status geth
  1. gethをアップデートし、アップグレード後のバージョンを確認する。
sudo apt update && sudo apt upgrade -y
geth version
  1. geth、ビーコンノード、バリデーターを起動する。
    (代わりにsudo rebootで再起動しちゃってもいい)
sudo systemctl start geth
sudo systemctl start lighthousebeacon
sudo systemctl start lighthousevalidator
  1. geth、ビーコンノード、バリデーターがちゃんと動いていることを確認する。
sudo journalctl -fu geth
sudo journalctl -fu lighthousebeacon
sudo journalctl -fu lighthousevalidator

※バリデーターが落ちた事を感知して再起動するスクリプトをこの記事で設定している場合は、スクリプトが再度実行されるようにする。

sudo crontab -e

Lighthouse(イーサリアム2.0のビーコンノードとバリデーター)のアップデート方法

  1. Lighthouseの構築に使用するrustをアップデートする。
rustup update
  1. アップデートの必要があるか確認する。Your branch is up to date with 'origin/stable'と表示されればアップデートの必要なし。
cd ~/lighthouse
git fetch --all && git checkout stable && git pull
  1. Lighthouseをアップデートし、バージョンを確認する。
lighthouse --version
make
lighthouse --version
  1. ビーコンノードとバリデーターを停止する。
sudo systemctl stop lighthousevalidator
sudo systemctl stop lighthousebeacon

※バリデーターが落ちた事を感知して再起動するスクリプトをこの記事で設定している場合は、スクリプトが実行されないようにします。(行の初めに#を追記してコメントアウトすると実行されなくなります)

sudo crontab -e
  1. 古いバージョンのLighthouseを新しく構築したLighthouseに置き換える。
sudo cp /$HOME/.cargo/bin/lighthouse /usr/local/bin
  1. ビーコンノードとバリデーターを起動する。
sudo systemctl start lighthousebeacon
sudo systemctl start lighthousevalidator
  1. ビーコンノードとバリデーターがちゃんと動いていることを確認する。
sudo journalctl -fu lighthousebeacon
sudo journalctl -fu lighthousevalidator

※バリデーターが落ちた事を感知して再起動するスクリプトをこの記事で設定している場合は、スクリプトが再度実行されるようにする。

sudo crontab -e

バリデーターの数を増やす方法

バリデーターの数を増やすときは、セキュリティを考慮してサーバーとは別のエアギャップしたパソコンを使用します。エアギャップしたパソコンでバリデーターの鍵を作成し、作成した鍵をUSB経由でステーキング用のサーバーにコピーし、ステーキング用のサーバーでウォレットを再度作成します。

  1. Ubuntu Serverを新しくインストールしたパソコンに、バリデーターの鍵を作成するために必要なパッケージをインストールしていきます。
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip git -y
cd ~
git clone https://github.com/ethereum/eth2.0-deposit-cli.git
cd ~/eth2.0-deposit-cli
sudo ./deposit.sh install
  1. インターネット接続を完全に切断し(有線LANケーブルを抜く)、パソコンを再起動します。
sudo reboot
  1. 初めてバリデーターを設定したときにメモった24単語のバックアップフレーズを使用し、追加するバリデーター1つあたりdeposit_datakeystoreを1つずつ作成します。複数のバリデーター分を一度に作ることができますが、ローンチパッドでETHをデポジットする時はどのアドレスにデポジットしたらいいのか迷いやすいため1つずつ作ることをお勧めします。
cd ~/eth2.0-deposit-cli
./deposit.sh existing-mnemonic
  1. 作成したdeposit_datakeystoreをUSB経由でステーキング用のサーバーにコピーします。USBの操作方法はこの記事を参考にしてください。
  1. ETHのデポジットに使用するパソコン(自分はWindows)を使い、ステーキング用のサーバーからdeposit_dataをSFTPでダウンロードします。
sudo sftp -i SSH用の秘密鍵のディレクトリ -P ポート番号 サーバーユーザ名@サーバーIP
# 例
sudo sftp -i /home/myuser/key -P 1234 ethereum@192.168.0.33

get /home/deposit_data….json deposit_data.json
  1. ETHのデポジットに使用するパソコン(自分はWindows)のブラウザで公式ローンチパッドを開き、deposit_dataをアップロードしてETHをデポジットします。
  1. ステーキング用のサーバーで、運用する全てのバリデーターのkeystore~/eth2.0-deposit-cli/validator_keysディレクトリに入れます。
  1. 新しいバリデーターのウォレットを作る前に、実行中のビーコンノードとバリデーターを止めます。
sudo systemctl stop lighthousevalidator
sudo systemctl status lighthousevalidator
sudo systemctl stop lighthousebeacon
sudo systemctl status lighthousebeacon

※バリデーターが落ちた事を感知して再起動するスクリプトをこの記事で設定している場合は、スクリプトが実行されないようにします。(行の初めに#を追記してコメントアウトすると実行されなくなります)

sudo crontab -e
  1. 既存のウォレットを削除します。
sudo rm -r /var/lib/lighthouse/validators
  1. 新しいバリデーターのウォレットを作成します。パスワードはkeystoreごとに入力します。
cd ~/lighthouse
sudo lighthouse account validator import --network mainnet --directory $HOME/eth2.0-deposit-cli/validator_keys --datadir /var/lib/lighthouse
  1. ウォレットのディレクトリ権限をユーザーlighthousevalidatorに付与する。
sudo chown -R lighthousevalidator:lighthousevalidator /var/lib/lighthouse/validators
  1. ビーコンノードとバリデーターを起動する。
sudo systemctl start lighthousebeacon
sudo systemctl status lighthousebeacon
sudo systemctl start lighthousevalidator
sudo systemctl status lighthousevalidator

※バリデーターが落ちた事を感知して再起動するスクリプトをこの記事で設定している場合は、スクリプトが再度実行されるようにする。

sudo crontab -e
  1. バリデーターが動いていることを確認する。
sudo lighthouse account_manager validator list --network mainnet --datadir /var/lib/lighthouse
sudo journalctl -fu lighthousevalidator
  1. 近い将来にまたバリデーターを追加しないのであれば、バリデーターの鍵を作成したパソコンはインターネットに再度繋げることなくUbuntu Serverを初期化してください。

バリデーターを別のサーバーに移動する方法

バリデーターを別のサーバーに移動する流れは初めてステーキングを開始する流れとほぼ一緒ですが、バリデーターのkeystoreはUSB経由で古いサーバーから新しいサーバーに移動します。同じバリデーターを2つのサーバーで同時に起動するとslashing(ETHの一部を没収されバリデータの資格を失う)されるので絶対にしないでください!!

  1. 手順4「イーサリアム2.0のビーコンノードを同期する」まで新しいサーバーで実施します。
  2. USB経由keystoreを古いサーバーから新しいサーバーの~/eth2.0-deposit-cli/validator_keysディレクトリにコピーします。
  3. 同じバリデーターを2つのサーバーで同時に起動しないように、古いサーバーは初期化してデータを全て削除ください。バリデーターが数十分間オフラインになると思いますが、slashingされるよりはましです。次の手順は急ぎ過ぎず、安全のため少なくとも12分以上(2 epoch以上)はバリデーターをオフラインにしてください。
  4. 手順5「ETHをデポジットしてウォレットを作成する」の8番「バリデーターのウォレットを保存するディレクトリを作成し…」から再開し、最後まで実施してください。

SSDの容量を回復する方法(Go Ethereumのプルーニング)

イーサリアム1.0のノード容量は時間とともに肥大化していきます。1か月に30GBほど増えていきますが殆どが不要なデータなので、定期的にそぎ落とし(プルーニング)が必要です。以前はgethをゼロから同期しなければいけませんでしたが、v1.10.0でリリースされたプルーニング機能を使えば約3時間で終わるようになりました。プルーニング中はgethが使えなくなるので、最新ブロック情報をInfuraから取得するようにします。

  1. Infuraの公式サイトでアカウントを作成します。無料アカウントで問題ないです。
  1. Infuraにログインし、「ETHEREUM」の「CREATE A PROJECT」をクリックし、生成されたENDPOINTS (Mainnet)のhttpsの方をメモします。
  1. ビーコンノードの接続先にInfuraを追加するために設定ファイルを開きます。
sudo nano /etc/systemd/system/lighthousebeacon.service
  1. ExecStart=--eth1-endpointsパラメータにメモしたInfuraのhttpsを追記します。(コンマの後にスペースは入れません)
ExecStart=/usr/local/bin/lighthouse bn --network mainnet --staking --datadir /var
/lib/lighthouse --eth1-endpoints http://127.0.0.1:8545,https://mainnet.infura.io/v3/9.....
  1. ビーコンノードを再起動する。
sudo systemctl stop lighthousebeacon
sudo systemctl daemon-reload
sudo systemctl start lighthousebeacon
  1. gethを止めてもビーコンノードが同期していることを確認する。(INFO Syncedと出力されればOK)
sudo systemctl stop geth
sudo journalctl -fu lighthousebeacon
  1. gethのプルーニングを開始する。(パソコンの処理性能によりますが3時間くらいかかります)
sudo geth snapshot prune-state --datadir /var/lib/goethereum
  1. ディレクトリ権限をユーザーgoethに与え、gethを起動する。
sudo chown -R goeth:goeth /var/lib/goethereum
sudo systemctl start geth
  1. gethが最新ブロックまで問題なく同期するか確認する。
    Imported new chain segmentage=が出なくなるまで)
sudo journalctl -fu geth
  1. (任意)ビーコンノードの接続先からInfuraを削除する。gethに問題が発生した時のためにInfuraを残しておいてもいいかもしれません。削除した場合、daemonとビーコンノードを再起動してください。
sudo nano /etc/systemd/system/lighthousebeacon.service