📘

AWS+Infura+PrysmでEthereum 2.0のバリデータノードを立てる

8 min read

昨年12月にEthereum2.0のフェーズ0がリリースされ、ビーコンチェーンと呼ばれる新しいチェーンの稼働がメインネットで開始されました。自分もAWS上にバリデータノードを立てたのでその過程について書きます。

バリデータとは

Ethereum2.0ではブロックチェーンの合意形成アルゴリズムがPoW(Proof of Work)からPoS(Proof of Stake)に変更され、Ethereumネットワーク上の通貨であるETHを一定額(1スロットあたり32ETH)担保として差し出す(ステーク)ことでバリデータと呼ばれるノードを立てることが出来るようになりました。バリデータはブロックの提案や検証によってEthereumネットワークを支え、その対価として年利にして約2%〜20%の報酬を得ることができます。
ただし、ダウンタイム等によるペナルティや一旦ステークを開始するとフェーズ2のリリース(約2年後とされる)まで引き出せなくなる等、現状リスクの方が遥かに大きいと感じます。

Ethereum2.0参考記事

https://hashhub-research.com/articles/2019-08-01-ethereum2-overview

どこにノードを立てるか

  1. ステーキングサービスを使う
    RocketPoolStkrNeukindといったステーキングサービスがあるようです。運用の手間が省ける、フェーズ2開始前でも引き出しが出来る、32ETH以下でもステークできる、などがメリットとして挙げられているようですが、サービス終了やハッキング被害、持ち逃げ等、第三者が間に入ることのリスクも認識しておく必要があります。

  2. 自宅に立てる
    自前でPCを用意して家に置きます。分散化への貢献という意味では最適と思われます。ネット環境や停電等の事故が不安です。

  3. クラウドに立てる
    AWS等のクラウドサービスを使ってノードを立てます。分散化に貢献しているとは言えないかもしれませんが、自宅運用よりは確実に手間やリスクを減らし、可用性を高めることができます。

タイトルの通り、今回はAWSを使ってノードを作ることにしました。

EC2インスタンスの選択

後述しますが、今回はeth2クライアントにPrysmを使用します。必要なハードウェアの要件は下記の通りです。

Minimum specifications
Operating System: 64-bit Linux, Mac OS X 10.14+, Windows 64-bit
Processor: Intel Core i5–760 or AMD FX-8100 or better
Memory: 4GB RAM
Storage: 20GB available space SSD

Recommended specifications
Processor: Intel Core i7–4770 or AMD FX-8310 or better
Memory: 8GB RAM
Storage: 100GB available space SSD
出典:https://docs.prylabs.network/docs/install/install-with-script/

この方の記事を参考に、下記のような構成にすることにしました。

  • インスタンスタイプ: t3.large ($0.0835/hour)
  • OS: Ubuntu 20.04
  • Storage: 100GB

Prysmが使用するポートをセキュリティルールに設定しておきます。

タイプ プロトコル ポート範囲 ソース 説明 - オプション
カスタム UDP UDP 12000 0.0.0.0/0 Prysmが使用
カスタム TCP TCP 13000 0.0.0.0/0 Prysmが使用

I’m selecting the m5.xlarge instance, which provides 4 virtual computing >cores (vCPUs) and 16GB RAM. After running Ethereum 2.0 mainnet for a day or >so, my machine has not used more than 4% of the available vCPU. As mentioned >in the “Future Proofing” section above, the Ethereum 2.0 network demands >will only grow. But for the next few months, absent any prolonged major >network spikes, I would most likely be fine with an m5.large instance (2 >virtual cores / vCPUs, 8GB RAM)

Technical folks more savvy than myself have also recommended the t3.large >instance as a reasonable option for Ethereum 2.0. t3.large has 2 vCPUs and >8GB memory, same as m5.large, but the t3 family is built for more >“burstable” network activity (spikes in CPU) rather than the m5 family built >for consistent CPU loads.
出典:https://consensys.net/blog/featured/my-journey-to-becoming-a-validator-on-ethereum-2-0-part-2/

バリデータノードの準備

以降は基本的にEthereum Foundationが公開しているLaunchPadに従って進めていきます。

https://launchpad.ethereum.org/

1.概要説明

https://launchpad.ethereum.org/overview

Ethereum 2.0の概要説明やバリデータノードを立てる上での注意点など、重要事項の説明を確認していきます。

2.クライアントの選択

https://launchpad.ethereum.org/select-client
バリデータノードを立てるためにはEth1、Eth2両方のクライアントを稼働させる必要があります。クライアントは言語の脆弱性等のリスク回避のためいくつかの言語で実装されたものが公開されています。

Ethreum1クライアントの選択

当初はGoで実装されたGethを使用してローカルにEth1ノードを立てようと考えていましたが、ブロックの同期で想像以上にストレージが必要になることがわかり、コストを考えて今回はサードパーティのサービスであるInfuraを使用することにしました。(分散化に貢献できずにすみません)

Infuraのエンドポイントを準備

infura.ioにてアカウント作成、Ethereumプロジェクト作成
Mainnetのエンドポイントを確認しメモしておく

Ethreum2クライアントの選択

Ethereum2のクライアントはGoで実装されたPrysmを使用することにしました。

Prysmのインストール

