Docker上のUbuntu22でCatapultをビルドしたのでPeerとして起動させる

## 前回のお話し

https://qiita.com/ccHarvestasya/items/b49825cabc6691778b42

そしてまたまた、ココのほぼコピー…

https://github.com/symbol/symbol/blob/dev/client/catapult/docs/RUNPEERLIN.md

## ネットワーク構成のコピー

今回はテストネットを作成します。すでに`seed`ディレクトリにテストネットのネメシスブロック入ってますが、ジェネレーションハッシュが今のテストネット違ったので、おそらく古いものが入っているようです。なので、現在動いているテストネットノードからコピーしたのを使用します。

```bash
apt update
apt install unzip
```

```bash
cd /opt/symbol/client/catapult/_build
```

```bash
curl -OL https://github.com/ccHarvestasya/test-network-configuration/archive/refs/heads/main.zip
unzip main.zip
mv test-network-configuration-main/seed/ .
mv test-network-configuration-main/resources/* resources/
rm -rf main.zip test-network-configuration-main
```

## ノード情報の設定

ノード情報を設定するために`resources/config-node.properties`を編集します。
`host`に自 IP やドメインを設定。外からアクセスされたくない場合は、ドメインでもないような文字列を入力してください。（そもそもポート開けてませんけどね）
`friendlyName`はノードの説明というかノードの名前ですね。わかりやすい名前を付けてあげてください。

```resources/config-node.properties
[localnode]

host = <YOUR_NODE_IP>
friendlyName = <YOUR_FRIENDLY_NAME>
version =
roles = Peer
```

## ハーベストの設定

ハーベスト不要であれば`enableAutoHarvesting`を`false`にして、`harvesterSigningPrivateKey`、`harvesterVrfPrivateKey`、`beneficiaryAddress`を空にすれば良いです。

### ハーベスト用アカウントの作成

nodejs のインストールが必要なので面倒ですが、Symbol CLI を使用してアカウントを作成します。

#### NodeJS のインストール

##### Nodesource GPG キーのダウンロード＆インポート

```bash
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
```

##### deb リポジトリの作成

```bash
NODE_MAJOR=20
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
```

##### NodeJS インストール

```bash
apt update
apt install nodejs -y
npm install -g npm@latest
```

#### Symbol CLI でアカウントを作成

Symbol CLI をインストールします。

```bash
npm install -g symbol-cli
```

#### Symbol CLI の初期設定

```
# symbol-cli profile create
✔ Select the network type: › TEST_NET
✔ Enter the Symbol node URL. (Example: http://localhost:3000): … http://sym-test-01.opening-line.jp:3000
✔ Enter a profile name: … test-net
✔ Do you want to set the account as the default profile? … yes
✔ Select an import type: › PrivateKey
✔ Enter your wallet password: … ********
```

ここで出来たアカウントはメモっといてください。これはノードアカウントにしましょう。
[Faucet](https://testnet.symbol.tools/)から 10,000XYM 入金しておきます。

#### remote アカウント作成

```
# symbol-cli account generate
✔ Select the network type: › TEST_NET
✔ Do you want to save the account? … no
✔ Select an import type: › PrivateKey
```

メモる。

#### vrf アカウント作成

remote アカウントと同じ様にもう一つアカウントを作成しメモる。

#### config-harvesting.properties の編集

`harvesterSigningPrivateKey`に remote アカウント作成で作った秘密鍵を入力。
`harvesterVrfPrivateKey`に vrf アカウント作成で作った秘密鍵を入力。
`beneficiaryAddress`はハーベスト報酬が入るアドレス。最初に Symbol CLI の設定したときに出来たアカウントのアドレスを入力（ハイフンなし）。

```resources/config-harvesting.properties
[harvesting]

harvesterSigningPrivateKey = <HARVESTER_SIGNING_PRIVATE_KEY>
harvesterVrfPrivateKey = <HARVESTER_VRF_PRIVATE_KEY>

enableAutoHarvesting = true
maxUnlockedAccounts = 100
delegatePrioritizationPolicy = Importance
beneficiaryAddress = <BENEFICIARY_ADDRESS>
```

#### リモートとメインアカウントをリンク

```bash
symbol-cli transaction accountkeylink --action Link -u <PUBLIC-REMOTE-KEY> --sync
```

maximum fee は 100000 くらい入れておけばトランザクション飛びます。

#### VRF アカウントの設定

```bash
symbol-cli transaction vrfkeylink --action Link -u <PUBLIC-VRF-KEY> --sync
```

## 証明書の作成

symbol-node-configurator を使用して証明書を作成します。

必要なパッケージをインストール。

```
pip install symbol-sdk-python pyopenssl zenlog
```

symbol-node-configurator をインストール。新しい SymbolSDK を使用するカスタマイズ版です。

```
cd /opt
git clone https://github.com/ccHarvestasya/symbol-node-configurator.git
cd /opt/symbol/client/catapult/_build
```

本来なら下記のように OpenSSL で ca.key.pem を作成するのですが、今回は最初に Symbol CLI の設定したときに出来たアカウントの秘密鍵を使用します。

```bash
openssl genpkey -algorithm ed25519 -outform PEM -out ca.key.pem
```

`ca.key`というファイルに Symbol CLI の設定したときに出来たアカウントの秘密鍵を保存します。

```ca.key
2DE0B46CBF0367A513CE7DFF........................................
```

### pem ファイル作成

```bash
python3 /opt/symbol-node-configurator/pemtool.py --input ca.key --output ca.key.pem
```

`ca.key`は、もう必要ないので削除

```bash
rm ca.key
```

### ノード証明書作成

```bash
python3 /opt/symbol-node-configurator/certtool.py --working cert --name-ca "manual build peer CA" --name-node "manual build peer node name" --ca ca.key.pem
```

```bash
cat cert/node.crt.pem cert/ca.crt.pem | tee cert/node.full.crt.pem
```

## 各ディレクトリ設定の確認

特に変更する箇所はないですが、ここに設定ありますよ。

```resources/config-user.properties
[account]

enableDelegatedHarvestersAutoDetection = true

[storage]

seedDirectory = ../seed
certificateDirectory = ../cert
dataDirectory = ../data
pluginsDirectory = ../bin
votingKeysDirectory = ../votingkeys
```

## ノードの実行

```bash
mkdir data
cd bin
./catapult.server
```

Ctrl + C で終了します。
終了するまで時間が掛かる場合があるので、プロンプトが返ってくるまで待ちましょう。

もう一度 Ctrl + C すると即終了しますが、データが破損します。

常に動かしておきたいのであれば、`nohup ./catapult.server &`のようにしてログアウトしても起動し続けるようにすれば良いと思います。

## 参考にした記事

https://qiita.com/monakaJP/items/59cbcda9ecc72431c71f