Ethereum2.0のLighthouseをインストール

アドベントカレンダー用に書いた記事ではない&2.0の話ですが、スカスカだったのでいただきました。

Lighthouse はrustで書かれているEth2.0のノードやクライアントです。ビーコンチェーンノード、バリデーターノードなどがあるはず。動くのか知らないですけどインストールしてみようと思います。

Lighthouse WebSite
https://lighthouse.sigmaprime.io/

Github repo
https://github.com/sigp/lighthouse

Documents
http://lighthouse-book.sigmaprime.io/


# 環境作成

今回はFirewall, SELINUXを無効にしたcentos8で試します。`# LANG=C dnf group install 'Development Tools'` してあります。(GCCとかが入る)

[Development Environment Setup](http://lighthouse-book.sigmaprime.io/setup.html#development-environment-setup)
を参考に。

## rustを入れます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/ea4b3c0e-bad2-8eca-5363-707001ca628e.png)


https://www.rust-lang.org/tools/install
ここを参考に素直にいれました。

```bash

[root@eth2-node ~]# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
info: downloading installer


Welcome to Rust!

This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.

It will add the cargo, rustc, rustup and other commands to
Cargo's bin directory, located at:

  /root/.cargo/bin

This can be modified with the CARGO_HOME environment variable.

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  /root/.rustup

This can be modified with the RUSTUP_HOME environment variable.

This path will then be added to your PATH environment variable by
modifying the profile files located at:

  /root/.profile
/root/.bash_profile

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:


   default host triple: x86_64-unknown-linux-gnu
     default toolchain: stable
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>
info: profile set to 'default'
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: latest update on 2019-11-07, rust version 1.39.0 (4560ea788 2019-11-04)
info: downloading component 'cargo'

~snip;;;
```

`source $HOME/.cargo/env` を `~/.bashrc` に追記します。

```bash

[root@eth2-node ~]# echo 'source $HOME/.cargo/env' >> ~/.bashrc
```

PATHが通ってrustcが見つかればおｋですね。

```bash

[root@eth2-node ~]# source ~/.bashrc
[root@eth2-node ~]# rustc --version
rustc 1.39.0 (4560ea788 2019-11-04)
```

## `clang, protobuf, libssl-dev, cmake` を入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/164e9201-38cf-3d67-ce08-1c682d90a31e.png)


libssl-devはRHEL系だとopenssl-develになります。

```bash

[root@eth2-node ~]# dnf install clang-devel protobuf openssl-devel cmake
メタデータの期限切れの最終確認: 0:22:36 時間前の 2019年12月05日 12時43分46秒 に実施しました。
依存関係が解決しました。
===========================================================================================================================================================
 パッケージ                            アーキテクチャー         バージョン                                               リポジトリ                  サイズ
===========================================================================================================================================================
Installing:
 clang-devel                           x86_64                   7.0.1-1.module_el8.0.0+12+30b38a9a                       AppStream                   1.7 M 
 cmake                                 x86_64                   3.11.4-3.el8                                             AppStream                   8.2 M 
 protobuf                              x86_64                   3.5.0-7.el8                                              AppStream                   901 k 
 openssl-devel                         x86_64                   1:1.1.1-8.el8                                            BaseOS                      2.3 M 
依存関係をインストール中:
 clang                                 x86_64                   7.0.1-1.module_el8.0.0+12+30b38a9a                       AppStream                   723 k 
 clang-libs                            x86_64                   7.0.1-1.module_el8.0.0+12+30b38a9a                       AppStream                    16 M 
 clang-tools-extra                     x86_64                   7.0.1-1.module_el8.0.0+12+30b38a9a                       AppStream                   449 k 
 cmake-data                            noarch                   3.11.4-3.el8                                             AppStream                   1.3 M 
 cmake-filesystem                      x86_64                   3.11.4-3.el8                                             AppStream                    40 k 
 cmake-rpm-macros                      noarch                   3.11.4-3.el8                                             AppStream                    39 k 
 libuv                                 x86_64                   1:1.23.1-1.el8                                           AppStream                   134 k 
 llvm-libs                             x86_64                   7.0.1-3.module_el8.0.0+176+9dc62ab1                      AppStream                    17 M 
 keyutils-libs-devel                   x86_64                   1.5.10-6.el8                                             BaseOS                       48 k 
 krb5-devel                            x86_64                   1.16.1-22.el8                                            BaseOS                      546 k 
 libatomic                             x86_64                   8.2.1-3.5.el8                                            BaseOS                       20 k 
 libcom_err-devel                      x86_64                   1.44.3-2.el8                                             BaseOS                       37 k 
 libkadm5                              x86_64                   1.16.1-22.el8                                            BaseOS                      184 k 
 libselinux-devel                      x86_64                   2.8-6.el8                                                BaseOS                      199 k 
 libsepol-devel                        x86_64                   2.8-2.el8                                                BaseOS                       85 k 
 libverto-devel                        x86_64                   0.3.0-5.el8                                              BaseOS                       18 k 
 pcre2-devel                           x86_64                   10.32-1.el8                                              BaseOS                      605 k 
 pcre2-utf16                           x86_64                   10.32-1.el8                                              BaseOS                      228 k 
 pcre2-utf32                           x86_64                   10.32-1.el8                                              BaseOS                      220 k 
 zlib-devel                            x86_64                   1.2.11-10.el8                                            BaseOS                       56 k 
弱い依存関係をインストール中:
 compiler-rt                           x86_64                   7.0.1-1.module_el8.0.0+12+30b38a9a                       AppStream                   2.8 M 
 libomp                                x86_64                   7.0.1-1.module_el8.0.0+12+30b38a9a                       AppStream                   317 k 
Enabling module streams:
 llvm-toolset                                                   rhel8

トランザクションの概要
===========================================================================================================================================================
インストール  26 パッケージ

ダウンロードサイズの合計: 54 M
インストール済みのサイズ: 277 M
これでよろしいですか? [y/N]:

~~snip;
```
 

## リポジトリ持ってきてmake

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/c86a0ddf-55d7-9bc2-fe91-e1fc6a4b9bba.png)


