Ethereum 2.0のバリデータになってみた話

[NRI OpenStandia Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nri-openstandia)の20日目です。
本日は他の皆さんとは少し趣向の異なる記事となりますが、よろしくお願いいたします。

# はじめに
つい先日、2020年12月1日に**Ethereum 2.0のフェーズ0-ビーコンチェーン**が正式に稼働されはじめました🎉
数年前から開発ロードマップで計画されていた Ethereum2.0の幕がいよいよ開けたことに感慨深い方もいらっしゃるのではないでしょうか。何を隠そう、私もその１人です。
Ethereum 2.0の特徴の一つとして、コンセンサスアルゴリズムが**PoW（Proof of Work）**から**PoS（Proof of Stake）**に移行することが挙げられます。これにより、巨大なマシンパワーを提供せずともブロックを提案できるノードになれるようになりました（このようなノードをEthereum 2.0では**バリデータ**といいます）。更に、バリデータを稼働させることで報酬を得ることもできます。
本記事では、Ethereum 2.0の簡単な紹介とバリデータのインストール方法を紹介します。

# Ethereum 1.0と2.0について
「いや、そもそもEthereumってなんなの？」という方もいらっしゃると思いますが、Ethereum 1.0や2.0について先人の記事がたくさんあるので、本記事では簡単な説明に留まらせていただきます。（本章の末尾に参考記事をピックアップしておきます）

既に使い古された説明となりますが、ざっくり説明すると**Ethereumはブロックチェーン上にプログラムを組み込める（スマートコントラクトと呼ばれる）プラットフォーム**であり、プログラムの改ざんが困難・中央管理者が介在しない・条件を満たせばプログラムを自動で実行できる といった特徴があります。

しかし、一般的にブロックチェーンでは**スケーラビリティのトリレンマ**という**分散性・一貫性・スケーラビリティ**に関して同時に全て満たすことは困難である（せいぜい2つしか満たせない）という概念が提唱されており、Ethereum 1.0においてもこれは同様でした。例えば、分散したノード間でトランザクションの一貫性を保つためには、各ノード間での合意形成（コンセンサス）が必要ですが、これはスケーラビリティを犠牲にしている、といった具合ですね。
<img width="800" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/27ff369b-7907-45c1-5094-c847b55740b1.png">
※出典：https://docs.prylabs.network/docs/introduction/on-ethereum-2

Ethereum 2.0では、このトリレンマの3要素を可能な限り満たすために**シャーディング、PoS：Proof of Stake、eWASM**といった概念が取り込まれています。また、いきなりEthereum 1.0からEthereum 2.0に移行するのではなく、フェーズに分けて今後数年単位で徐々に移行していきます。今回、2020年の12月1日にはEthereum 2.0の始まりであるフェーズ0（ビーコンチェーンの稼働）が開始されたということです。
このあたりは以下の記事が分かりやすいです。
https://lab.stir.network/2019/04/22/ethereum2-serenity-overview-and-roadmap/

ここでは、Ethereum 2.0で重要となる＆本稿に関係する項目として、**PoS:Proof of Stake**について簡単に言及しておきます。

【参考情報】
**Ethereum 1.0**
https://book.ethereum-jp.net/what_is_ethereum/ethereum_as_dapp_platform

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

## PoS:Proof of Stake（コンセンサスアルゴリズム）
Ethereum 1.0では、おなじみのbitcoinと同じコンセンサスアルゴリズムである**PoW:Proof of Work**が利用されていました。**PoWでは計算問題（トランザクションに対して特定のハッシュ値になるようなnonce値を探索する、など）を解けたノード**がトランザクションの束であるブロックを提案できる権利（＋マイニング報酬を受け取る権利）を得ることができますが、これには巨大なマシンパワーを要します。
ちなみに、Ethereumにおけるスマートコントラクトの実行には**Ether（以下ETH）**と呼ばれるトークンが必要であり、このETHが事実上通貨として取り扱われています。このETHはマイニング報酬として受け取ることができます。

