Symbolノードの接続関係を表示するnem2-peers-graphつくった


はじめに

カタパルトのRESTに/node/peersというエンドポイントができて、対応するAPIノードが他のどんなノードと接続しているのかがわかるようになった。

本家githubのv0.7.20にはそれが見つけられないが、

こちらにはあった

RESTは基本的にはmongoDBの情報を参照している。しかし、APIノードが接続している他ノードの情報は、mongoDBに書かれているとは思えない。

なのでこれは、ノードのがそういう機能を持っていて、RESTは直接ノードに問い合わせていると思った。

もしそうならば、APIノードでもPeerノードでも、接続しているノードの情報が取れるのではないか。

それが取れたら、ノード間の接続図なんかも作れそうだ。

作った

ノードの接続先情報を取得する

catapult-sdkを使う。catapult-sdkとは、catapult-restに同梱されているNodejsで作られたライブラリで、APIノードやPeerノードと直接やりとりすることができる。

これ単体ではnpmなどにパブリッシュされていないので、プロジェクト内に手動でコピーして利用する。

catapult-sdkの使い方はこちら

ここに、nodeDiscoveryPullPeersといういかにも、なワードがあるので、これを利用する。

できあがったのがこちら

できるだけ多くのノードから情報を取得したい

ノードの他ノード接続一覧が取得できるのだから、そこから芋づる式に情報を取得していけばよい。

再帰を使って、こんな感じになりました。

グラフを作る

vis.jsというのを使った。

ドキュメントによれば、

    var nodes = new vis.DataSet([
        {id: 1, label: 'Node 1'},
        {id: 2, label: 'Node 2'},
        {id: 3, label: 'Node 3'},
        {id: 4, label: 'Node 4'},
        {id: 5, label: 'Node 5'}
    ]);

    // create an array with edges
    var edges = new vis.DataSet([
        {from: 1, to: 3},
        {from: 1, to: 2},
        {from: 2, to: 4},
        {from: 2, to: 5}
    ]);

こんなデータを作って、

var network = new vis.Network(container, data, options);

こうすればいいらしい。

出来上がったのが、こちら

ノード一覧を作る

併せて、テーブル形式でノード一覧を表示したい。

テーブル表示ライブラリには、Tabulatorを使った。

地理情報を表示

ノードのIPから、地理情報を取得する。

これは、IP-API.comを使った。

次に、これをマップで表示したい。

amChartsを使った。

いい感じ。

その他

あとは、どのマシンで動かすか。

  • ノードの情報を取得するプログラム
  • vis.js用にデータを整形するプログラム
  • 地理情報を取得するプログラム
  • マップにデータを整形するプログラム

これらは、Azure Functionsで定期実行することにした。

Webサイトは、すべて静的とし、Azure BLOB Storageに配置した。

おわりに

こういうのは、すでに、いろんな人が、いろんなものを作っているので、特に目新しいわけではないけれど、作ってみたので、記事にしてみた。