```bash

[root@eth2-node ~]# git clone https://github.com/sigp/lighthouse.git
Cloning into 'lighthouse'...
remote: Enumerating objects: 218, done.
remote: Counting objects: 100% (218/218), done.
remote: Compressing objects: 100% (147/147), done.
remote: Total 33669 (delta 95), reused 150 (delta 66), pack-reused 33451
Receiving objects: 100% (33669/33669), 7.87 MiB | 5.71 MiB/s, done.
Resolving deltas: 100% (21745/21745), done.
[root@eth2-node ~]# cd lighthouse/
[root@eth2-node lighthouse]# ll
合計 36
-rw-r--r--  1 root root  5264 12月  5 13:09 CONTRIBUTING.md
-rw-r--r--  1 root root  1679 12月  5 13:09 Cargo.toml
-rw-r--r--  1 root root    62 12月  5 13:09 Dockerfile
-rw-r--r--  1 root root 11349 12月  5 13:09 LICENSE
-rw-r--r--  1 root root  1524 12月  5 13:09 Makefile
-rw-r--r--  1 root root  3638 12月  5 13:09 README.md
drwxr-xr-x  3 root root    52 12月  5 13:09 account_manager
drwxr-xr-x 14 root root   211 12月  5 13:09 beacon_node
drwxr-xr-x  3 root root    69 12月  5 13:09 book
drwxr-xr-x  7 root root   112 12月  5 13:09 eth2
drwxr-xr-x  3 root root    70 12月  5 13:09 lcli
drwxr-xr-x  4 root root    54 12月  5 13:09 lighthouse
drwxr-xr-x  2 root root    61 12月  5 13:09 scripts
drwxr-xr-x  6 root root    88 12月  5 13:09 tests
drwxr-xr-x  3 root root    52 12月  5 13:09 validator_client
```


make 

```bash

[root@eth2-node lighthouse]# make
cargo install --path lighthouse --force
  Installing lighthouse v0.1.0 (/root/lighthouse/lighthouse)
    Updating crates.io index
    Updating git repository `https://github.com/sigp/milagro_bls`
    Updating git repository `https://github.com/SigP/rust-libp2p/`
    Updating git repository `https://github.com/SigP/libsecp256k1`
  Downloaded ctrlc v3.1.3
  Downloaded bigint v4.4.1
  Downloaded slog v2.5.2
  Downloaded reqwest v0.9.22
  Downloaded arrayref v0.3.5