これに対して、Ethereum 2.0における**PoS:Proof of Stake**では**通貨を保有するノードがランダムに交代でブロックの提案権利や他ノードのブロックの正当性に投票する権利を割り当てられ、もしノードが不当なブロックを提案したりオフラインだった場合には、予めデポジットしておいた通貨がペナルティとして剥奪される**仕組みになっています。但し、正当なブロックを提案した場合には報酬を受け取ることができます。ここでいうノードのことをEthereum 2.0では**バリデータ**といいます。
参加するノードは報酬を得ることがモチベーションであるため、基本的に正当な振る舞いを行うようにデザインされています。このように、PoSでは巨大なマシンパワーを有せずとも通貨を保有していればブロックを提案できるチャンスがあるため、ノードの参入障壁が下がり、ブロックチェーンとしての分散性が高まるというメリットもあります。

Ethereum 2.0では32ETH（2020/12/17時点で約$20,000）をデポジットさえすれば誰でもブロックを提案・投票を行うノード（バリデータ）になることができ、その報酬として新たなETHを受け取ることができます。

# バリデータの報酬
改めて、バリデータとはEthereum 2.0においてブロックを提案・投票するためのノードです。
そして、**32ETHさえデポジットすれば誰でもバリデータになる**ことができます。

基本的にバリデータを正常に稼働させ続ければ報酬を得ることができますが、バリデータを稼働させているマシンがダウンしていたりするとペナルティとしてデポジットしたETHの一部が没収されてしまいます。

では、バリデータを稼働させ続けた場合にどの程度の報酬を得ることができるのか？
公式のFAQによると、おおよそ**デポジットしたETHの2～20％の範囲の報酬を年間で得る**ことができるようです。
10％だとしても、32ETHなら大体$2,000程度を報酬として得ることができる感じでしょうか。

> **How large are the rewards/penalties?**
There is no easy answer to this question as there are many factors that go into this calculation.
Arguably the most impactful factor on rewards earned for validating transactions is the total amount of stake in the network. In other words, the total amount of validators. Depending on this figure the max annual return rate for a validator can be anywhere between 2 and 20%.
※出典：https://launchpad.ethereum.org/faq

こちらを見ると、Ethereumネットワーク全体のバリデータ数や各バリデータの受け取った報酬を確認することができます。まだローンチされてから数週間しか経っていませんが、それなりに報酬を受け取っているバリデータもいるようです。
https://beaconscan.com/validators-leaderboard

但し、**デポジットしたETHや報酬として得られたETHはフェーズ2まで（およそ2年先）は引き出せない**ため、こちらも注意が必要です。

# バリデータ導入前の注意
**前項で説明したとおり、バリデータになると自らが保有するETHが減る可能性もあります。**
**また、デポジット時にETHの送付先を誤ると32ETH全て失う可能性もあります。**
**減った/失った場合の責任等は一切負えないため、ここから先で紹介する内容はあくまで参考程度にご覧ください。**

# バリデータの導入
今回バリデータをインストールするマシンですが、継続して稼働し続ける必要がある（とはいえ、厳密に24/365を求めている訳ではない）ため、コスト面からクラウドではなくミニPCにしてみました。ASUSのPN50なのですが、このサイズ感でRyzen R5 4500Uとメモリ16GBを積んでいます。SSDを512GBにしてしまったのをちょっと後悔。。全部込みで65,000円くらいでした。バリデータ稼働による報酬が3.5％あれば1年で回収できてしまいますね。
OSはCentOS7です。
<img width="500" alt="PN50" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/3e3a9334-bf53-94ce-5170-59a1c8bd819e.jpeg">

では、早速バリデータを導入していきましょう。
基本的に公式が提供している以下のページをベースに導入を進めます。
https://launchpad.ethereum.org/
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/27a7addf-a4ef-53a8-7265-91674fd7a560.png">
※出典：https://launchpad.ethereum.org/

