コンテンツへスキップ

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

目次

イーサリアムのPoS(プルーフ・オブ・ステーク)

イーサリアムが一般公開された2015年はビットコインと同様に PoW(プルーフ・オブ・ワーク)という合意形成アルゴリズムを採用していました。PoWでは、マイニングを実施するマイナーと呼ばれる人たちによってネットワークの安全性や取引の信憑性が保たれます。

2020年12月に PoS(プルーフ・オブ・ステーク)のチェーンが稼働され、2つのチェーンが共存する期間を経て、2022年9月に全ての機能をPoWからPoSに移行してPoWが廃止されました。PoSでは、ステーキングを実施するバリデーター(Validator)達によってネットワークが維持されています。PoWからPoSへの完全移行は「マージ(the merge)」と呼ばれ、仮想通貨界隈が非常に盛り上がりました。難易度的には飛行機のエンジンを空中で交換するようなものだったとイメージしてください。

2014年のイーサリアムのホワイトペーパーには将来的にPoWからPoSに移行することが書かれていましたが(”Note that in the future, it is likely that Ethereum will switch to a proof-of-stake model for security)実現するまでに8年かかりました。

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

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

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

  • 約4~8.7%(2022/9/28現在)の年利報酬を得られる:担保としてデポジットしたETHに対して年利約4~8.7%の報酬を得ることができます。バリデーターがオフラインになると罰金となりますが、オンライン期間とオフライン期間が半々くらいであれば年利報酬がプラマイゼロになります。
    貰える報酬には、常に貰える報酬とブロックを生成すると貰える報酬があります。常に貰える報酬は約4%です。正確な年利は公式のローンチパッドを参照してください。
    ブロックを生成すると貰える報酬は約0%~4.7%です。ただし、ブロックを生成するバリデーターはランダムで選ばれているため報酬に個人差があります。平均でバリデーター1つあたり2か月に1回ほどブロックを生成できますが(総バリデーター数436,200 ÷ 1日のブロック数7,200)、運が悪いと1年以上ブロック生成できない場合もあります。
    正確な報酬内訳は(attestation reward * sync committee倍率) + (proposal reward + whistleblowing + fee + MEV)となります。attestation rewardは常に貰え、後半の4つはブロック生成した時に貰えます。
    バイナンスLidoにステーキングを委託する場合は運に左右されず一定の報酬を貰えますが、委託料を取られるので自分でバリデーターを運用するより報酬が下がります。
  • イーサリアムのセキュリティを上げることに貢献する:個人でバリデーターを運用する人が増えるとイーサリアムのセキュリティは上がります。単なる投資手段としてステーキングに参加する人には関係のない話です。
  • サーバー知識が増える:自宅サーバーでステーキングするため、Linuxなどのサーバー知識が増えます。仕事や副業に活かせるかもしれません。
  • 楽しい:個人的な意見ですが結構楽しいです。ネットワーク保全に関与している誇らしさを感じるだけでなく、証券会社や銀行に頼らず自分で資産運用ができている斬新さや、最新の技術に触れているワクワクを感じています。

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

  • 32 ETHの単位でしかステーキングできない:自分でバリデーターを運用する場合は、バリデーター1つあたり32 ETHを担保としてデポジットします。ステーキングを委託する場合は、ETHの保有量が32以下でもステーキングが可能です。
  • 担保のETHは当分引き出せない:自分でバリデーターを運用する場合は、担保を引き出すためのコントラクトが実装されるまではデポジットしたETHを動かすことができません。ステーキングの開始後にやっぱりやめようと思った場合、ペナルティーのない任意退出(Volunatary exit、バリデーターの権限を返上してオフラインになってもいい状態にすること)はできますが、コントラクト実装まではETHが戻ってこないことに変わりありません。担保を引き出すためのコントラクトは2023年前半のアップデートで実装される予定です。ステーキングを委託する場合は、担保のETHと引き換えに貰うBETHやstETHを好きなタイミングでETHに戻すことができます。
  • 資産を失う可能性がある:自分でバリデーターを運用する場合は、ETHを引き出すときに必要な24単語のバックアップフレーズを紛失すると絶対に引き出せなくなります。また、複数のサーバーで同じバリデーターを実行するなど、不正とみなされる行為をするとSlashing(担保のETHの一部を没収)されバリデーターとしての資格を失います。2022/9/28現在、過去1年9か月でSlashingを受けたバリデーターは216/436,200(約0.05%)です。この記事の通りに運用していればSlashingされることはまずありません。ステーキングを委託する場合は、アカウント凍結や会社の倒産によって資産を引き出せなくなるリスクがあります。
  • メンテナンスをする必要がある:自宅サーバーでステーキングする場合は初期設定に加え、クライアントのアップデート等のメンテナンスをする必要があります。月に平均15分ほどの労力です。ステーキングを委託する場合は、メンテナンスの必要はありません。
  • 電気代がかかる:自宅サーバーでステーキングをする場合はパソコンを24時間365日つけっぱなしにするため、月に数百円程度の電気代がかかります。ステーキング報酬に比べると数百円は誤差の範囲です。

