こんにちは。ALIS CEOの安(@YasuMasahiro)です。
ALISブロックチェーンブログ、今回は指定したEOAのERC20トークンのトランザクション履歴を抽出する方法を共有する記事です。今回お送りするのは前編ですが、後編では実装方法や実装したlibraryの紹介も行う予定です。
前提として、ALISではプライベートブロックチェーンを用いてシステムを構築しております。詳細は下記ブログをご参照いただけると幸いです。
※余談ですが、本記事は社内のブロックチェーンエンジニア育成プログラムに参加し、ブロックチェーン技術の調査や習熟、実装をする過程でアウトプットしたものになります。CEOである私が参加している理由ですが、ブロックチェーンを扱う企業を標榜する以上、一定レベルの知識を有していないことが即ち会社の経営や意思決定に悪影響を与える可能性があるためです。例えば、中長期的な戦略を描く上で技術の動向や各技術の意味合いが全くわからない場合、果たして筋の良い戦略になりうるのでしょうか。加えて、単純にイケてない、という隠れた本音もあります。言うなればラーメン屋のTOPがラーメンの作り方を知らない、といった感覚でしょうか(笑)
さて、早速本題に入っていきましょう。
# アジェンダ
- トークントランザクション履歴実装の必要性と、実装イメージ
- 実装にあたって調査したことと、結局大部分を自前で実装せざるを得なかった理由
ALISでは記事が獲得したいいねやいいねを押したユーザへのトークン配布機能、および獲得したトークンを記事に対して投げる機能が実装されております。当然、その履歴をエクスポートするような機能をユーザに提供する必要があるため、今回そのデータをブロックチェーンから作成するというミッションの元、調査・作業を実施いたしました。パブリックチェーン上の履歴はetherscanなどで簡単に確認できますが、今回は独自のプライベートチェーン上の履歴ですので、クローズドソースであるetherscanは利用できません。
正直な話、実装する前はweb3でgetTransactionHistoryのようなファクションが用意されていて簡単に抽出できるか、公開されているlibraryを使えば楽に行けるだろうと踏んでいたのですが、思った以上に時間がかかったため、その辺りを共有できればと思います。(同時に石井がよく発言する「この業界はまだまだ発展途上」という言葉が身に沁みて感じられた経験でした・・・)
実装イメージは極めてシンプルです。
- トークントランザクション履歴を取得したいEOAを指定する
- 指定されたEOAが送受信したトークンに関して、From・To・送受信量・日時を一覧化して抽出する
まず、自前で実装するのは基本的に悪手だと思いますので、以下の内容を順に調査しました。
- web3のAPIで実装できないか
- web3にAPIがない場合、公開されているlibraryを使って実装できないか
結論、どちらも存在しないと判明しました(もし方法をご存知の方がいらっしゃれば是非ご連絡いただけると幸いです)。
まず、web3のAPIに当該の機能があるかどうか、については以下のthreadでのやりとりが参考になるかと思います。
https://github.com/ethereum/web3.js/issues/580
以下、コメント抽出&意訳
I am looking into this and still looks like there is no API for this.
(意訳)ずっとこの件について調べてるが、解決できるようなAPIはまだ無いように見えるね。
To add an API, the node itself would have to keep an indexed list of transactions per account. This would increase the data requirements on the node, which are already very onerous, dramatically. ... As the chain grows this would overwhelm the node and make decentralization more and more difficult. ... At least that's my guess. I'm not a core developer.
(意訳)APIを加えるためには、ノード自身がアカウント毎のトランザクションのindex listを保持する必要がある。それはノード毎のデータ量を増やすことになるんだけど、既に非常に煩わしいし劇的に増えてるよね。(中略)チェーンが成長するに従って、このlistの保持はただでさえ圧迫しているノードを更に圧迫することになる。(中略)少なくともそれが私の推測だね。
Also, just FYI. QuickBlocks provides a command line tool called getBlock which has an optional parameter called --addrs which along with a block number (or range) will list all addresses associated with that block. From this, you can build a filter to get transactions per account. It's open source.
(意訳)参考までに、QuickBlocksが提供しているコマンドラインツールの中のgetBlockを使うと、オプションとして--addrsに調べたいアドレスを指定することで、そのアドレスが関連するブロックだけをリストすることができるんだ。これを使うとアカウントごとのトランザクションを抽出するフィルターを作ることが可能だ。オープンソースだし使ってみてくれ。
Ethereumのようなアカウントベースのステート管理型のブロックチェーンの場合はその仕組み上、簡単にできそうな実装が意外とできない、ということを上記のプロセスを経て身をもって体感いたしました。だとするとビットコインのようなUTXOの場合、balance取得のためにhistoryをたどる必要性があるためアカウントベースで全履歴を一発で取得できるような機能がどこかに備わっているのでは?と思って調べてみたのですが、Bitcoin core JSON-RPC APIにlisttransactionsコマンドがあり、Ethereumよりも簡単にトランザクションリストが作成できるのではと思いました(が、未検証です。ここは宿題ですね。そのうち挙動を確認してみます)
参考: Mastering Bitcoin日本語訳版(https://bitcoinbook.info/wp-content/translations/ja/book.pdf)の10ページ
同時に、このような情報が日本語だと全くと言っていいほど落ちていない、というのも大きな課題であると感じました。
さて、上記のthread上には「独自実装しろ」という回答が多くあるため、だったら誰かが実装したものをlibraryとして提供しているだろうということで調べてみましたが、こちらも現状提供されているものは無しでした。
まず、下記のリンクからopen sourceのexplorerをピックアップし、githubの中を覗いてみました。
https://ethresear.ch/t/open-source-blockchain-explorers/1642
POAnetworkのexplorerは、下記を見る限りデータベースに一度データを格納した上で、改めて抽出する形で独自実装している模様。
https://github.com/poanetwork/blockscout/blob/master/apps/explorer/lib/explorer/etherscan.ex#L78-L99
個人の方も、以下のように独自実装している模様。
ちなみに、このあたりの調査も実際の作業時には非常に時間がかかった部分です。日本語のソースがなかなか無いのは先程お伝えした通りですが、英語のソースですらまともな情報がなかったり、あったとしても古かったりして参考にならずに非常に骨を折りました。
だったら、OSSのexplorerを使えばいいじゃないかという話もありますが、ツールが提供するリッチなUIや今回不要な情報を参照できる機能は今回実装したい「EOAのERC20トークンのトランザクション履歴を取得する」という課題に対してToo muchに感じており、シンプルにERC20に関するトランザクション履歴を作成するlibraryを探す・実装するという観点で見送っております。
※POAnetworkのblockscout(https://github.com/poanetwork/blockscout)が利用できそうなOSSでしたので、こちらは別途検証した結果を共有いたします。
結局、我々も独自実装するしかないという結論のもと、どう実装するかという検討に移ることになります。調査の中で名前が出ていたQuickblocksを利用して、誰でも利用できるようlibrary化することを前提に実装する方法を検討しました。
後編は近日中に公開いたしますのでお待ちいただけると幸いです!
・ALIS CEO 安(@YasuMasahiro)
・この記事は、運営による記事のためいいねによるトークン配布はありません
・この記事への投げ銭はBurnされます
・ALISではエンジニア・R&Dメンバー絶賛募集中です 😉