catapult-service-bootstrapにpeer-nodeを追加する その１ サービス追加

# 概要

catapultを簡単に動かせる`catapult-service-bootstrap`というものがあります。

https://github.com/tech-bureau/catapult-service-bootstrap

これは、`docker-compose`で動かすことができます。

https://docs.docker.com/compose/

そして、`docker-compose.yml`に書いてある一つ一つのコンテナをサービスと呼びます。

`catapult-service-bootstrap`を動かすと、このようなコンテナが立ち上がります。

```bash
$ docker-compose ps
                          Name                                        Command               State            Ports         
---------------------------------------------------------------------------------------------------------------------------
catapult-service-bootstrap_api-node-0-nemgen_1        bash -c /bin-mount/wait /s ...   Exit 0                         
catapult-service-bootstrap_api-node-0_1               bash -c /bin-mount/wait /s ...   Up                             
catapult-service-bootstrap_db_1                       docker-entrypoint.sh bash  ...   Up       27017/tcp             
catapult-service-bootstrap_generate-configs_1         ash -c /bin-mount/wait /ad ...   Exit 0                         
catapult-service-bootstrap_generate-raw-addresses_1   bash -c /bin-mount/generat ...   Exit 0                         
catapult-service-bootstrap_init-db_1                  docker-entrypoint.sh bash  ...   Exit 1                         
catapult-service-bootstrap_peer-node-0-nemgen_1       bash -c /bin-mount/wait /s ...   Exit 0                         
catapult-service-bootstrap_peer-node-0_1              bash -c /bin-mount/wait /s ...   Up                             
catapult-service-bootstrap_peer-node-1-nemgen_1       bash -c /bin-mount/wait /s ...   Exit 0                         
catapult-service-bootstrap_peer-node-1_1              bash -c /bin-mount/wait /s ...   Up                             
catapult-service-bootstrap_rest-gateway_1             ash -c /bin-mount/wait /st ...   Up       0.0.0.0:3000->3000/tcp
catapult-service-bootstrap_store-addresses_1          ash -c /bin-mount/wait /ad ...   Exit 0                   
```

今回は、これに、新しいサービスとして、ピアノードを追加して行きたいと思います。名前は、`peer-node-2`にしましょう。