ステーキングを委託した場合は、自分でバリデーターを運用するのに比べて報酬が少し減りますが、アカウントの凍結や会社の倒産リスクくらいしかデメリットがありません。自分でバリデーターを運用する自信のない人は、バイナンスLidoに委託することをお勧めします。

自分でバリデーターを運用する場合は、年利報酬以外のメリットが得られるようになりますがシステム操作のハードルがあります。システム操作が苦手な方は、手順5の「イーサリアムのコンセンサス(合意形成)クライアントの同期」まではETHを担保としてデポジットしなくても実践できるので試してみてはいかがでしょうか。また、ETHのデポジットも試してみたい人は、テスト環境であればテスト環境用のETH(無料)を使用して実践できます。本番環境とテスト環境の作業相違点はこちらを参照してください。

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

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

  • 最低32 ETH:バリデーター1つあたり32 ETHを担保としてデポジットします。1つのサーバーで複数のバリデーターを運用することが可能です。
  • サーバーとして使用するパソコン:クラウドサーバーという手段もありますが、割高なサーバー代を毎月払うよりも、パソコンを買ってしまって将来的にパーツを流用したり売ったりした方がコスパが良いと思います。バリデーター数とCPU負荷が比例するのは64個まで且つ64個運用してもそれほどCPU負荷が高くないため、サーバーとなるパソコンは1つあれば十分です。推奨性能は以下の通り。
    ■ 目安としてPassMarkが5000点以上のCPU(消費電力を考慮して末尾がUのCPUをお勧めします。CPUはRyzenではなくIntelの方が初期設定のトラブルが少ないです。)
    ■2TBのSSD(HDDだと遅すぎます。今は1TBでも運用できますが、実装予定のEIP-4844で追加で数100GB必要になるため、数年後には2TBが必須になりそうです。)
    ■ 16GB以上のメモリ
  • サーバーとして使用しないパソコン:インターネットに繋がっていれば性能はなんでもいいです。自分はWindowsを使いましたが、Macでも大丈夫です。ブラウザでETHをデポジットをしたり、サーバーを遠隔操作するのに使います。
  • 秘密鍵生成用のパソコン:必須ではないですが推奨します。バリデーターの秘密鍵はエアギャップされた(インターネットに繋がっていない)環境で作成するのが一番安全です。自分は使わなくなった古いノートパソコンにUbuntu Desktopを入れてます。
  • ご自身のインターネット環境:ルーターの設定をいじったり、大量のデータを安定して通信したいので公共インターネットでは厳しいです。
  • USBメモリ:SDカードでも代用可能です。Ubuntu Serverのインストールメディアを扱ったりするので4~8GB以上だとよいです。
  • 有線LANケーブル:サーバーは無線LANで運用してもいいですが、初期設定は有線LANを使った方が楽です。

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

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

  • バリデーター:トランザクション(取引)記録係です。コンセンサス(合意形成)クライアントの機能の1つです。バリデーターがオンラインであることによって報酬をもらえますが、前提としてビーコンチェーンと実行クライアントが同期されている必要があります。
  • ビーコンチェーン:バリデーターに仕事を割り振るために使われる出勤簿のようなものです。コンセンサス(合意形成)クライアントの機能の1つです。常に最新の情報が同期されるようにします。前提として、実行クライアントが同期されている必要があります。
  • 実行クライアント:イーサリアムの全トランザクション(取引)データです。最新のトランザクションが常に同期されるようにします。

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

  1. Ubuntu Serverのインストール
    自宅サーバーとなるパソコンにUbuntu ServerというOSをインストールします。
  2. Ubuntu Serverの細かい初期設定
    Ubuntu Serverのインターネットの設定など、細かい初期設定をします。
  3. JSON Web Tokenの設定
    実行クライアントとコンセンサスクライアントが安全に通信するためのファイルを作成します。
  4. イーサリアムの実行クライアントの同期
    イーサリアムの全トランザクションをダウンロードし、常に最新のトランザクションが同期されるようにします。700GB以上あるので同期されるまでに1日程度かかります。
  5. イーサリアムのコンセンサスクライアントの同期
    バリデーターに仕事を割り振るために使われるビーコンチェーン(出勤簿のようなもの)をダウンロードし、常に同期されるようにします。Checkpoint syncを使えば同期は数分で終わります。
  6. ETHのデポジットとウォレット作成
    バリデーター1つあたり32 ETHを担保としてデポジットします。デポジット後にバリデーターのウォレットを作成します。
  7. バリデーターの設定
    取引の記録係であるバリデーターを設定し、常に起動されている状態にします。
  8. バリデーター確認用アプリのインストール
    受け取った累計報酬などをスマホアプリで確認できます。バリデーターがオフラインになった時や、ブロック生成した時に通知してくれます。
  9. (任意) MEV relayの設定
    ブロック生成時の報酬を上げたい場合に設定します。