Prysmのインストールはオフィシャルサイトを参考に

https://docs.prylabs.network/docs/install/install-with-script/
$ mkdir prysm && cd prysm
$ curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh

ビーコンチェーンを起動する

$ ./prysm.sh beacon-chain --http-web3provider={Infura Endpoint}

ビーコンチェーンを起動するとまずブロックの同期が開始され、これが完了するまで数時間かかりました。Synced new blockというメッセージが表示されるようになると準備完了です。

ビーコンチェーンが常に起動するようにサービスとして登録しておきました。

$ sudo nano /etc/systemd/system/prysm_beacon.service
prysm_beacon.service
[Unit]
Description=Beacon-chain
[Service]
ExecStart=/bin/bash /home/ubuntu/prysm/prysm.sh beacon-chain --http-web3provider={Infura Endpoint}
RemainAfterExit=no
Restart=on-failure
RestartSec=5s
User=ubuntu
[Install]
WantedBy=default.target
#サービスの有効化
$ sudo systemctl enable prysm_beacon
#サービスの開始
$ sudo systemctl start prysm_beacon

ビーコンチェーンの起動を確認します。

$ sudo journalctl -f -u prysm_beacon

3.キーペアの生成

https://launchpad.ethereum.org/generate-keys
LaunchPadのGenerate Key Pairsの項目に進み、Depositを実行するためのコマンドラインツールをダウンロードします。
$ wget https://github.com/ethereum/eth2.0-deposit-cli/releases/download/v1.1.0/eth2deposit-cli-ed5a6d3-linux-amd64.tar.gz
$ tar xvzf eth2deposit-cli-ed5a6d3-linux-amd64.tar.gz
$ cd eth2deposit-cli-ed5a6d3-linux-amd64

下記コマンドでデポジットデータとキーストアを生成します。

$ ./deposit new-mnemonic --num_validators {今回立てるバリデータの数} --chain mainnet

対話形式でいくつか質問されるので、答えていきます。
完了するとニーモニックフレーズと呼ばれる単語の羅列が表示されます。

このニーモニックフレーズは超重要で、これをなくすと二度とデポジットを引き出すことができなくなります。必ずメモし、できればオフラインで保存します。

その後ニーモニックフレーズの確認を行い、完了すると鍵が生成され、下記画面が表示されて完了です。

4.デポジットデータのアップロード

https://launchpad.ethereum.org/upload-validator
LaunchPadのUpload Deposit Fileの項目に進み、指示のとおりに先程validator_keysディレクトリの中に生成されたdeposit-data-[timestamp].jsonをアップロードします。

5.ウォレットの接続

LaunchPadのConnect Walletの項目に進み、32ethを保管してあるウォレットアプリに接続します。
接続が完了すると下記のような画面が表示されます。

6.デポジットの最終確認とトランザクションの発行

LaunchPadのSummaryに進むと注意事項が再度表示され、デポジットの最終確認ができます。
注意事項をよく確認し、問題なければInitiate The Transactionを押下してトランザクションを発行します。
トランザクションが確定されると下記の画面が表示され、デポジットは完了となります。

デポジットからバリデータがアクティベートされるまで2021年1月時点で約20日弱かかるようなので、気長に待ちます。

バリデータの起動

ここまででデポジットは完了したので、最後にバリデータを起動します。

キーストアからアカウントをインポートします。先程キーストア生成時に設定したパスワード等が対話形式で質問されます。

$ ./prysm.sh validator accounts import --keys-dir=../eth2deposit-cli-ed5a6d3-linux-amd64/validator_keys

バリデータをサービスとして登録します。

$ sudo nano /etc/systemd/system/validator.service
validator.service
[Unit]
Description=Validator
[Service]
ExecStart=/bin/bash /home/ubuntu/prysm/prysm.sh validator --wallet-password-file /home/ubuntu/prysm/password.txt
StandardOutput=append:/home/ubuntu/prysm/validator.log
RemainAfterExit=no
Restart=on-failure
RestartSec=5s
User=ubuntu
[Install]
WantedBy=default.target

バリデータサービスを有効化、開始します。

$ sudo systemctl enable validator
$ sudo systemctl start validator

バリデータが起動していることを確認します。

$ tail -f /home/ubuntu/prysm/validator.log

アクティベート前の状態では下記のようなログが表示されていました。

time="2021-01-07 03:36:37" level=info msg="Deposit processed, entering activation queue after finalization" index=70117 positionInActivationQueue=16247 prefix=validator pubKey=0xa15b492aa956 status=DEPOSITED
time="2021-01-07 03:36:49" level=info msg="Deposit processed, entering activation queue after finalization" index=70117 positionInActivationQueue=16247 prefix=validator pubKey=0xa15b492aa956 status=DEPOSITED

以上でバリデータとして稼働する準備ができました。

参考URL

https://qiita.com/okuura/items/305c1e18d13215771203
https://consensys.net/blog/featured/my-journey-to-becoming-a-validator-on-ethereum-2-0-part-2/
https://medium.com/coinmonks/what-hardware-for-an-ethereum-2-0-validator-e8f5f89de43e

2021/01/26 追記

無事にバリデータがアクティベートされ、稼働を開始しました。約1日経過した時点ではAPRが10.38%となっています。

Discussion

ログインするとコメントできます