別サーバーでやる場合はこちら⇒[catapult-service-bootstrapにpeer-nodeを追加する その２ サーバー編](https://qiita.com/planethouki/items/4c73a6b924b92529bd32)

# 作業

## ファイル編集

```
cd build/catapult-config
cp -r peer-node-0 peer-node-2
cd peer-node-2/userconfig/resources
```

### config-harvesting.properties

`build/generated-addresses/addresses.yaml`を開き、`nemesis_addresses_harvesting`以下にあるアカウントの2番目の秘密鍵を設定します。（1番目は`peer-node-0`が使用しています。）

```config-harvesting.properties
harvestKey = <nemesis_addresses_harvesting private key>
```


### config-node.properties

`[localnode]`の箇所を変更します。

```config-node.properties
[localnode]

host = peer-node-2
friendlyName = peer-node-2
version = 0
roles = Peer
```

### config-user.properties

`build/generated-addresses/addresses.yaml`を開き、`peer_nodes`以下にあるアカウントの3番目の秘密鍵を設定します。（1番目は`peer-node-0`が、2番目は`peer-node-1`が使用しています。）

```config-user.properties
[account]
  
bootKey = <peer_nodes private key>
```

### peers-p2p.json

以下を`peer-node-1`の下に挿入します。カンマを忘れないで。

公開鍵は、`build/generated-addresses/addresses.yaml`を開き、`peer_nodes`以下にあるアカウントの3番目のやつ。


```peers-p2p.json
    {
      "publicKey": "<peer_nodes public key>",
      "endpoint": {
        "host": "peer-node-2",
        "port": 7900
      },
      "metadata": {
        "name": "peer-node-2",
        "roles": "Peer"
      }
    }
```

### docker-compose.yml

`docker-compose.yml`に以下を追記します。

```docker-compose.yml

  peer-node-2-nemgen:
    build: dockerfiles/nemgen
    command: bash -c "/bin-mount/wait /state/configs-generated && /bin/bash /userconfig/nemgen.sh && touch /state/peer-node-2-nemgen"
    stop_signal: SIGINT
    volumes:
    - ./build/nemesis/:/nemesis
    - ./data/peer-node-2:/data:rw
    - ./bin/bash:/bin-mount
    - ./build/state:/state:rw
    depends_on:
    - generate-configs

  peer-node-2:
    build: dockerfiles/catapult
    command: bash -c "/bin-mount/wait /state/peer-node-2-nemgen && /bin/bash /userconfig/startServer.sh"
    stop_signal: SIGINT
    volumes:
    - ./build/catapult-config/peer-node-2/userconfig/resources/:/userconfig/resources/
    - ./data/peer-node-2:/data:rw
    - ./bin/bash:/bin-mount
    - ./build/state:/state
    depends_on:
    - generate-configs
    - peer-node-2-nemgen
```

## 起動

```bash
$ docker-compose up -d peer-node-2
Starting catapult-service-bootstrap_generate-configs_1 ... done
Creating catapult-service-bootstrap_peer-node-2-nemgen_1 ... done
Creating catapult-service-bootstrap_peer-node-2_1        ... done
```

ログを確認。

ブロック同期に時間がかかります。

```
$ docker-compose logs -f --tail=100 peer-node-2
<debug> (chain::CompareChains.cpp@95) comparing chain scores: 78219980565058755 (local) vs 2339774398129255418 (remote) 
<debug> (chain::ChainSynchronizer.cpp@290) pulling blocks from remote with common height 7561 (fork depth = 0) 
<info> (chain::ChainSynchronizer.cpp@203) peer returned 360 blocks (heights 7562 - 7921) 
<debug> (disruptor::Disruptor.cpp@42) disruptor queuing element 22 (360 blocks (heights 7562 - 7921) [1A000000] from Remote_Pull) 
<info> (chain::RemoteApiForwarder.h@65) completed 'synchronizer task' (peer-node-0 @ peer-node-0) with result Success 
<debug> (utils::StackLogger.h@37) pushing scope 'PosImportanceCalculator::recalculate' 
<debug> (observers::PosImportanceCalculator.cpp@65) recalculated importances (22 / 25 eligible) 
<debug> (utils::StackLogger.h@47) popping scope 'PosImportanceCalculator::recalculate' (0ms) 
<info> (disruptor::ConsumerDispatcher.cpp@44) completing processing of element 22 (360 blocks (heights 7562 - 7921) [A2A9E8D6] from Remote_Pull), last consumer is 0 elements behind 
```

ブロック高と速度を計算して、必要なら寝ましょう。

わたしの環境では、およそ3秒で360ブロックでした。

## 確認

ブロックエクスプローラーを見てみます。

作業前は、このように、一人のHarvesterしかいませんでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/c7f16804-e430-2fc4-282a-b02e3eb0af48.png)

ハーベストするピアノードを追加したことにより、Harvesterが二人になりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/b572bb80-61cf-d401-b7ba-8b7ed8869727.png)


# 所感

`catapult-service-bootstrap`に、ピアノードを追加することができました。

追加するためには、いくつかのファイル編集を行う必要があります。

`peers-p2p.json`について、今回は`peer-node-2`のものだけ編集しました。しかし、ネットワークをより強固にするために、`peer-node-0`と`peer-node-1`、`api-node-0`に対して、同じようにしておくのが良いと思います。

理想的には、`docker-compose up -d --scale peer-node=10 api-node=3`みたいにできるようにすることです。しかし、それは大工事になりそうです。

別サーバーでやってみました⇒[catapult-service-bootstrapにpeer-nodeを追加する その２ サーバー編](https://qiita.com/planethouki/items/4c73a6b924b92529bd32)

# 関連記事

catapult-service-bootstrapにpeer-nodeを追加する その１ サービス追加
https://qiita.com/planethouki/items/b80fe29157d80a63122c

catapult-service-bootstrapにpeer-nodeを追加する その２ サーバー編
https://qiita.com/planethouki/items/4c73a6b924b92529bd32

catapult-service-bootstrap その３ ホスト名とポート変更
https://qiita.com/planethouki/items/d365f2344c0f7a6c3523

catapult-service-bootstrap その４ チェーンの手動削除
https://qiita.com/planethouki/items/7ec5404701adeb96bb8e

catapult-service-bootstrap その５ catapult.tools.health/network
https://qiita.com/planethouki/items/5ed19ae8ceb67ad6fee0