本番環境とテスト環境の作業相違点

ぶっつけ本番でサーバーを設定するのはオススメしません。まずはテスト環境で一通りの流れを実施してみて不明点を無くしてください。そして2週間ほどサーバーを起動させておき、ハードウェア構成やインターネット環境に異常がないことを確認してください。本番環境とテスト環境の作業相違点は以下の通りです。

  • 手順4「イーサリアムの実行クライアントの同期」
    • ネットワークをmainnetではなくgoerliに指定する。Besuの場合はserviceファイルのExecStartオプションの--network=mainnet--network=goerliにする。Gethの場合はExecStartオプションに--goerliを足す。
  • 手順5「イーサリアムのコンセンサスクライアントの同期」
    • ネットワークをmainnetではなくgoerliに指定する。Lighthouseの場合はserviceファイルのExecStartオプションの--network mainnet--network goerliにする。
  • 手順6「ETHのデポジットとウォレット作成」
    • 鍵生成するときのコマンドはmainnetではなくgoerliを指定する。例:./deposit.sh new-mnemonic --chain goerli
    • デポジットするサイトのURLはgoerli.launchpad.ethereum.orgです。また、絶対に本番のETHを使用せずに、テスト環境のETH(無料)を使用してください。
    • ウォレット作成時のコマンドはmainnetではなくgoerliを指定する。例:lighthouse account validator import --network mainnet
  • 手順7「バリデーターの設定」
    • ネットワークをmainnetではなくgoerliに指定する。Lighthouseの場合はserviceファイルのExecStartオプションの--network mainnet--network goerliにする。
  • 手順8「バリデーター確認用アプリのインストール」
    • 設定でNetworkを切り替えれます。Goerliに繋がっているビーコンチェーンの名称はPraterです。1つのアプリでMainnetとテスト環境の両方の通知を受け取ることができます。
  • 手順9「(任意) MEV relayの設定」
    • 正直、テスト環境ではMEVを試す必要はないと思います。試す場合はserviceファイルのExecStartオプションの-mainnet-goerliにする。
    • Relayのアドレスもテスト環境用のものにしてください。各Relayのドキュメントに記載されてます。例:Flashhbots

ステーキングの開始手順

1. Ubuntu Serverのインストール

Ubuntu Serverのインストール方法はこの記事を参考にしてください。最新リリースの22.04 LTSでよいですが、サポート期間が2025年までとなっている20.04 LTSでも大丈夫です。

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

セキュリティの設定をして遠隔操作できるようにします。
下記を上から順番に設定してください。

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

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

sudo reboot

3. JSON Web Token の設定

実行クライアントとコンセンサスクライアントが安全に通信するためのJSON Web Token(JWT)のファイルを作成します。

  1. JWT用のディレクトリを作る。
sudo mkdir -p /var/lib/jwtsecret
  1. opensslという暗号通信プロトコルで32バイトの16進数ファイルを作る。
openssl rand -hex 32 | sudo tee /var/lib/jwtsecret/jwt.hex > /dev/null
  1. 作成したファイルを開いて中身が入力されていることを確認する。(Ctrl + X で閉じる)
sudo nano /var/lib/jwtsecret/jwt.hex

4. イーサリアムの実行クライアントの同期

イーサリアムの全トランザクションをダウンロードし、常に最新のトランザクションが同期されるようにします。700GB以上あるのでダウンロードに1日以上かかります。クライアント分散の観点から、この手順では「besu」というクライアントを採用しています。最もメジャーな「Go Ethereum (geth)」を使用したい場合はこの記事を参照してください。

  1. Besuの初回設定に必要なパッケージをインストールする。
