はじめに
ロールにピアを持っているノードから REST を使わずに情報を取り出す。と、いうやつです。
Voting のみの場合などピアもってないノードの検証はしてません。テストネットにもないんですよ...
「SymbolピアノードとPythonで会話する」では/node/infoだけでしたが、/chain/info
、/node/peers
、/node/unlockedaccount
を追加で実装したものになります。
環境
Python3.9 以上
OpenSSL1.1.1 以上
Ubuntu22 なら標準で要件満たすと思います。
Windows でも上記をインストールすれば実行できます。
準備
必要な Python パッケージをインストール
sudo pip install symbol-sdk-python pyopenssl zenlog
ルートにインストールしたくない場合
pip install symbol-sdk-python pyopenssl zenlog --user
peer-tools と symbol-node-configurator をクローン
symbol-node-configurator が古い方の SymbolSDK 参照していたので、今のバージョンを見るようにインポート部分を変更してます。
git clone https://github.com/ccHarvestasya/peer-tools.git
git clone https://github.com/ccHarvestasya/symbol-node-configurator.git
CA プライベートキー生成
openssl を使用して CA プライベートキーを生成します。
cd peer-tools
openssl genpkey -algorithm ed25519 -outform PEM -out ca.key.pem
証明書の生成
symbol-node-configurator の certtool を使用してノードの証明書を作成します。
my cool CA
とかmy cool node name
の部分は、好きに変えて問題ないです。ただ、証明書を参照した際に見えるので、変なのにはしない方が良いです。
python3 ../symbol-node-configurator/certtool.py --working cert --name-ca "my cool CA" --name-node "my cool node name" --ca ca.key.pem
出来た証明書を連結します。
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 を許可すれば良いです。なお、複数指定したい場合は、カンマ区切りで記述します。
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 で出来るようになります。
追加で必要なパッケージをインストール
pip install flask waitress --user
Web サービスの起動
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