ピアノードの情報を調べるスクリプト

## はじめに

ロールにピアを持っているノードから REST を使わずに情報を取り出す。と、いうやつです。  
Voting のみの場合などピアもってないノードの検証はしてません。テストネットにもないんですよ...

「SymbolピアノードとPythonで会話する」では/node/infoだけでしたが、`/chain/info`、`/node/peers`、`/node/unlockedaccount`を追加で実装したものになります。

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

## 環境

Python3.9 以上  
OpenSSL1.1.1 以上

Ubuntu22 なら標準で要件満たすと思います。  
Windows でも上記をインストールすれば実行できます。

## 準備

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

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

ルートにインストールしたくない場合

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

## peer-tools と symbol-node-configurator をクローン

symbol-node-configurator が古い方の SymbolSDK 参照していたので、今のバージョンを見るようにインポート部分を変更してます。

https://github.com/ccHarvestasya/peer-tools.git

https://github.com/ccHarvestasya/symbol-node-configurator.git

```bash
git clone https://github.com/ccHarvestasya/peer-tools.git
git clone https://github.com/ccHarvestasya/symbol-node-configurator.git
```

## CA プライベートキー生成

openssl を使用して CA プライベートキーを生成します。

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

## 証明書の生成

symbol-node-configurator の certtool を使用してノードの証明書を作成します。  
`my cool CA`とか`my cool node name`の部分は、好きに変えて問題ないです。ただ、証明書を参照した際に見えるので、変なのにはしない方が良いです。

```bash
python3 ../symbol-node-configurator/certtool.py --working cert --name-ca "my cool CA" --name-node "my cool node name" --ca ca.key.pem
```

出来た証明書を連結します。

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

## ノードの設定

### trustedHosts

Unlockedaccount を取得するには、ノード側の設定が必要です。

- 実行するマシンの IP/Host をノードの trustedHosts に設定する必要があります（許可されたマシンにしか応答しません）。

- extension.diagnostics が有効になっている必要があります。

trustedHosts はカスタムプリセットに設定すれば良いかと思います。
空にすることで、全ての IP に対して有効となります  。が、セキュリティ的にひじょ～に良くないのでキチンと指定しましょう。
symbol-bootstrap がインストールされているマシン上での実行なら 172.20.0.1 を許可すれば良いです。なお、複数指定したい場合は、カンマ区切りで記述します。

```my-preset.yml
trustedHosts: 172.20.0.1
```

「どの IP を許可すれば分からないよ！！」という場合は、一度実行してみてノードログを見ましょう。
ignoring unknown packet of type Unlocked_Accounts を探し出して、表示されてる IP を許可すれば良いです。

```
<warning> (net::ChainedSocketReader.cpp@71) D4794B69B5683348F0A1BDF8ACF052CA84C2598E7050FDD9234789A9197FE6F2 @ 203.135.231.85 read completed with error: Malformed_Data
<warning> (ionet::SocketReader.cpp@75) D4794B69B5683348F0A1BDF8ACF052CA84C2598E7050FDD9234789A9197FE6F2 @ 203.135.231.85 ignoring unknown packet of type Unlocked_Accounts
<warning> (ionet::PacketHandlers.cpp@115) rejecting packet Unlocked_Accounts with size 8 from 203.135.231.85
```

上記では、IP は 203.135.231.85 という事が分かります。

### diagnostics の有効化

extension.diagnostics は symbol-bootstrap ならデフォルトで有効だと思います。  
(target/nodes/dhealth-peer-node/server-config/resources/config-extensions-server.properties にありま)

## 実行

出力は Json 形式にしました。Rest ゲートウェイが返すのを真似てます。  
たとえば、ローカルにあるノードの nodeInfo を取得する場合。

```
$ python3 peer_tools.py ni
{
  "version": 16777990,
  "publicKey": "7587ECE8D3FA11A075E533E83F2F1CC8E09F7D2E1D1BD547A44AC5D4D4C78242",
  "networkGenerationHashSeed": "49D6E1CE276A85B70EAFE52349AACCA389302E7A9754BCF1221E79494FC665A4",
  "roles": 1,
  "port": 7900,
  "networkIdentifier": 152,
  "host": "symbol02.harvestasya.com",
  "friendlyName": "_Symbol_TestNet_HarvestasyaNode02/.",
  "nodePublicKey": "5CFF56769EABA56315233552C849BA9FF6A72130F6AF802996C2EB0EA05AAD6F"
}
```

他コマンドはこのようになっています。

```
$ python3 peer_tools.py

peer_tools.py COMMAND [HOSTNAME] [PORT]

COMMANDS
  chainInfo                     /chain/info
  nodeInfo                      /node/info
  nodePeers                     /node/peers
  nodeUnlockedaccount           /node/unlockedaccount
HOSTNAME
  default: 127.0.0.1
PORT
  default: 7900
```

長ったらしいコマンドはキライなので、ci、ni、np、nu でも動くようにしています。

## ネット経由で見る

外出中もちゃんと動いているか確認したい事があると思うので、peer_tools の機能を Web から確認できるようにした`peer_simple_rest`を同梱しています。peer_tools と同じ機能が Rest と同じパスで使用できます。  
ピア単体でも委任が URL で出来るようになります。

https://x.com/dusanjp/status/1725762276245028939?s=20

### 追加で必要なパッケージをインストール

```bash
pip install flask waitress --user
```

### Web サービスの起動

```bash
nohup waitress-serve --port=3000 peer_simple_rest:app > waitress-serve.log 2>&1 &
```

バックグラウンドで起動します。3000 ポート解放を忘れずに。
終了は waitress-serve を kill して下さい。

```
$ ps -A | grep waitress-serve
 261858 ?        00:00:01 waitress-serve
$ kill 261858
```

### 確認

各自のドメインで以下のパスにアクセスしてください。

`/chain/info`  
`/node/info`  
`/node/peers`  
`/node/unlockedaccount`