sudo apt install -y curl default-jre libjemalloc-dev
  1. BesuのGitHubを開き、最新リリースの「Download Links」にある末尾がtar.gzのURLをコピーする。
  1. 最新のBesuをダウンロードする。上記で取得した最新のURLを使用してください。
cd ~

curl -LO https://hyperledger.jfrog.io/artifactory/besu-binaries/besu/XX.X.X/besu-XX.X.X.tar.gz
  1. 解凍して/usr/local/binにコピーし、不要になったファイルを削除する。
tar xvf besu-XX.X.X.tar.gz

sudo cp -a besu-XX.X.X /usr/local/bin/besu

/usr/local/bin/besu/bin/besu --version

rm -r besu-XX.X.X

rm besu-XX.X.X.tar.gz
  1. besu実行用のユーザーbesuを作成する。
sudo useradd --no-create-home --shell /bin/false besu
  1. ノードデータを保存するディレクトリを作成し、ユーザーbesuにアクセス許可を与える。
sudo mkdir -p /var/lib/besu

sudo chown -R besu:besu /var/lib/besu
  1. サーバー起動時にbesuが自動的に開始されるためのserviceファイルを作成する。
sudo nano /etc/systemd/system/besu.service
  1. 以下を入力し、保存する。(Ctrl + O で保存、Ctrl + X で閉じる)
[Unit]
Description=Besu
Wants=network-online.target
After=network-online.target

[Service]
User=besu
Group=besu
Type=simple
Restart=always
RestartSec=5
Environment="JAVA_OPTS=-Xmx5g"
ExecStart=/usr/local/bin/besu/bin/besu \
  --network=mainnet \
  --sync-mode=X_SNAP \
  --data-path=/var/lib/besu \
  --data-storage-format=BONSAI \
  --engine-jwt-secret=/var/lib/jwtsecret/jwt.hex

[Install]
WantedBy=multi-user.target
  1. daemonをリロードし、besuがちゃんと動くか確認する。今後上記のserviceファイルに変更を加えることがあれば、毎回daemonをリロードして変更を適応するようにしてください。
    active (running)と緑で表示されれば OK、Q で閉じる)
sudo systemctl daemon-reload

sudo systemctl start besu

sudo systemctl status besu
  1. サーバー起動時にbesuが自動的に開始されるようにする。
sudo systemctl enable besu
  1. 同期状態を確認する。(Ctrl + Cで閉じる)
sudo journalctl -fu besu

※自分は同期中にM.2のSSDがフリーズすることがありましたがAPST(省電力設定)を無効化したら発生しなくなりました。フリーズすることがあればお試しください。

5. イーサリアムのコンセンサス(合意形成)クライアントの同期

バリデーターに仕事を割り振るために使われるビーコンチェーンをダウンロードし、常に同期されるようにします。この手順ではビーコンチェーンとバリデーターに「Lighthouse」というクライアントを採用しています。Checkpoint syncを使用すれば同期は数分で終わりますが、使用しなければ数日かかるかもしれません。

  1. 最新のLighthouseをダウンロードする。最新バージョンのURLは公式GitHubから取得してください。
cd ~

curl -LO https://github.com/sigp/lighthouse/releases/download/vX.X.X/lighthouse-vX.X.X-x86_64-unknown-linux-gnu.tar.gz
  1. 解凍して/usr/local/binにコピーし、不要になったファイルを削除する。
tar xvf lighthouse-vX.X.X-x86_64-unknown-linux-gnu.tar.gz

sudo cp lighthouse /usr/local/bin

/usr/local/bin/lighthouse --version

rm lighthouse

rm lighthouse-vX.X.X-x86_64-unknown-linux-gnu.tar.gz
  1. ビーコンチェーン実行用のユーザーlighthousebeaconを作成する。
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. サーバー起動時にビーコンチェーンが自動的に開始されるためのserviceファイルを作成する。
sudo nano /etc/systemd/system/lighthousebeacon.service
  1. 以下を入力して、保存する。(Ctrl + O で保存、Ctrl + X で閉じる)
[Unit]
Description=Lighthouse Beacon Node
Wants=network-online.target
After=network-online.target

[Service]
User=lighthousebeacon
Group=lighthousebeacon
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/lighthouse bn \
  --network mainnet \
  --datadir /var/lib/lighthouse \
  --http \
  --execution-endpoint http://localhost:8551 \
  --execution-jwt /var/lib/jwtsecret/jwt.hex

[Install]
WantedBy=multi-user.target