~~snip;




   Compiling client v0.1.0 (/root/lighthouse/beacon_node/client)
   Compiling validator_client v0.1.0 (/root/lighthouse/validator_client)
   Compiling beacon_node v0.1.0 (/root/lighthouse/beacon_node)
   Compiling account_manager v0.0.1 (/root/lighthouse/account_manager)
   Compiling lighthouse v0.1.0 (/root/lighthouse/lighthouse)
    Finished release [optimized] target(s) in 13m 33s
  Installing /root/.cargo/bin/lighthouse
   Installed package `lighthouse v0.1.0 (/root/lighthouse/lighthouse)` (executable `lighthouse`)
[root@eth2-node lighthouse]#
```

make testは割愛。（良い子のみんなはするんだぞ。）
http://lighthouse-book.sigmaprime.io/setup.html

インストールされてた。

```bash

[root@eth2-node lighthouse]# lighthouse --version
Lighthouse 0.1.0
```


# ノードの起動

http://lighthouse-book.sigmaprime.io/testnets.html

ビーコンチェーンノードとバリデーターノードを試せる。
まだpublic testnetはないみたいなのでローカルだけになる。
https://lighthouse.sigmaprime.io/update-18.html


## ビーコンチェーンノード

beacon-chain nodeから。

http://lighthouse-book.sigmaprime.io/testnets.html#examples を参考にビーコンノードから。<GENESIS_TIME>は適当なunix timestampを。

```bash

