ブロックチェーンを使ったサービスデータを検索したい分析したい

Tomohiro Nakamura
catabira-japan
Published in
11 min readMay 9, 2019

こんにちは。catabiraでCTOをやっているTomo(Twitter: HAIL)です。発信を全然していなかったのでこれはまずいぞと、ちょこちょこ出していきます。

まずは僕から、ブロックチェーンのデータ分析に関するHow寄りの話です。ブロックチェーンを使ったサービスやゲームってちょこちょこ出てきてるけどそのデータを見るのってどうやるの? 実際どんなデータ取れんの? みたいな感じです。

そもそもブロックチェーンは検索や分析に向いていない

ブロックチェーンのデータを分析して製品開発などに活かしたい! と思ったときどうするでしょうか。たかだか数十のトランザクションを見れればいいのだったら、Etherscanのようなブロックチェーンエクスプローラのサイトに行って、一つ一つ検索してデータをスプレッドシートにコピペして……で済むかもしれませんが、数百、数千となってくるとそうもいきません。ではどうすればいいのでしょうか。

少し難しい話になりますが、ブロックチェーンは分散的に合意ができて、かつ非常に改ざんされづらいという特徴を大事にしているので、検索することや、データをまとめて分析することなどには向いていません。なにかを取ればなにかを失うのです。検索するなら ElasticSearch の方がデータソースとして適しているし、分析するなら BigQuery の方が優れています。

ブロックチェーンデータをコピーする

ではどうすればいいのかといえば話はシンプルで、目的に沿ったデータソースにブロックチェーン上のデータをコピーしてしまえば良いのです。先に述べたブロックチェーンエクスプローラのサービスなども、そのようにコピーを行ってサービスを提供しています。ブロックチェーンは「正しいデータ」として存在しているわけで、用途に応じて形を変えて使えば良いのです。データをコピーするのに必要なのは、ブロックチェーンのノードとデータをコピーするツールです。以下はEthereumを例に図にしたものです。

ブロックチェーンノードについては自分たちで運用することもできますが、例えば Ethereum であれば Infura, Ginco Nodes, AWS Managed Blockchain (後ろ2つは2019/5現在 Ethereum についてサービスが公開されていない)などの外部ノードを利用するのも手です。

ツールについては、実はOSSがいくつか存在します。Blockchain ETLTrueBlocks(QuickBlocks) などです。両者の詳細の説明はここでは控えて需要があれば別記事としますが、Blockchain ETLへは弊社catabiraも少し貢献しています。

しかしノードもツールもお膳立てされているとはいえ、エンジニアでない人がデータのコピーを生成することは容易ではありません。そこで BigQuery には Public Dataset として Bitcoin(bigquery-public-data:crypto_bitcoin) と Ethereum(bigquery-public-data:crypto_ethereum) などいくつかのブロックチェーンのデータが公開されていて、これらは先に述べた Blockchain ETL を用いて生成されています。

簡易的な分析であればこのように公共に用意されているデータベースを用いれば十分かもしれないので、自分や周りの人がBigQueryの環境を持っていれば是非試してみてください。参考のため、クエリを2つほど載せておきます。

エンタープライズ向け製品の必要性

しかし、BigQueryが公開されているとはいえ、用途に応じて違った形式でデータを見たいときもあるでしょうし、より細かくデータを見たいときもあるでしょうし、よりリアルタイムにデータが欲しいときもあるでしょう(公開されているデータは結構遅延があります)。

例えばAML(Anti Money Laundering: 資金洗浄の防止)を目的としていれば、Neo4jのようなグラフ型のデータベースを用いて、あるアドレスからあるアドレスにはいくつの取引を介すと繋がるのか、といった分析が欲しいかもしれません。例えばDapps運営者や競合製品を製作中の企業からすれば、BigQueryなどを用いた、どのスマートコントラクトのどの関数がどのように呼ばれていることが多いのだろうか、という分析が欲しいかもしれません。

繰り返しになりますが、これらはすべて、ブロックチェーン上で起きたトランザクションを分析するものです。しかしブロックチェーンに直接クエリを投げて分析するのは非常に効率が悪い。それに適したデータソースにコピーを行い分析を行ったほうが圧倒的に効率的ですし、「ブロックチェーンに詳しい人」「グラフの分析に詳しい人」「データをマーケティングに活かすのに詳しい人」と色々専門分野が人によって違うわけで、全ての人にブロックチェーンに詳しいことが求められるのはおかしい。