※別のサーバーで動かしている実行クライアントを参照するときは、そのサーバーのIPアドレスとポート番号を指定します(例:http://192.168.0.88:8551)。その場合はJWTファイルの移行も忘れずに。

※Checkpoint syncを使用すれば数日以上かかる同期を数分で終わらせることができます。Checkpoint syncをする場合はExecStartに--checkpoint-sync-urlオプションを追加してください。一般公開されているエンドポイントを利用しても問題ありません(例:--checkpoint-sync-url https://sync-mainnet.beaconcha.in)。自分が運用している別のサーバーにアクセスする場合はサーバーを移す工程を参考にしてしてください。

  1. daemonをリロードし、ビーコンチェーンがちゃんと動くか確認する。今後上記のserviceファイルに変更を加えることがあれば、毎回daemonをリロードして変更を適応するようにしてください。
    active (running)と緑で表示されれば OK、Q で閉じる)
sudo systemctl daemon-reload

sudo systemctl start lighthousebeacon

sudo systemctl status lighthousebeacon
  1. サーバー起動時にビーコンチェーンが自動的に開始されるようにする。
sudo systemctl enable lighthousebeacon
  1. 同期状態を確認する。(Ctrl + Cで閉じる)
sudo journalctl -fu lighthousebeacon

※Checkpoint syncをする場合はログでINFO Starting checkpoint syncが表示されると数秒~数分間ログに変化がない状態になります。そのうちLoaded checkpoint block and stateが表示され、定期的にInfo Syncedが表示されるようになれば同期が完了しています。同期が完了したらExecStart=に追加したCheckpoint sync用のパラメータを抜きましょう(残しても支障はないですが次回以降起動時に「不要ですよ」というログが表示されます)。

※実行クライアントとビーコンチェーンが同期されていないとバリデーターが仕事をしてくれないため、両方同期されるのを待ちましょう。

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

バリデーター1つあたり32 ETHを担保としてデポジットコントラクトに送金します。その後、バリデーターのウォレットを作成します。

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

  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 systemctl stop lighthousebeacon

sudo systemctl stop besu

sudo shutdown -h now
  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で実行するコマンドです。
sftp -i SSH用の秘密鍵のディレクトリ -P ポート番号 サーバーユーザ名@サーバーIP
# 例
sftp -i /home/myuser/key -P 1234 ethereum@192.168.0.99

get ~/eth2.0-deposit-cli/validator_keys/deposit_data-XXXXXXXXXX.json deposit_data.json
  1. Windowsでイーサリアムの公式ローンチパッドを開き、「BECOME A VALIDATOR」をクリックし、案内に従いdeposit_dataをアップロードして32 ETHをデポジットする。デポジット後はビーコンチェーンにデポジットが認可されるまで10時間以上かかるため、それまでに手順7の「バリデーターを設定する」を完了させてバリデーターをオンラインにしておいてください。
  1. ビーコンチェーンを停止し(ディレクトリ権限を一時的に剥奪するため)、ログイン中のユーザーethereumにバリデーターのウォレットを保存するディレクトリの権限を与える。
sudo systemctl stop lighthousebeacon

sudo chown -R ethereum:ethereum /var/lib/lighthouse
  1. バリデーターのウォレットを作成する。
cd /usr/local/bin

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/lighthouse
  1. ウォレットのディレクトリの権限をユーザーethereumから剥奪し、ビーコンチェーンを再開する。
sudo chown root:root /var/lib/lighthouse

sudo chown -R lighthousebeacon:lighthousebeacon /var/lib/lighthouse/beacon

sudo systemctl start lighthousebeacon

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

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

  1. バリデーター実行用のユーザーを作成する。
sudo useradd --no-create-home --shell /bin/false lighthousevalidator
  1. ユーザーlighthousevalidatorにディレクトリ権限を与える。
sudo chown -R lighthousevalidator:lighthousevalidator /var/lib/lighthouse/validators
  1. サーバー起動時にバリデーターが自動的に実行されるためのserviceファイルを作成する。
sudo nano /etc/systemd/system/lighthousevalidator.service
  1. 以下を入力し、保存する。(Ctrl + O で保存、Ctrl + X で閉じる)
[Unit]
Description=Lighthouse Validator
Wants=network-online.target
After=network-online.target

[Service]
User=lighthousevalidator
Group=lighthousevalidator
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/lighthouse vc \
  --network mainnet \
  --datadir /var/lib/lighthouse \
  --suggested-fee-recipient FeeRecipientAddress

[Install]
WantedBy=multi-user.target

--suggested-fee-recipientにはブロック生成時に貰える手数料の受取先となるアドレスを指定してください。(例:--suggested-fee-recipient 0xABC...

※バリデーターごとに異なる手数料の受信先を設定する場合は、--suggested-fee-recipientフラグを使わず、validator_definitions.ymlに追記してください。詳細は公式Documentを参照。

  1. systemdをリロードし、バリデーターがちゃんと動くか確認する。今後上記のserviceファイルに変更を加えることがあれば、毎回daemonをリロードして変更を適応するようにしてください。
    active (running)と緑で表示されれば OK、Q で閉じる)
sudo systemctl daemon-reload

sudo systemctl start lighthousevalidator

sudo systemctl status lighthousevalidator
  1. サーバー起動時にバリデーターが自動的に実行されるようにする。
sudo systemctl enable lighthousevalidator
  1. バリデーターのログを確認する。(Ctrl + Cで閉じる)
sudo journalctl -fu lighthousevalidator

※実行クライアントとビーコンチェーンの同期が完了しないとバリデーターは仕事をしてくれません。

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

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

  1. iPhoneの場合はApp Storeから、Androidの場合はPlay StoreからBeaconchain Dashboardというアプリをダウンロードします。
  1. アプリを開き、Validatorsタブから自身のバリデーター番号を検索し、お気に入りに登録する。
  1. Preferencesで受け取りたい通知の種類を選択する。
    実行クライアントとコンセンサスクライアントのアップデート通知は受け取るようにした方がいいです。マイナーなアップデートであれば急いで適応させる必要はないため、それぞれのDiscordに加入し、アップデート優先度のアナウンスを確認するようにしましょう。
  1. 累計報酬などはDashboardタブで確認できます。

9. (任意) MEV relayを設定する

ブロックに含めるトランザクションを選り好みしたり、他人のアビトラ取引をコピーして先に実行したり(フロントランニング)することで、ブロック生成時により多くの手数料を貰うことが可能となります。ただし、本来ブロックに含まれるトランザクションが含まれなくなるため、ブロックチェーンのポリシーである非中央集権から遠ざかる可能性が出てきます。

そのため、イーサリアムではブロックを実際に生成する「Proposer (プロポーザー)」の機能と、ブロックに含める取引を決める「Builder (ビルダー)」の機能を独立させる「Proposer/Builder Separation (プロポーザー/ビルダーセパレーション)」というアプローチがとられています。本記事の手順7で設定したバリデーターが「Proposer」に該当し、これから設定するMEV relayが「Builder」とコミュニケーションを取る設定になります。

代表的な「Builder」は以下の通りです。

各relayの報酬の成績はここから確認できます。
オススメは検閲なしで報酬もそこそこいいultra sound relayです。

  1. goとmakeがインストールされてなければインストールする。Goの最新バージョンのURLは公式サイトから取得してください。
cd ~

curl -OL https://go.dev/dl/goX.XX.X.linux-amd64.tar.gz

sudo tar -C /usr/local -xvf goX.XX.X.linux-amd64.tar.gz

rm ~/goX.XX.X.linux-amd64.tar.gz

export PATH=$PATH:/usr/local/go/bin

sudo apt install make
  1. MEV-boostをインストールし、/usr/local/binにコピーする。
go install github.com/flashbots/mev-boost@latest

sudo cp ~/go/bin/mev-boost /usr/local/bin

sudo rm ~/go/bin/mev-boost
  1. MEV-boost実行用のユーザーを作成する。
sudo useradd --no-create-home --shell /bin/false mev
  1. サーバー起動時にmev-boostが自動的に実行されるためのserviceファイルを作成する。
sudo nano /etc/systemd/system/mev-boost.service
  1. 以下を入力し、保存する。(Ctrl + O で保存、Ctrl + X で閉じる)
[Unit]
Description=MEV-boost
Wants=network-online.target
After=network-online.target

[Service]
User=mev
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/mev-boost \
  -mainnet \
  -relay-check \
  -relays https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net \
  -min-bid 0.05

[Install]
WantedBy=multi-user.target

※複数のrelayを設定する場合は、-relaysにスペースなしのコンマで繋げてください。(例:-relays https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net,https://0xa1559ace749633b997cb3fdacffb890aeebdb0f5a3b6aaa7eeeaf1a38af0a8fe88b9e4b1f61f236d2e64d95733327a62@relay.ultrasound.money

※複数のrelayを設定した場合は、より多くの報酬が得られるrelayがブロック生成時に選ばれます。

-min-bidを設定した場合、relayからの最高報酬が任意の閾値以下であればrelayを使用せずにローカルの実行クライアントがブロックを生成します。閾値を0.05ETH程度にすることでrelayのみを使用するより分散性を上げることができ、報酬もほとんど下がりません。

  1. systemdをリロードし、mev-boostがちゃんと動くか確認する。今後上記のserviceファイルに変更を加えることがあれば、毎回daemonをリロードして変更を適応するようにしてください。
    active (running)と緑で表示されれば OK、Q で閉じる)
sudo systemctl daemon-reload

sudo systemctl start mev-boost

sudo systemctl status mev-boost
  1. サーバー起動時にMEV-boostが自動的に実行されるようにする。
sudo systemctl enable mev-boost
  1. ビーコンチェーンのserviceファイルのExecStartに--builder http://localhost:18550を追加する。
sudo nano /etc/systemd/system/lighthousebeacon.service
[Unit]
Description=Lighthouse Beacon Node
Wants=network-online.target
After=network-online.target

[Service]
User=lighthousebeacon
Group=lighthousebeacon
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/lighthouse bn \
  --network mainnet \
  --datadir /var/lib/lighthouse \
  --http \
  --execution-endpoint http://localhost:8551 \
  --execution-jwt /var/lib/jwtsecret/jwt.hex \
  --builder http://localhost:18550

[Install]
WantedBy=multi-user.target
  1. バリデーターのserviceファイルのExecStartに--builder-proposalsを追加する。
sudo nano /etc/systemd/system/lighthousevalidator.service
[Unit]
Description=Lighthouse Validator
Wants=network-online.target
After=network-online.target

[Service]
User=lighthousevalidator
Group=lighthousevalidator
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/lighthouse vc \
  --network mainnet \
  --datadir /var/lib/lighthouse \
  --suggested-fee-recipient FeeRecipientAddress \
  --builder-proposals

[Install]
WantedBy=multi-user.target
  1. ビーコンチェーンとバリデーターを再起動する。
sudo systemctl stop lighthousevalidator

sudo systemctl stop lighthousebeacon

sudo systemctl daemon-reload

sudo systemctl start lighthousebeacon

sudo systemctl start lighthousevalidator
  1. 正常にバリデーターがRelayに登録されているか、確認用URLに自分のバリデーターの公開鍵を代入してブラウザで開いて確認する。Flashbotsの場合は以下のURLです。何か問題があれば{"code":400,"message":"no registration found for validator...が表示されます。正常に設定できていれば、{"message":{"fee_recipient":"0x...が表示されます。
https://boost-relay.flashbots.net/relay/v1/data/validator_registration?pubkey=バリデーターの公開鍵

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

ログを確認する。

sudo journalctl -fu besu

sudo journalctl -fu lighthousebeacon

sudo journalctl -fu lighthousevalidator

sudo journalctl -fu mev-boost

# 指定した時刻以降のログを出力(現在時刻はdateで確認)
sudo journalctl -u besu --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が送信量(サーバー起動してからの累計)
ifconfig

# サーバー起動日数
uptime

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

besu(実行クライアント)のアップデート方法

  1. サーバーのバージョンと公式GitHubのバージョンを確認し、アップデートの必要があるか確認する。
/usr/local/bin/besu/bin/besu --version
  1. 実行中のbesuを止め、止まっていることを確認する。
sudo systemctl stop besu

sudo systemctl status besu
  1. 古いバージョンを削除する。
sudo rm -r /usr/local/bin/besu
  1. BesuのGitHubを開き、最新リリースの「Download Links」にある末尾がtar.gzのURLをコピーする。
  1. 最新のBesuをダウンロードする。上記で取得した最新のURLを使用してください。
cd ~

curl -LO https://hyperledger.jfrog.io/artifactory/besu-binaries/besu/XX.X.X/besu-XX.X.X.tar.gz
  1. 解凍して/usr/local/binにコピーし、不要になったファイルを削除する。
tar xvf besu-XX.X.X.tar.gz

sudo cp -a besu-XX.X.X /usr/local/bin/besu

/usr/local/bin/besu/bin/besu --version

rm -r besu-XX.X.X

rm besu-XX.X.X.tar.gz
  1. besuを起動する。
sudo systemctl start besu
  1. besuがちゃんと動いていることを確認する。
sudo journalctl -fu besu

Lighthouse(コンセンサスクライアント)のアップデート方法

  1. サーバーのバージョンと公式GitHubバージョンを確認し、アップデートの必要があるか確認する。
/usr/local/bin/lighthouse --version
  1. ビーコンチェーンとバリデーターを止め、止まっていることを確認する。
sudo systemctl stop lighthousevalidator

sudo systemctl stop lighthousebeacon

sudo systemctl status lighthousevalidator

sudo systemctl status lighthousebeacon
  1. 最新のLighthouseをダウンロードする。最新バージョンのURLは公式GitHubから取得してください。
cd ~

curl -LO https://github.com/sigp/lighthouse/releases/download/vX.X.X/lighthouse-vX.X.X-x86_64-unknown-linux-gnu.tar.gz
  1. 解凍して/usr/local/binにコピーし、不要になったファイルを削除する。
tar xvf lighthouse-vX.X.X-x86_64-unknown-linux-gnu.tar.gz

sudo cp lighthouse /usr/local/bin

/usr/local/bin/lighthouse --version

rm lighthouse

rm lighthouse-vX.X.X-x86_64-unknown-linux-gnu.tar.gz
  1. ビーコンチェーンとバリデーターを起動する。
sudo systemctl start lighthousebeacon

sudo systemctl start lighthousevalidator
  1. ビーコンチェーンとバリデーターがちゃんと動いていることを確認する。
sudo journalctl -fu lighthousebeacon

sudo journalctl -fu lighthousevalidator

MEV-boostのアップデート方法

  1. 実行中のMEV-boostを停止する。
sudo systemctl stop mev-boost
  1. 最新のMEV-boostをインストールし、/usr/local/binにコピーする。
export PATH=$PATH:/usr/local/go/bin

go install github.com/flashbots/mev-boost@latest

sudo cp ~/go/bin/mev-boost /usr/local/bin

/usr/local/bin/mev-boost -version

sudo rm ~/go/bin/mev-boost
  1. MEV-boostを再開する。
sudo systemctl start mev-boost

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

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

将来的にもっとバリデーターを増やす想定があるのであれば、将来使うであろう鍵もあらかじめ生成して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のデポジットに使用するパソコンを使い、サーバーからdeposit_dataをSFTPでダウンロードします。
sftp -i SSH用の秘密鍵のディレクトリ -P ポート番号 サーバーユーザ名@サーバーIP
# 例
sftp -i /home/myuser/key -P 1234 ethereum@192.168.0.99

get /home/deposit_data….json deposit_data.json
  1. ETHのデポジットに使用するパソコンのブラウザで公式ローンチパッドを開き、deposit_dataをアップロードして追加分のETHをデポジットします。
  1. 運用する全てのバリデーターのkeystoreを、サーバーの~/eth2.0-deposit-cli/validator_keysディレクトリに入れます。
  1. ビーコンチェーンとバリデーターを止める。
sudo systemctl stop lighthousevalidator

sudo systemctl stop lighthousebeacon

sudo systemctl status lighthousevalidator

sudo systemctl status lighthousebeacon
  1. 既存のウォレットを削除する。
sudo rm -r /var/lib/lighthouse/validators
  1. 新しいバリデーターのウォレットを作成する。パスワードはkeystoreごとに入力します。
cd /usr/local/bin

lighthouse account validator import --network mainnet --directory $HOME/eth2.0-deposit-cli/validator_keys --datadir /var/lib/lighthouse

lighthouse account_manager validator list --network mainnet --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
  1. バリデーターが正常に動いていることを確認する。
sudo journalctl -fu lighthousevalidator
  1. 鍵の生成に使用したパソコンはインターネットに再度繋げることなくUbuntu Serverを初期化してください。

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

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

  1. 手順5「イーサリアムのコンセンサス(合意形成)クライアントの同期」まで新しいサーバーで実施します。

※ビーコンチェーンの同期は古いサーバーへcheckpoint syncをすると数分で終わります。
 (1) 古いサーバーにアクセスできるようにするため、古いサーバーでポート開放をする。

sudo ufw allow 5052

 (2) 古いサーバーのビーコンチェーンのExecStartにパラメータを追加する。

--http --http-address 0.0.0.0

 (3) 新しいサーバーのビーコンチェーンのExecStart=にパラメータを追加する。

--checkpoint-sync-url 古いサーバーのローカルIP:5052
# 例
--checkpoint-sync-url http://192.168.0.99:5052

 (4) 新しいサーバーのビーコンチェーンを起動してログにSyncedが表示されるまで待機する。

sudo journalctl -fu lighthousebeacon

 (5) 同期が完了したら新旧のサーバーのExecStartに追加したパラメータを削除する。

 (6) 古いサーバーのポートも閉じておく。

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