似たようなことを、もしかしたらやる方がいらっしゃるかもしれないのでなにかの参考になればと思いSymbol Harvest Summaryの実装において何をしているか、何を考えているかを記載します。
使い方の説明書や、コードの解説ではありません。ただし、後日ソースコードの一部を記事に載せる予定です。
何の機能を提供しているか?
- 前日のすべてのSymbolのブロック情報を取得し、
- その日のトランザクション数の合計とハーベストフィーの平均値を算出し、
- 算出した値を日々ツイートしています。
Symbolのブロック情報の取得
自分でノードを立てて、1ブロックずつAPIをforループで叩きまくる力技です。他の人のノードでこれをやるのは、迷惑かもしれないのでやめたほうがいいと思います。
理論上、30秒に1ブロックであれば1日のブロック数は2880で、上記例としてあげた2021年12月18日は2878ブロックとほぼ理論通りの値です。この程度であれば、一瞬とは言いませんがせいぜい数十秒~分のオーダーで終わるので今回は問題になりません。たまにサーバーが429エラーを吐きますが、待って再接続でOKです。
次項に記載のデータベースの最も高いブロックが前日取得した最後のデータです。その次のブロックから最新のブロックまでAPIを叩く処理を1日1回forループで回します。
取得したデータはjson形式なので、必要なデータを取り出してpandasを用いて整理していきます。(黄色背景を取得すればOK)
最後のブロックまで完了したら次のステップのためにCSVで一旦保存します。
取得したデータの保存
取得したデータは用が済んだら捨ててしまってもよいのですが、後々の分析に使うことも考えてデータベースに保存します。データベースは、リレーショナル型なら何でも良いですが、無料かつメジャーで使い慣れたPostgreSQLを用いています。本当は、データベースの定義などは公開しないほうが良いのでしょうが、この程度は問題ないでしょう。データベースへの保存は、速度を考え一度CSVに吐き出してからコピーコマンドで行います。
MongoDBからデータを直接取らない理由
少しSymbolのドキュメントを読んだ方であれば、Symbolのノードを建てたとき、データがMongoDBに保管されていることはご存知かと思います。当初、MongoDBからデータを読み込んで分析を行う手法を考えていましたが、結局うまくいかず断念しました。理由を以下に残します。
- MongoDBに接続できる設定にすると、データベースへのアクセスが外部から保護されず攻撃の対象となる。サーバー設定を適切に行えば解決するのだろうが、模索した結果見つけられなかった。
(参考:https://qiita.com/NEM_Harvest/items/54baa722ca39f3d96faf - NoSQLであるため集計などの処理に向かないが、このbotでは集計処理を行うことが多い。
集計処理
合計や平均を算出する処理はSQLで簡単に記載できます。WHERE区の範囲を日付で指定すれば、その日の合計や平均の出来上がりです。
ツイート処理
昔NEM Harvest Summary時代に作成したものをそのまま使いまわしています。レガシー資産なので詳細は触れません。新たにツイッターbotを作成する方は、色々と変わっている可能性が高いので調査から始めると良いと思います。
こだわり
ツイッターで情報を提供しているところです。
確かにダッシュボードを作れば見栄えが良いしより高度な機能を提供できす。
しかしそれでは多分マニアしか見ないと思うので、より多くの人に日々気軽に情報に触れてほしいなと思っています。