## GET STARTED 
トップページの「GET STARTED」リンクを進むと、バリデータの概要やペナルティなどのリスク、32ETHをデポジットする必要があるなどの重要な項目をひとつひとつ確認していくページに遷移します。重要な事項が記載されているので、今一度ちゃんと確認しながら進めましょう。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/c792b4f9-f2c0-2aa9-1479-6a37556d24b4.png">
※出典：https://launchpad.ethereum.org/overview

簡単にまとめると、

* バリデータへの参加は32ETHのデポジットが必要
* デポジットしたETHはEthereum 2.0のフェーズ2（約2年先）まで引き出せない
* バリデータを正しく稼働させていれば報酬を得ることができる
* バリデータがオフラインだと、本来得られていた報酬分がペナルティとして徴収される
* 仕様に反した挙動のバリデータは大きなペナルティが発生する可能性がある

といったことが記載されています。どれも重要ですね。

## Ethereum 1.0クライアントのインストール
確認が終わると、次はEthereum 1.0のクライアントを選択する画面になります。
バリデータ用のデポジット処理を行うためにEthereum 1.0のクライアントとEthereum2.0のクライアントを並行して稼働させる必要があります（デポジットにはEthereum 1.0のETHを使うため）。

<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/cc248d5a-bc6c-808f-e453-e1059de28284.png">
※出典：https://launchpad.ethereum.org/select-client

提示される4つのクライアントはそれぞれ異なるプログラミング言語（Java, Go, Rust, .NET）から構成されています。これはプログラミング言語自体になんらかの脆弱性があった際に全てのクライアントで脆弱性の影響を受けないようにするためのようです。

