Ethereum2.0のPrysmをインストールする


現在の Ethereum (1.0) に大幅な変更（Proof of Stake (PoS) やシャーディングなど）を加えた次世代 Ethereum。
開発コードネームは Serenity。

現在仕様の策定が行われている最中だが、ちょっと動くよ的な実装が出てきたので試してみよう。とりあえずインストールから。
複数の実装があるが、今回はPrysmをお試ししてみました。

Github仕様
https://github.com/ethereum/eth2.0-specs

# 開発のフェーズ

https://docs.ethhub.io/ethereum-roadmap/ethereum-2.0/eth-2.0-phases/

Ethereum2.0の開発は０〜２のフェーズに分けていて、フェーズ0はBeacon Chain.
フェーズ1はShard Chains、フェーズ2はState Executionと言っている。

フェーズ0Beacon ChainでPoSプロトコル対応、アテステーション、投票などを対応。
フェーズ1Shard Chainsでシャーディングにより負荷分散。
フェーズ2State ExecutionでVMがeWASMで動作するようになる。既存のコンパイラエコシステム(solcなど)が対応してくれるはず。

と言っている。（言っている）

# prysmとは

prysmは Prysmatic Labs が開発しているEthreum2.0ビーコンノードとバリデータークライアント。
(`a full featured sharding client for Ethereum 2.0` と謳っているよ。)
https://prysmaticlabs.com/

https://github.com/prysmaticlabs/prysm
https://prysmaticlabs.gitbook.io/prysm/how-prysm-works/basic-architecture-overview

とりあえずフェーズ0のtestnet用の実装ができたから試してみてよ！って雰囲気。

#  インストール＆セットアップ

この手順通りやればおｋ。
https://alpha.prylabs.net/participate

Dockerイメージが用意されていてインストールはすんなり終わる。その後、専用のネットワークでMetamaskと連携したり送金すればバリデータノードになれる模様。


## Docker pull

難しいことはない。pullするだけ。Dockerは入れておけよ。

```
~/tmp/kirameki
❯ docker pull gcr.io/prysmaticlabs/prysm/validator:sapphire
docker pull gcr.io/prysmaticlabs/prysm/beacon-chain:sapphire
sapphire: Pulling from prysmaticlabs/prysm/validator
07accba52567: Pull complete 
504c4248e1c7: Pull complete 
Digest: sha256:fce2b0d6b0a6d35a575f8f6b8b4eabb36b2cbd9f0131088d6caef65adc264e1a
Status: Downloaded newer image for gcr.io/prysmaticlabs/prysm/validator:sapphire
sapphire: Pulling from prysmaticlabs/prysm/beacon-chain
07accba52567: Already exists 
556f4a32d7b7: Pull complete 
Digest: sha256:5e0a81c3ad5221c1f2e9a2836e55c2d3dc93a6f5d81a62188822266f5da1daa2
Status: Downloaded newer image for gcr.io/prysmaticlabs/prysm/beacon-chain:sapphire

```


## Step1 Beacon Node 起動

run するだけ。