[root@eth2-node ~]# lighthouse bn testnet -f quick 8 1575520375
Dec 05 13:36:24.669 WARN Ethereum 2.0 is pre-release. This software is experimental.
Dec 05 13:36:24.801 WARN Block production impaired               reason: dummy eth1 backend is enabled
Dec 05 13:36:24.802 INFO WebSocket server started                port: 5053, address: 127.0.0.1, service: ws
Dec 05 13:36:24.804 INFO Beacon chain initialized                head_slot: 0, head_block: 0xe9a4…4e0a, head_state: 0xb44d…0c15, service: beacon
Dec 05 13:36:24.805 INFO Libp2p Service                          peer_id: PeerId("16Uiu2HAmCgTUy1vA4RuyTBU3mJYCu8QPL728KSRmXBoyj88yGhfa"), service: network
Dec 05 13:36:24.805 INFO ENR Initialised                         seq: 1, enr: enr:-Iu4QGZHp-y2I_J6zv2IOiEzdmCgb1X2XbQR1e-oJ-whuf_bHYccHfCLEmPt370J1scFWxAOcbP_A8ZOKDejwyy
m96QBgmlkgnY0gmlwhAAAAACJc2VjcDI1NmsxoQMAYEJsMacFIeOCxxZ-LObiRWbReXwyp8PgZTQTwE5SVYN0Y3CCIyiDdWRwgiMo, service: network
Dec 05 13:36:24.815 INFO Listening established                   address: /ip4/0.0.0.0/tcp/9000/p2p/16Uiu2HAmCgTUy1vA4RuyTBU3mJYCu8QPL728KSRmXBoyj88yGhfa, service: netwo
rk
Dec 05 13:36:24.815 INFO Subscribed to topics                    topics: ["/eth2/beacon_block/ssz", "/eth2/beacon_attestation/ssz", "/eth2/voluntary_exit/ssz", "/eth2/pr
oposer_slashing/ssz", "/eth2/attester_slashing/ssz"], service: network
Dec 05 13:36:24.815 INFO REST API started                        port: 5052, address: 127.0.0.1, service: http
Dec 05 13:36:24.816 INFO ENR Updated                             address: V4(127.0.0.1:9000), seq: 2, enr: enr:-Iu4QCdgyV6DLzq29ThlHaXPn4bj5ROQY4dIuCyaw5yzLWZiX6FLYgSYsS
gkYkbwe32Iz2rSThGfGZQRaemwxf1qhrUCgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQMAYEJsMacFIeOCxxZ-LObiRWbReXwyp8PgZTQTwE5SVYN0Y3CCIyiDdWRwgiMo, service: network
Dec 05 13:36:24.817 WARN Low peer count                          peer_count: 0, service: peer_notifier
Dec 05 13:36:25.001 INFO Slot start                              slot: 35, best_block_slot: 0, best_block_root: 0xe9a4…4e0a, skip_slots: 35, service: slot_notifier      
Dec 05 13:36:31.002 INFO Slot start                              slot: 36, best_block_slot: 0, best_block_root: 0xe9a4…4e0a, skip_slots: 36, service: slot_notifier      
```

うーん。ピアがいないからいまいち。


## バリデーターノード

ビーコンのほうを起動したままにしておくこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/1e1c4703-eb4b-63ab-0608-def6fd004ef3.png)

-bを付けるとこんなんでた。-b消したら動いたけどなんなんだろう？

```
[root@eth2-node ~]#  lighthouse vc testnet -b insecure 0 8
error: Found argument '-b' which wasn't expected, or isn't valid in this context

USAGE:
    lighthouse validator_client testnet [OPTIONS] [SUBCOMMAND]

For more information try --help
```

```
[root@eth2-node ~]#  lighthouse vc testnet insecure 0 8
Dec 05 13:46:33.519 WARN Ethereum 2.0 is pre-release. This software is experimental.
Dec 05 13:46:33.519 INFO Starting validator client               datadir: "/root/.lighthouse/validators", beacon_node: http://localhost:5052/
Dec 05 13:46:33.535 INFO Connected to beacon node                version: Lighthouse/v0.1.0-unstable/x86_64-linux
Dec 05 13:46:33.537 INFO Genesis has already occurred            seconds_ago: 818
Dec 05 13:46:33.554 INFO Loaded validator keypair store          voting_validators: 8
Dec 05 13:46:33.572 INFO First duty assignment for validator     validator: 0x0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78
c27d373, attestation_slot: Some(Slot(136)), proposal_slots: [Slot(142)], service: duties
Dec 05 13:46:33.572 INFO First duty assignment for validator     validator: 0x0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1
a874a0b, attestation_slot: Some(Slot(138)), proposal_slots: [], service: duties
Dec 05 13:46:33.572 INFO First duty assignment for validator     validator: 0x0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80c
a5a4a5e, attestation_slot: Some(Slot(140)), proposal_slots: [Slot(137), Slot(141)], service: duties
Dec 05 13:46:33.572 INFO First duty assignment for validator     validator: 0x0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733b
f7e4a9b, attestation_slot: Some(Slot(141)), proposal_slots: [], service: duties
Dec 05 13:46:33.573 INFO First duty assignment for validator     validator: 0x0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b1
0a72a34, attestation_slot: Some(Slot(137)), proposal_slots: [Slot(138), Slot(143)], service: duties
Dec 05 13:46:33.573 INFO First duty assignment for validator     validator: 0x0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94
a38e44c, attestation_slot: Some(Slot(143)), proposal_slots: [], service: duties
Dec 05 13:46:33.573 INFO First duty assignment for validator     validator: 0x0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8
cbab8ac, attestation_slot: Some(Slot(142)), proposal_slots: [], service: duties
Dec 05 13:46:33.573 INFO First duty assignment for validator     validator: 0x0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4
d8f532e, attestation_slot: Some(Slot(139)), proposal_slots: [Slot(136), Slot(139), Slot(140)], service: duties
Dec 05 13:46:37.278 INFO Successfully published block            slot: 137, attestations: 0, deposits: 0, service: block
Dec 05 13:46:39.031 INFO Successfully published attestation      slot: 137, committee_index: 0, head_block: 0xf8d0…0aef, signatures: 1, service: attestation
Dec 05 13:46:43.192 INFO Successfully published block            slot: 138, attestations: 1, deposits: 0, service: block
Dec 05 13:46:45.026 INFO Successfully published attestation      slot: 138, committee_index: 0, head_block: 0xf328…d3f4, signatures: 1, service: attestation
Dec 05 13:46:49.195 INFO Successfully published block            slot: 139, attestations: 1, deposits: 0, service: block
```

genesis fileを出しておく。

```
[root@eth2-node ~]# curl --header "Content-Type: application/ssz" "localhost:5052/beacon/state/genesis" -o /tmp/genesis.ssz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed  
100 17948  100 17948    0     0  2190k      0 --:--:-- --:--:-- --:--:-- 2503k 
```


# REST APIお試し。

http://lighthouse-book.sigmaprime.io/http.html にいくつかサンプルがあったので試してみる。

`Get the node's beacon chain head`

```json

[root@eth2-node ~]# curl localhost:5052/beacon/head | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   533  100   533    0     0   173k      0 --:--:-- --:--:-- --:--:--  260k
{
  "slot": 181,
  "block_root": "0x2bd503e5384774a3a3620ff089affcc58a7c0bfddc0e904c1630310a8c4b35db",
  "state_root": "0x74d85cd9157a4b6c767a8d2068110847f1a624b6e6eb629cbe211f83f765c041",
  "finalized_slot": 160,
  "finalized_block_root": "0xd8a4fe03a81e9c49219e2feb4663bc045057e24273b992ce8df2b8573753d0bb",
  "justified_slot": 168,
  "justified_block_root": "0xdf4a3e0c8619bad65ee10fcbc800e78aaacfbd980e06cc3b89fc02724a2fc014",
  "previous_justified_slot": 160,
  "previous_justified_block_root": "0xd8a4fe03a81e9c49219e2feb4663bc045057e24273b992ce8df2b8573753d0bb"
}
```

https://app.swaggerhub.com/apis-docs/spble/lighthouse_rest_api/0.2.0 からいくつか。

node version

```
[root@eth2-node ~]# curl localhost:5052/node/version
"Lighthouse/v0.1.0-unstable/x86_64-linux"[root@eth2-node ~]# curl localhost:5052/node/version | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    41  100    41    0     0  13666      0 --:--:-- --:--:-- --:--:-- 20500
"Lighthouse/v0.1.0-unstable/x86_64-linux"
```

syncingはまだ未実装

```
[root@eth2-node ~]# curl localhost:5052/node/syncing
API endpoint has not yet been implemented, but is planned to be soon.
```

block

```json

[root@eth2-node ~]# curl localhost:5052/beacon/block?slot=234 | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1631  100  1631    0     0   530k      0 --:--:-- --:--:-- --:--:--  530k
{
  "root": "0x08d76e0e21159460de606fb77f28531cbe087dd1a55cd3b812cfe717b93830eb",
  "beacon_block": {
    "slot": 234,
    "parent_root": "0x1d2ba88743ac8c7be604e5b0ff8ec887539f9332f2e567ac47272ed19a8fb83b",
    "state_root": "0x6c881eee4f40dde894ae8957c9d2c511b0310e5ddfcd11d7c1d853349237d1c7",
    "body": {
      "randao_reveal": "0x977a8ab5cc1f1608d5a1967032cac875e5e2e9ac22502810bbe5624d3557b6be6167d1d53d44d75af94833f159ac3c301410e5d5b1c080b4a23303d61d5bd60579d1bbb1e4fcc48
9ae1a4737e9add03d9b22cb623a3123ef6eb965b7e65ec1b3",
      "eth1_data": {
        "deposit_root": "0x01d0fabd251fcbbe2b93b4b927b26ad2a1a99077152e45ded1e678afa45dbec5",
        "deposit_count": 8,
        "block_hash": "0x7e59998584f83454a4095c90006b277c31ec7b447fee44f88bf57f10edf5ab14"
      },
      "graffiti": "0x736967702f6c69676874686f7573652d302e302e302d70726572656c65617365",
      "proposer_slashings": [],
      "attester_slashings": [],
      "attestations": [
        {
          "aggregation_bits": "0x03",
          "data": {
            "slot": 233,
            "index": 0,
            "beacon_block_root": "0x1d2ba88743ac8c7be604e5b0ff8ec887539f9332f2e567ac47272ed19a8fb83b",
            "source": {
              "epoch": 28,
              "root": "0x718a11c989db53200946d940af705057b9747f6d68bb45b45aac3a1dcc0ecf74"
            },
            "target": {
              "epoch": 29,
              "root": "0x85028c87044b3d0ce4856968c3c5d093f4d91dbdd320740814b1bc88b39e3e94"
            }
          },
          "signature": "0x9555878de9af5f424ca508df22bc707e2038f2180ed3bc125d96630994cc5c05c432c18f50562eb4915a104cc22ec3d607c6ca7b892699ebb0a67f66984d77d07dcfd00e701ee8c
5be514cc34b77c55659c2cda5512149f1c87073eb2d461c0e"
        }
      ],
      "deposits": [],
      "voluntary_exits": []
    },
    "signature": "0xa4531ed5215f5339f21a8f689eb8c71580958137fa17faf12bcc0d87fcaf1c7a4314283b5b7493e3bde22ec5b1eda29005ff38e5f13c62a0d50ef29c0c344bc7547e8008641c69c3903d6
26bd62285016f8928d0064efc0ba4fbfc74d7028841"
  }
}
```


# まとめ

Public Testnetが動き出したら試せることが増えそうなので面白くなりそう。
普通の人（？）はまだ手を出さなくてもいいんじゃないですかね。
すんなり動いてよかった。