今回はGO言語を採用している**Geth（go-ethereum）**を選択することにしました。
Gethのインストールドキュメントが**[リンク](https://geth.ethereum.org/docs/install-and-build/installing-geth)**されているので、こちらからインストールを進めます。

ここまできて気づいたのですが、Gethはyum経由でインストールする方法がありません。そのため、今回はソースコードからmakeしようと思います。また、今回はGolangがインストールされていないまっさらなCentOS7を利用しているため、まずはGolangからインストールします。

### Golangのインストール
Golangは標準では用意されていないパッケージのため、epelリポジトリをインストールしてからGolangをインストールします。

```
# yum install epel-release
# yum install golang
# go version
go version go1.15.5 linux/amd64
```
`go version`でバージョン情報が表示されたらOKです。これでGolangがインストールできました。

### Gethのインストール
次はGethをmakeしてインストールします。ちなみに、CentOSでインストールできるgitは1.8系と古く、Gethのmake中にエラーとなってしまうので、別途2.x系のgitをインストールしておく必要があります（**[こちら](https://qiita.com/noraworld/items/8546c44d1ec6d739493f)**が詳しいです）。
以下のようにGethをmakeしてインストールします。wgetするGethのバージョンは適宜最新のものを指定してください。

```
# wget https://github.com/ethereum/go-ethereum/archive/v1.9.25.tar.gz
# tar xvzf v1.9.25.tar.gz
# cd go-ethereum-1.9.25
# make geth
# cp build/bin/geth /usr/local/bin/
# geth version
Geth
Version: 1.9.25-stable
Architecture: amd64
Protocol Versions: [65 64 63]
Go Version: go1.15.5
Operating System: linux
GOPATH=
GOROOT=go
```
いい感じですね。`geth version`でGethのバージョン情報が表示されたらOKです。

### Gethの起動
Gethの起動前に`8545`ポートと`30303`ポートを開放しておいてください。Gethで利用します。

```
firewall-cmd --zone=public --add-port=8545/tcp --add-port=30303/tcp --permanent
firewall-cmd --zone=public --add-port=8545/udp --add-port=30303/udp --permanent
firewall-cmd --reload
```

では、Gethを起動します。以下のコマンドを実行します。
クライアント選択画面に注記のあったとおり、`--http`オプションを付与します。このオプションを付与することでEthereum2.0で利用するJSON RPCのエンドポイントを立てることができます。また、`--datadir`オプションでgethに関するデータを配置するディレクトリを指定します。
このコマンドを投入すると長い時間をかけてブロックを同期し始めるので、適宜バックグラウンドで実行させてください。

```
geth --http --datadir "[データを配置するディレクトリ]"
```

起動すると、何やらたくさん出力されはじめます。これはこれまで生成されてきたブロックを同期しています。
現在、どの程度ブロックが同期されているかはGethのコンソールから確認できます。
別のターミナルを立ち上げ、以下のコマンドでGethのコンソールに入って`eth.syncing`を実行してみましょう。現在のブロックの同期状態を確認できます。

```
# geth --datadir "[データを配置するディレクトリ]" attach ipc:[データを配置するディレクトリ]/geth.ipc 
Welcome to the Geth JavaScript console!

instance: Geth/v1.9.25-stable/linux-amd64/go1.15.5
at block: 0 (Thu Jan 01 1970 09:00:00 GMT+0900 (JST))
 datadir: [データを配置するディレクトリ]
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

To exit, press ctrl-d 
> 
> eth.syncing
{
  currentBlock: 6161842,
  highestBlock: 11438119,
  knownStates: 126933907,
  pulledStates: 126915260,
  startingBlock: 6150976
}
>
```
`currentBlock`が現在同期中のブロック、`highestBlock`が現時点で先頭のブロックです。つまり、`currentBlock`が`highestBlock`まで追いついたら同期完了ということですね。ネットワーク環境やマシンのスペックにも依存しますが、同期完了には数時間～数日ほど要する場合もあるようです。
`eth.syncing`の結果が`false`になればブロックの同期が完了です。

```
> eth.syncing
false
>
```

ここまで来たらEthereum 1.0クライアントのインストールは終わりです。

## Ethereum 2.0クライアントのインストール
次はEthereum 2.0のクライアントを選択する画面になります。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/a6f11178-e5d8-721a-078c-0da961fb457e.png">
※出典：https://launchpad.ethereum.org/select-client

先ほどと同様に、好みのクライアントをインストールしていきましょう。
ここでもGoで実装された**Prysm**をインストールすることにします。画面に表示されている以下のリンクからPrysmをインストールしていきます。
https://docs.prylabs.network/docs/mainnet/joining-eth2

### Prysmのインストール
Prysmはインストール用のスクリプトが用意されていますので、こちらを参考にインストールを進めます。
https://docs.prylabs.network/docs/install/install-with-script/

こちらもPrysmが利用するポートである`12000`ポート(UDP)と`13000`ポート(TCP)を予め開放しておいてください。

```
firewall-cmd --zone=public --add-port=12000/udp --add-port=13000/tcp --permanent
firewall-cmd --reload
```

ポートを空けたら、Prysmのインストールスクリプトをダウンロード＆実行していきます。

```
# curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh
# ./prysm.sh beacon-chain --http-web3provider=[GethのAPIエンドポイント(http://localhost:8545など)]
Latest Prysm version is v1.0.4.
Downloading beacon chain@v1.0.4 to [実行ディレクトリ]/dist/beacon-chain-v1.0.4-linux-amd64 (automatically selected latest available version)

~中略~

Prysmatic Labs Terms of Use

By downloading, accessing or using the Prysm implementation (“Prysm”), you (referenced herein
as “you” or the “user”) certify that you have read and agreed to the terms and conditions below.

TERMS AND CONDITIONS: https://github.com/prysmaticlabs/prysm/blob/master/TERMS_OF_SERVICE.md

Type "accept" to accept this terms and conditions [accept/decline]: (default: decline):
```
利用規約に同意するかを尋ねられるので、問題なければ`accept`をタイプします。するとブロックが同期され始めます。

```
time="2020-12-13 09:49:28" level=info msg="Using "max_cover" strategy on attestation aggregation" prefix=flags
time="2020-12-13 09:49:28" level=info msg="Checking DB" database-path="[ホームディレクトリ]/.eth2/beaconchaindata" prefix=node
time="2020-12-13 09:49:28" level=info msg="Deposit contract: 0x00000000219ab540356cbb839cbe05303d7705fa" prefix=node
time="2020-12-13 09:49:28" level=info msg="Waiting for state to be initialized" prefix=initial-sync
time="2020-12-13 09:49:28" level=info msg="Starting beacon node" prefix=node version="Prysm/v1.0.4/b4437e6cecd78257d2699f42073a90a940baf716. Built at: 2020-12-07 16:42:42+00:00"
time="2020-12-13 09:49:28" level=info msg="Starting JSON-HTTP API" address="127.0.0.1:3500" prefix=gateway
time="2020-12-13 09:49:28" level=info msg="Waiting to reach the validator deposit threshold to start the beacon chain..." prefix=blockchain
time="2020-12-13 09:49:28" level=info msg="gRPC server listening on port" address="127.0.0.1:4000" prefix=rpc
time="2020-12-13 09:49:28" level=warning msg="You are using an insecure gRPC server. If you are running your beacon node and validator on the same machines, you can ignore this message. If you want to know how to enable secure connections, see: https://docs.prylabs.network/docs/prysm-usage/secure-grpc" prefix=rpc
time="2020-12-13 09:49:28" level=info msg="Connected to eth1 proof-of-work chain" endpoint="http://localhost:8545" prefix=powchain
time="2020-12-13 09:50:06" level=info msg="Processing deposits from Ethereum 1 chain" deposits=512 genesisValidators=507 prefix=powchain
time="2020-12-13 09:50:24" level=info msg="Processing deposits from Ethereum 1 chain" deposits=1024 genesisValidators=1019 prefix=powchain
time="2020-12-13 09:51:25" level=info msg="Processing deposits from Ethereum 1 chain" deposits=1536 genesisValidators=1531 prefix=powchain
time="2020-12-13 09:53:03" level=info msg="Processing deposits from Ethereum 1 chain" deposits=2048 genesisValidators=2043 prefix=powchain
time="2020-12-13 09:53:19" level=info msg="Processing deposits from Ethereum 1 chain" deposits=2560 genesisValidators=2555 prefix=powchain
time="2020-12-13 09:53:57" level=info msg="Processing deposits from Ethereum 1 chain" deposits=3072 genesisValidators=3067 prefix=powchain
...
```

上記スクリプトでビーコンノードが起動しています。ちなみに、Gethにおけるブロックの同期が終わっていないとエラーになるので、同期が終わってから実行しましょう。
以下のようにブロックが随時新しいブロックが同期されるようになれば準備OKです。詳しくはPrysmのページを見てみてください。
https://docs.prylabs.network/docs/prysm-usage/is-everything-fine

```
time="2020-12-13 19:50:24" level=info msg="Finished applying state transition" attestations=10 attesterSlashings=0 deposits=0 prefix=blockchain proposerSlashings=0 voluntaryExits=0
time="2020-12-13 19:50:35" level=info msg="Synced new block" block=0x915d7a52... epoch=2689 finalizedEpoch=2687 finalizedRoot=0x919bbd7d... prefix=blockchain slot=86051 slotInEpoch=3
time="2020-12-13 19:50:35" level=info msg="Finished applying state transition" attestations=12 attesterSlashings=0 deposits=0 prefix=blockchain proposerSlashings=0 voluntaryExits=0
time="2020-12-13 19:50:47" level=info msg="Synced new block" block=0x763b567e... epoch=2689 finalizedEpoch=2687 finalizedRoot=0x919bbd7d... prefix=blockchain slot=86052 slotInEpoch=4
time="2020-12-13 19:50:47" level=info msg="Finished applying state transition" attestations=11 attesterSlashings=0 deposits=0 prefix=blockchain proposerSlashings=0 voluntaryExits=0
time="2020-12-13 19:50:59" level=info msg="Synced new block" block=0xcaed48b8... epoch=2689 finalizedEpoch=2687 finalizedRoot=0x919bbd7d... prefix=blockchain slot=86053 slotInEpoch=5
time="2020-12-13 19:50:59" level=info msg="Finished applying state transition" attestations=8 attesterSlashings=0 deposits=0 prefix=blockchain proposerSlashings=0 voluntaryExits=0
time="2020-12-13 19:51:11" level=info msg="Synced new block" block=0x04d3f694... epoch=2689 finalizedEpoch=2687 finalizedRoot=0x919bbd7d... prefix=blockchain slot=86054 slotInEpoch=6
```
さて、これでPrysmの準備も完了です。

## デポジットデータとキーストアの生成
Ethereum 1.0/2.0のクライアント設定が完了したら、次はいよいよバリデータの準備になります。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/5804a148-2ac7-9902-8ec0-4b191ad072dc.png">
※出典：https://launchpad.ethereum.org/generate-keys

まずは、バリデータに32ETHをデポジットするためのデポジットデータとバリデータのアカウント作成用のキーストアを生成します。ここではCLIツールが用意されているので、これを利用して生成していきます。画面から立てたいValidatorの数と利用OSを選択し、CLIツールをダウンロードしましょう。
https://github.com/ethereum/eth2.0-deposit-cli/releases/

```
# 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 [立てたいバリデータ数(1など)] --chain mainnet
```

対話形式でいくつかの情報を尋ねられるので、必要な情報を入力してください。

**★次のステップが超重要です！★**
表示される単語群を必ず控えてください。（できれば紙などが良い）
この単語群はデポジットを引き出す際に利用するニーモニックフレーズになります。**このニーモニックフレーズが無ければデポジットしたETHを引き出すことができませんし、もし誰かに漏洩してしまえば勝手にETHを引き出されてしまうリスクがあることに留意してください。**

```
This is your seed phrase. Write it down and store it safely, it is the ONLY way to retrieve your deposit.

[★★★ここに記載してある単語群を控える★★★]

Press any key when you have written down your mnemonic.
```

控え終わったら任意のキーを押下して先に進みます。
控えたニーモニックを入力するよう促されるため、先ほど控えたニーモニックを入力しましょう。入力内容に問題がなければ、以下の画面が表示されてデポジットデータとキーストアが生成されます。

```

                                                                  
                  #####     #####                                 
                ##     #####     ##                               
    ###         ##   #######     #########################        
    ##  ##      #####               ##                   ##       
    ##     #####                 ##                       ##      
    ##     ##                     ##                      ###     
   ########                        ##                     ####    
   ##        ##   ###         #####                       #####   
   #                          ##                         # #####  
   #                            #                        #  ##### 
   ##                             ##                    ##        
   ##                              ##                   ##        
   ##             ###              ##                   ##        
   ###############                 ##                   ##        
   ###               ##                                 ##        
      #############################                    ##         
                     ##                             ###           
                     #######     #################     ###        
                     ##   ## ##        ##   ##    ###             
                     ##############          #############        
                                                                  
Creating your keys.
Creating your keystores:          [####################################]  1/1
Verifying your keystores:         [####################################]  1/1
Verifying your deposits:          [####################################]  1/1

Success!
Your keys can be found at: [CLIツールのディレクトリ]/validator_keys

Press any key.
```

CLIツールのディレクトリに`validator_keys`ディレクトリが作成され、その中に**デポジットデータ（`deposit_data-xxxxx.json`）**と**キーストア（`keystore-m_xxxxx.json`）**が生成されていればOKです。
デポジットデータにはバリデータに関連付けられた公開鍵や署名、デポジットするETHの量などの情報が含まれています。

## デポジットデータのアップロード
次は作成したデポジットデータをアップロードする画面になります。
先ほど生成された**デポジットデータ（`deposit_data-xxxxx.json`）**をアップロードし、Continueから次に進みましょう。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/38fddca2-3a39-bd54-155a-53b58b166912.png">
※出典：https://launchpad.ethereum.org/upload-validator

## ウォレットとの接続
次に32ETHを保管しているウォレットを選択しましょう。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/80830af4-8e11-9586-ea1f-e6450611e840.png">
※出典：https://launchpad.ethereum.org/connect-wallet

選択するとウォレットアプリが起動し、以下のこのような画面になりますので、Continueから次に進みましょう。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/09a7dbc9-8416-ed70-e224-145c220f50c1.png">
※出典：https://launchpad.ethereum.org/connect-wallet

## デポジット前の最終確認
デポジット前の最終確認として、デポジットするETH数や**ニーモニックフレーズを失ったらデポジットしたETHを引き出す術が無い**こと、**デポジットのトランザクションを巻き戻すことはできない**ことなどがチェックリストとして記載されているので、改めて確認していきます。怖かったらまだ引き返せます。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/f8e1d088-606b-115a-b6b1-66614bebaa86.png">
※出典：https://launchpad.ethereum.org/connect-wallet

### デポジットトランザクションの発行
いよいよデポジットのトランザクションを開始する画面になりました。
Initiate The Transactionを押下してトランザクションを開始しましょう！
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/33e6e7da-b3b0-7772-4414-65c05f6ff42a.png">
※出典：https://launchpad.ethereum.org/connect-wallet

するとウォレットアプリが起動し宛先アドレス等が表示されますが、**念のため**表示される宛先アドレスが悪意のある第三者のアドレスではないことをググって確認してください。2020年12月17日時点では、以下が宛先のコントラクトアドレスのようです（他の人の32ETHのデポジットトランザクションがずらずらと確認できますね）。
https://etherscan.io/address/0x00000000219ab540356cbb839cbe05303d7705fa

問題がなければトランザクションを発行します。
すると、画面に表示されるリンクから自身のデポジットトランザクションも確認できるようになります。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/d56659e6-0182-26cf-3466-f3e6e1a9342e.png">

また、Etherscan内のリンクのBeaconScanからはバリデータの状況や現在のETH量を確認できます。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/cd559d7e-6950-6687-8472-38402e795a20.png">
まだこの時点ではデポジットの処理中ですが、Ethereum 2.0ネットワーク上のバリデータの一員になったと言えるでしょう。なんだか嬉しいですね。
ただ、実際にバリデータとしてアクティベーションされるには２週間程度かかるようです。

## バリデーターの起動
さて、デポジットトランザクションも発行したため、あとはバリデータを起動していきます。

まずは先ほど作成した`validator_keys`を利用してバリデータのアカウントを作成します。
以下のコマンドを実行すると、アカウント用のディレクトリやパスワードを問われるので入力していきます。

```
$ ./prysm.sh validator accounts import --keys-dir=[validator_keysディレクトリのパス]
Latest Prysm version is v1.0.4.
Downloading validator@v1.0.4 to [実行ディレクトリ]/dist/validator-v1.0.4-linux-amd64 (automatically selected latest available version)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 47.1M  100 47.1M    0     0  46.8M      0  0:00:01  0:00:01 --:--:-- 46.9M
Verifying binary integrity.
validator-v1.0.4-linux-amd64: 完了
gpg: 2020年12月08日 02時46分35秒 JSTにRSA鍵ID F1A5036Eで施された署名
gpg: "Preston Van Loon <preston@prysmaticlabs.com>"からの正しい署名
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵のフィンガー・プリント: 0AE0 051D 647B A3C1 A917  AF40 72E3 3E4D F1A5 036E
Verified [実行ディレクトリ]/dist/validator-v1.0.4-linux-amd64 has been signed by Prysmatic Labs.
Starting Prysm validator accounts import --keys-dir=[validator_keysディレクトリのパス]
[2020-12-15 01:12:24]  WARN flags: Running on ETH2 Mainnet
Enter a wallet directory (default: [ホームディレクトリ]/.eth2validators/prysm-wallet-v2):

Password requirements: at least 8 characters including at least 1 alphabetical character, 1 number, and 1 unicode special character. Must not be a common password nor easy to guess
New wallet password: 
Confirm password: 
[2020-12-15 01:13:28]  INFO accounts: Successfully created new wallet wallet-path=[ホームディレクトリ]/.eth2validators/prysm-wallet-v2
Enter the password for your imported accounts: 
Importing accounts, this may take a while...
Importing accounts... 100% [===============================================================================]  [0s:0s]
Successfully imported 1 accounts, view all of them by running accounts list
```

アカウントが作成できたら、いよいよバリデータを起動します。
バリデータ起動時にパスワードを尋ねられますが、実行時に`--walet-pasword-file`オプションでバインドしておくことも可能です。

```
[実行ディレクトリ]/prysm.sh validator --wallet-password-file=[パスワードファイルのディレクトリ]/password.txt
Starting Prysm validator 
[2020-12-15 01:23:07]  WARN flags: Running on ETH2 Mainnet
[2020-12-15 01:23:07]  INFO prompt: (wallet path) [ホームディレクトリ]/.eth2validators/prysm-wallet-v2
Wallet password: 
[2020-12-15 01:23:21]  INFO node: Opened validator wallet keymanager-kind=direct wallet=[ホームディレクトリ]/.eth2validators/prysm-wallet-v2/direct
[2020-12-15 01:23:22]  WARN node: Slashing protection file [ホームディレクトリ]/.eth2validators/prysm-wallet-v2/direct/validator.db is missing.
If you changed your --wallet-dir or --datadir, please copy your previous "validator.db" file into your current --datadir.
Disregard this warning if this is the first time you are running this set of keys.
[2020-12-15 01:23:22]  INFO node: Checking DB databasePath=[ホームディレクトリ]/.eth2validators/prysm-wallet-v2/direct
[2020-12-15 01:23:22]  INFO node: Starting validator node version=Prysm/v1.0.4/b4437e6cecd78257d2699f42073a90a940baf716. Built at: 2020-12-07 16:42:42+00:00
[2020-12-15 01:23:22]  WARN validator: You are using an insecure gRPC connection. If you are running your beacon node and validator on the same machines, you can ignore this message. If you want to know how to enable secure connections, see: https://docs.prylabs.network/docs/prysm-usage/secure-grpc
[2020-12-15 01:23:22]  INFO validator: Waiting for beacon chain start log from the ETH 1.0 deposit contract
[2020-12-15 01:23:22]  INFO validator: Validating for public key publicKey=0xb116bc717458
[2020-12-15 01:23:22]  INFO validator: Beacon chain started genesisTime=2020-12-01 21:00:23 +0900 JST
[2020-12-15 01:23:22]  INFO validator: Waiting for deposit to be observed by beacon node pubKey=0xb116bc717458 status=UNKNOWN_STATUS
```

無事バリデータ起動しました。お疲れさまでした！

## おわりに
長くなりましたが、これでバリデータを稼働させる一通りのステップは終わりです。
バリデータは起動さえしておけば、あとは放っておけば自動でブロックの提案や投票をしてくれます。つまり自動でETHが増えていくわけですね。

アクティベーションが完了したら、バリデータとして稼働し始めることでしょう。

またバリデーションが稼働し始めたら状況を本記事に追記いたします🕺

### 2021/1/3追記
バリデータがアクティベートされ、稼働し始めました！
まだ稼働し始めて5日程度ですが、おおよそ一日に0.01ETHほど獲得できている模様です。年間10％は超えている感じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116164/e9ee36e2-bf18-0dd6-47d3-3b8bc7ccd0f1.png)
https://beaconscan.com/validator/0xb116bc717458ed58ee1c67ff434dc9284f21ee1c8b606177b35b1f05fff69a5123ca2f0f5464745addbe7acedeb18f81