```
~/tmp/kirameki 7s                                                                                                                                                                     
❯ docker run -v /tmp/prysm-data:/data -p 4000:4000 \                                                                                                                                  
  gcr.io/prysmaticlabs/prysm/beacon-chain:latest \                                                                                                                                    
  --datadir=/data                                                                                                                                                                     
  --clear-db                                                                                                                                                                          
                                                                                                                                                                                      
Unable to find image 'gcr.io/prysmaticlabs/prysm/beacon-chain:latest' locally                                                                                                         
latest: Pulling from prysmaticlabs/prysm/beacon-chain                                                                                                                                 
07accba52567: Already exists                                                                                                                                                          
43df4a039f45: Pull complete                                                                                                                                                           
Digest: sha256:d9a59ad42cf5e29b5064e9e1600820d4cccd6cbdb4eec5f76b2b5d58c84c182a
Status: Downloaded newer image for gcr.io/prysmaticlabs/prysm/beacon-chain:latest
time="2019-06-11 06:47:09" level=info msg="Using custom parameter configuration" prefix=node
time="2019-06-11 06:47:09" level=info msg="Checking db" path="/data/beaconchaindata" prefix=node
time="2019-06-11 06:47:09" level=info msg="Fetching testnet cluster address" endpoint="https://beta.prylabs.net/contract" prefix=node
time="2019-06-11 06:47:11" level=info msg="Starting beacon node" prefix=node version="Git commit: d9ee55013d04dc7fd255cd1a981d6bdb4a24fa41. Built at: 2019-06-10 18:35:06+00:00"
time="2019-06-11 06:47:11" level=info msg="Starting 8 services: [*p2p.Server *powchain.Web3Service *attestation.Service *operations.Service *blockchain.ChainService *sync.Service *rp
c.Service *prometheus.Service]" prefix=registry
time="2019-06-11 06:47:11" level=info msg="Starting service" prefix=p2p
time="2019-06-11 06:47:11" level=info msg="Starting service" endpoint="wss://goerli.prylabs.net/websocket" prefix=powchain
time="2019-06-11 06:47:11" level=info msg="Starting service" prefix=attestation
time="2019-06-11 06:47:11" level=info msg="Starting service" prefix=operation
time="2019-06-11 06:47:11" level=info msg="Waiting for ChainStart log from the Validator Deposit Contract to start the beacon chain..." prefix=blockchain
time="2019-06-11 06:47:11" level=info msg="Starting service" prefix=sync
time="2019-06-11 06:47:11" level=info msg="Starting service" prefix=rpc
time="2019-06-11 06:47:11" level=info msg="Listening on port" port=4000 prefix=rpc
time="2019-06-11 06:47:11" level=warning msg="You are using an insecure gRPC connection! Provide a certificate and key to connect securely" prefix=rpc
time="2019-06-11 06:47:11" level=info msg="Starting service" endpoint=":8080" prefix=prometheus
time="2019-06-11 06:47:18" level=info msg="Minimum number of validators reached for beacon-chain to start" ChainStartTime=2019-05-28 12:46:00 +0000 UTC prefix=powchain
time="2019-06-11 06:47:18" level=info msg="ChainStart time reached, starting the beacon chain!" prefix=blockchain
time="2019-06-11 06:47:18" level=info msg="Validator activated" activationEpoch=0 index=0 prefix=validator
```


## Step2 MetaMaskにGoerli networkを追加

eth1.0の独自のtestnetを登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/a35848a8-e36c-fee2-81bb-1c0c2ac1a296.png)


https://goerli.prylabs.net をMetaMaskに登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/bc4534e8-379c-fffe-cd07-3c71259e01c3.png)

接続が確認できると次に進める。(エラーの場合、画面の下にメッセージが表示される。

そのままYesで進んでいく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/1567f528-602c-2512-4b62-99713a62b90a.png)

すぐに3.5ETHもらえているはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/d8b75ba9-9595-64ed-843d-c2d76425d455.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/5dfb85e5-dc97-39f8-8c6a-25f4bf2bb86e.png)


## Step3 バリデータノードの起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/be05ce81-a96b-dfd7-9285-02fd9a991cec.png)

```
~/tmp/kirameki
❯ docker run -it -v /tmp/prysm-data:/data \
   gcr.io/prysmaticlabs/prysm/validator:sapphire \
   accounts create --keystore-path=/data --password=KINGKINGKING
[2019-06-11 07:01:46]  INFO accounts: Keystore generated for shard withdrawals at path path=/data/shardwithdrawalkeya73a5986d39b
[2019-06-11 07:01:47]  INFO accounts: Keystore generated for validator signatures at path path=/data/validatorprivatekeyb1cd95b655be
[2019-06-11 07:01:47]  INFO accounts: Account creation complete! Copy and paste the deposit data shown below when issuing a transaction into the ETH1.0 deposit contract to activate your validator client

========================Deposit Data=======================

0xbc00000060000000b1cd95b655be658c7ecd319960fdd4afedd327bcc5789609ae948ed7216597a75e25b628bd7a857e0489b41877ae4ec3147d021d81183f5d91f955b26074be64b0612d0c7b102bf8c4c6028754ca10ef00086bf79d228bf9d41e24593d110dfb30000000962a786079790f488972562b4bfb7194c3e97ce8bf5dad77435b4ed70e4fd8bcedcea0dee3860c451347dddfe82367b32000000000ebe1c01e5c89dc2a796aa76567b2dc571805d9bd13a585a6a0ce1501e7eb86

===========================================================

```

起動するとDeposit Dataが出てくるのでそれをブラウザにコピペする。


## Step4 Beaconノードにつなぐようにバリデータの起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/f0831418-36c7-2f93-a98e-2dd3776ad81b.png)

ビーコンを起動したのとは別のターミナルでVaridatorを起動する。