需要は細分化されるし、今後スケーラビリティを考慮してLayer 2でのトランザクションが増えていき技術も多様化していくことなどを考えると、全てがOSSや公共データベースにより解決されていくのではなく、データとブロックチェーン両方に強い企業によるエンタープライズ向け製品が登場していくだろうと思っています。

おまけ: ブロックチェーンデータ以外とジョインする

現在テストではなく実用で稼働しているブロックチェーンの多くはコストが高く、また処理できる量も十分とは言えません。そのため、ご存知のかたも多いと思いますがブロックチェーンの外の世界(RDBMS, IPFS, …)に一部の情報を保持していることが多い。 NFT(Non-Fungible Token)に利用されているEthereumの規格ERC721では、 tokenURI(uint256 _tokenId) external view returns (string) という関数が定義されています。これは、「トークンのIDを入力として、ブロックチェーンの外に書かれているそのトークンの情報が記述されているURIを返す」関数です。有名ブロックチェーンゲームであるMy Crypto Heroes(MCH)で試してみましょう。

Etherscanの、MCH Heroトークンのページに行ってみます。すると、 Read Contract というタブが見える。このタブではコントラクトに実装されている関数を実行することができます。

下の方に行くと、 tokenURI 関数が見つかるはずです。例えば以下のHeroのURI(URLと同じと思ってもらって良い)を取得してみましょう。

このIDを入力してクエリするとURIが示されるので、アクセスしてみるとJSON形式で以下の情報が返却されました。エンジニア以外の人はビビるかもしれませんがCSVと対して変わらないと思って見てみて欲しい 笑

{
"name": "MCH Hero: #100176912 Lv.4",
"description": "HeroName: MCH Warrior",
"image": "<https://www.mycryptoheroes.net/images/heroes/2000/10001.png>",
"attributes": {
"active_skill": "Rest",
"agi": 17,
"hero_name": "MCH Warrior",
"hp": 51,
"id": 100176912,
"int": 15,
"lv": 4,
"passive_skill": "Crypto Slash",
"phy": 19,
"rarity": "Unknown"
},
"external_url": "<https://www.mycryptoheroes.net/heroes/100176912>",
"image_url": "<https://www.mycryptoheroes.net/images/heroes/2000/10001.png>",
"home_url": "<https://www.mycryptoheroes.net>",
"extra_data": {
"active_skill_id": 2001,
"art_history": [

],
"current_art": "",
"current_stamina": 46,
"hero_type": 10001,
"max_stamina": 46,
"passive_skill_id": 1017
},
"timestamp": 1557380508
}

このヒーローのレベルがいくつで、HPがいくつで、スキルが何で、といったゲーム攻略上重要な情報が並んでいます。これらの情報が更新されるごとにすべてEthereumに書き込みを行っているとコストが高く、また処理が追いつかない可能性も高いためブロックチェーンの外でこれらの情報を持っているというわけです。この問題の解決方法はいくつか存在しますが、ここではその詳細について踏み込むことは控えます。

さて、現在ブロックチェーン上でトークンの取引がOpenSeaBazaaarなどのマーケットを介して行われているわけですが、例えば購入者の立場になってみたら、購入するしないや、価格はこれらのブロックチェーン外のデータも考慮して決定するはずです。先程のURLだと、そのトークンの「現在のパラメータ」は分かるが、「任意の時点、例えば取引が行われた時点でのパラメータ」は分からない。

それならば、それも含めて分析できるようなものを作ってみよう! と思って作ってみました。

トークンのtransfer(取引)が起こるたびに、 tokenURI にアクセスして情報を保存しておき、分析ができるサービスとも繋げてみました、というものです。

この仕組を使って、例えば Uncommon というレア度のHeroの、レベルと取引ETH価格の相関についてマッピングしてみました。レベルなどの情報は先程挙げたようにブロックチェーンの外にあり、取引ETHはブロックチェーン上にあります。そのままではバラバラの場所にあるこれらの情報を繋げて分析できるようにしたのが特徴です。

こちらはヒーロー名とその取引ETH価格の平均値のグラフです。 HimikoGenghis Khan George Washington などが高値で取引されていることが分かります。

技術革新は段々と起こっていくものだし、情報が散らばることは悪いことではありません。ただ、そのためにデータが分析しづらいという点は解決されるべきです。ブロックチェーンを使うことによって得があっても、損が多すぎると使われません。今まではTableauやLookerで簡単に分析できていたのに! となってしまうと良くない。このような仕組みが損を解決していけると良いと思っています。

次は多分、 Naochika Hanamura によるDAppsやNFTのマーケット分析についてです!技術よりもデータ寄りになると思うのでお楽しみに!

--

--