```
~/tmp/kirameki
❯ docker run -it -v /tmp/prysm-data:/data --network="host" \
  gcr.io/prysmaticlabs/prysm/validator:sapphire \
  --beacon-rpc-provider=127.0.0.1:4000 \
  --keystore-path=/data \
  --password=KINGKINGKING
[2019-06-11 07:05:47]  INFO node: Using custom parameter configuration
[2019-06-11 07:05:47]  INFO node: Starting validator node version=Git commit: becd06553b860a7c24c19f43e5e8e1841c57479b. Built at: 2019-05-17 23:48:17+00:00
[2019-06-11 07:05:47]  INFO registry: Starting 2 services: [*prometheus.Service *client.ValidatorService]
[2019-06-11 07:05:47]  INFO prometheus: Starting service endpoint=:8080
[2019-06-11 07:05:47]  INFO validator: Initializing new validator service publicKey=0xb1cd95b655be658c7ecd319960fdd4afedd327bcc5789609ae948ed7216597a75e25b628bd7a857e0489b41877ae4ec3147d021d81183f5d91f955b26074be64b0612d0c7b102bf8c4c6028754ca10ef00086bf79d228bf9d41e24593d110dfb
[2019-06-11 07:05:47]  WARN validator: You are using an insecure gRPC connection! Please provide a certificate and key to use a secure connection.
[2019-06-11 07:05:47]  INFO validator: Successfully started gRPC connection
[2019-06-11 07:05:47]  INFO validator: Waiting for beacon chain start log from the ETH 1.0 deposit contract...
```




## Step5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/797fb0d9-aa93-3aec-7c0c-c96ad383f2d0.png)

デポジットしてねってことなので送金。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/e8daa85a-107c-050a-3a12-651843612fce.png)

## Step6

しばらく待てばアクティベーションされるから待ってな。とのことで待つ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/e6f26639-878d-e930-3195-8bb7d7a56e64.png)

statusがPENDING_ACTIVEに代わり、ACTIVEに変わる。

```
~snip;

[2019-06-11 07:12:20]  INFO validator: Waiting for validator to be activated in the beacon chain
[2019-06-11 07:12:20]  INFO validator: Not yet included in state... publicKey=0xb1cd95b655be658c7ecd3199 status=UNKNOWN_STATUS
[2019-06-11 07:12:27]  INFO validator: Waiting for validator to be activated in the beacon chain
[2019-06-11 07:12:27]  INFO validator: Waiting to be activated depositInclusionSlot=198235 positionInActivationQueue=1 publicKey=0xb1cd95b655be658c7ecd3199 status=PENDING_ACTIVE
[2019-06-11 07:12:33]  INFO validator: Waiting for validator to be activated in the beacon chain
[2019-06-11 07:12:33]  INFO validator: Waiting to be activated depositInclusionSlot=198235 positionInActivationQueue=1 publicKey=0xb1cd95b655be658c7ecd3199 status=PENDING_ACTIVE
[2019-06-11 07:12:39]  INFO validator: Waiting for validator to be activated in the beacon chain

~snip;

[2019-06-11 07:16:19]  INFO validator: Waiting to be activated depositInclusionSlot=198235 positionInActivationQueue=1 publicKey=0xb1cd95b655be658c7ecd3199 status=PENDING_ACTIVE
[2019-06-11 07:16:25]  INFO validator: Waiting for validator to be activated in the beacon chain
[2019-06-11 07:16:25]  INFO validator: Validator status activationEpoch=24788 depositInclusionSlot=198235 positionInActivationQueue=0 publicKey=0xb1cd95b655be658c7ecd3199 status=ACTIVE
[2019-06-11 07:16:25]  INFO validator: Validator activated publicKey=0xb1cd95b655be658c7ecd319960fdd4afedd327bcc5789609ae948ed7216597a75e25b628bd7a857e0489b41877ae4ec3147d021d81183f5
d91f955b26074be64b0612d0c7b102bf8c4c6028754ca10ef00086bf79d228bf9d41e24593d110dfb
[2019-06-11 07:16:25]  INFO validator: New assignment attesterSlot=198308 proposerSlot=Not proposing shard=0 status=ACTIVE validator=b1cd95b655be
[2019-06-11 07:16:25]  INFO validator: Updated validator assignments assignments=1

~snip;
```


# まとめ

とりあえず起動した。RPC等がすでに実装されているのかまでは見ていません。
gRPCだったりk8sで設定ファイルがあったりするみたいです。強いプロジェクトですね。
続きは長くなったのでまた次の機会に。