見出し画像

オンチェーン分析のすゝめ

こんにちは、Gussanです。

昨日、オンチェーン分析の勉強会を開きました。

来れなかった方にもぜひオンチェーン分析を取り組んでみていただきたいので、先日のイベントでお話しした内容を改めてまとめます。

今回のイベントの目的は下記3点でした。

  • オンチェーン分析とは何かを理解する

  • オンチェーン分析で何ができるのかを理解する

  • オンチェーン分析は全然難しくないことを理解する

オンチェーン分析自体はそこまで難しくないのですが、やはり多くの人が先入観を感じて門を叩けていない領域かと思っております。個人的には、オンチェーン分析はめちゃくちゃ楽しい領域なので、是非やってほしいです。

今回はオンチェーン分析の初心者向けの記事です。


オンチェーン分析とは

まずオンチェーン情報とはブロックチェーンに書き込まれている情報を指します。オンチェーンにはトークンなどのステート(状態)が記録されており、そのステートの変化をトランザクションにより規定しています。

そして、このトランザクションの累積をもとに、プロトコルの特性やマーケットの動向を洞察することをオンチェーン分析と言います。


例えば、私がWETHとUSDCをUniswapを使って交換する時に、私はWETHをUniswapのコントラクトに送付し、UniswapからUSDCを受け取ります。


これが1つのトランザクションで起こっており、WETHのステートはguss3.eth→Uniswap、USDCのステートはUniswap→guss3.ethに変わっています。当然この情報はExplorerを確認することができます。


こういったトランザクションが検証可能な情報としてブロックチェーンに保存されているため、アプリケーションを横断した情報を取得し、アプリケーションの特性を把握したり、マーケットの分析をすることができます。

オンチェーン分析の進め方

多くの方にとってのオンチェーン分析のやり方というのはツールの使い方ではなく、分析のやり方の方が壁になっている気がします。なのでオンチェーン分析の進め方というか単なる分析の進め方を書いていきます。

オンチェーン分析の流れは以下の通りです。

  1. 気になっていることを見つける

  2. 仮説を立てる

  3. 仮説検証に適したデータを用意する

  4. 仮説と事実を比較する

これの繰り返しです。結局1と2が本流です。

気になっていることを見つけるというのは些細なことでもいいです。

すごくオンチェーン分析に都合のいい仮説ばかりですが、例えば、以下のような疑問です。

  • 今盛り上がっているマーケットプレイスはどこだろう?

  • みんなが一番使ってるDEXはどこなんだろう?

  • エアドロってほんとに意味あるんだろう?

一つ目の「今盛り上がっているマーケットプレイスはどこだろう」という疑問を掘り下げる場合、仮説として「やはりOpenSeaがまだ強いだろう」というものを立てたとします。

ただ、これを分析するには盛り上がっているという表現が抽象的なので、盛り上げるを指標化するために定義をつけましょう。

盛り上がっている要素としては以下のような点が挙げられます。

  • 取引量

  • 取引額

  • アクティブユーザー数

  • 出品数

これらを総合的に判断してもいいですし、何かに絞ってもいいでしょう。ここは自分の決めの問題です。

さらに、"今"盛り上がっているの「今」はいつ頃を指すでしょうか

  • 直近7日間

  • 直近30日間

  • 直近90日間

  • 1年間

と様々ありますが、これも決めの問題です。ただ、クリプトの市場変化はとてつもなく早いので、マーケットの時間の速さとズレが生じるとあまり意味のない数字になってしまいます。

これらの条件を組み合わせて、自分の仮説を検証していきます。

実際には絶対的な取引量で見るのではなく伸び率を見るほうがいいかもしれない、もっと短い期間でデータを見たほうがいいかもしれないので、進めていく中で仮説検証をするための情報を変えていきましょう。このサイクルを地道にこなしていくことであなたの分析が進んでいきます。

オンチェーン分析の具体例

当日のイベントでは二つほど紹介しましたが、ここでは一つだけ紹介します。

Ethereum gas impact on the NFT market activity 🌊というガス代がNFTのマーケットに及ぼすインパクトを示すダッシュボードがあります。

仮説としてブロックチェーン上のガス代高くなったら、ユーザーの買いは抑止されるからNFTのアクティビティは減るというのが考えられます。

直近3ヶ月のトレード数とガス代の中央値の推移は下記のようなグラフです。ガス代が高騰したこと、すなわちトランザクションが混雑している状態なので取引は増えているので当たり前の相関はありますが、ガス代が高騰したことでアクティブが減っている訳ではなさそうです。

一方で、9ヶ月の期間で見ると、ガス代が高騰したタイミングからトレード数が減少している傾向にあります。この場合、もしかしたら、ガスの高騰がNFTのトレードを減少させた可能性があります。

このように情報の見方が変わると結果が変わってくる、なんてことが山のように起こってきます。ここに相関があるのかを真に調べるにはより細かいデータ分析をする必要が出てきますが、個人的には大枠を攫う分にはそこまで細かいデータ分析は必要ないかなと考えています。

少し脱線でイベントで話していない内容ですが、データを見るときに、相関関係と因果関係を見誤らないようにしましょう。

相関関係がある=因果関係があるわけではないです。

例えば、NFTの取引量が増えたからガス代が高騰したというのは因果関係がありそうです。なぜなら、ガス代はトランザクションの量によって決定するので、取引量が増えればブロックチェーンは混雑しますし、結果的にガス代は高騰します。NFTの取引量が原因でガス代高騰という結果は認められそうです。

一方で、NFTの取引額が増えたとガス代が高騰したには相関関係はありますが、因果関係はありません。取引量が増えるという事象が起こった時、ガス代も上がりますし、総取引額も増えます。なので、取引額が増えるとガス代が増えるとも一見いえますが、これは因果関係ではありません。すごく極端なことを言うと1000億のNFTが1回売れても、トランザクションは混雑しませんので、ここに因果はありません。

オンチェーン分析のツール

オンチェーンの分析ツールは色々ありますが、まずはBlockchain Explorerを見ましょう。オンチェーン分析のツールか?ともなりそうですが、オンチェーン分析はトランザクションの累積を分析することに等しいので、個別のトランザクションを見て、どういう情報がオンチェーンにあるのかを肌で感じるのはとても重要なことです。

とはいっても、具体的に分析をするにはExplorerではこと足りないので、以下のようなオンチェーン分析のツールを使います。

  • Dune

  • Arkham

  • Bubble Map

  • Nanasen

  • HyperArc

筆者は主にDuneを使っています。Dune最高です。Dune大好き。

Duneを使うメリットは主に3つあります。

  • SQLを使ってオンチェーンのDBを整形可能

  • 他の人が作ったデータも閲覧/参照可能

  • APIも豊富でデータ分析も汎用的に可能

汎用性もそうですが、ネットワーク効果が働くようなサービスデザインにしているあたりもWeb3を感じて好きです。

SQLというのはデータベースを操作するための言語で、データベースは表データ(テーブルデータ)のようなものです。表データに対してSQLを使って、フィルターをかけたり、グループに分けたり、四則演算を施したり、表データを結合させたりと、あらゆる操作をすることで自分の検証したいデータに整形していきます。

Duneの使い方

Duneを使うことで主に2つの方法でデータを調べることができます。

1つ目は他のユーザーが作ったものを参照する。これは、自分の気になっているプロトコルやdAppsを検索すれば出てきます。有名どころはおおよそ出てきますが、知られてないようなものや国内がメインのサービスはあまり出てこないです。


例えばMirrorを検索してみるとこのようなダッシュボードが見つかります。ダッシュボードは、いくつかのクエリと呼ばれるものによって構成されています。クエリは先ほどいったテーブルデータそのものです。ダッシュボードではテーブルデータを棒グラフや、円グラフなどにビジュアライズされたものが表示されることがほとんどです。

各クエリを選択すると、下記のような画面に遷移し、SQLのコードと結果が表示されています。このコードによってどのテーブルデータにどのような操作をして結果を出しているのかを見ることができます。

先ほどのコードは他のユーザーがすでに作っているもので自分が変更することはできませんが、右上のForkというのを選択すると、自分の編集権限下になり、自らSQLのコードを変更することができるようになります。


2つ目の方法は、自分で0から作ることです。先ほどの通り、誰も作ってないプロジェクトがごまんとあるので、それは作るしかありません。

左上のNew queryというのを選択すると新しいクエリを作成することができるので、ここでコードを書いていきます。

クエリの作成画面の構成は以下3つによって構成されています。

  • データセットの検索

  • SQLの記述部分

  • クエリの結果

自分が調べたいコントラクトやプロトコル、チェーンを検索にかけるとデータセットが出るのでそこを参照してSQLの記述をしていきます。SQLで整形されたテーブルデータの結果がクエリの結果に反映されるという流れです。

データセットに登録されていないコントラクトもあります。この場合は、Submit a contractというところからコントラクトをDuneに提出することで、データセットに入れることができます。(登録から承認まで1-2日くらいかかります。)

SQLの書き方

それでは、SQLを書いていきましょう。全ての関数に触れることは難しいので、基本のキの一画目くらいだけ触れます。

SELECT 列名 FROM テーブル名

あるテーブルから指定した列(カラム)ベースで参照する関数です。例えば、OpenSeaのすべてのトレードログを見るために下記のようなコードを書きます。

select * 
from opensea.trades

*を使うことで、そのテーブルのすべてのカラムを呼び出すことができます。これを実行すると下記のようなテーブルデータが出力されます。(全部を表示するとクソ重いので次で説明するlimitを使ってます。)

これでOpenSeaの全てのトレードログを参照することができました。

すべての情報を参照するといらない情報も多いので、カラム名を指定することで自分の欲しい情報だけを抽出することもできます。

select 
    seller,
    tx_hash,
    project_contract_address
from opensea.trades

LIMIT 数字

LIMITは、テーブルで表示する行数を制限することができる関数です。
OpenSeaの取引情報をすべて取得するとなると計算が非常に重くなるので、LIMITを使って出力を早くする時なんかに使います。

select * 
from opensea.trades
limit 100

WHERE 条件 /  OR 条件 / AND 条件

WHEREは特定の条件に絞る関数です。
例えばBAYCの取引のみを確認したい場合、下記のようなコードになります。

select 
    *
from opensea.trades
where nft_contract_address = 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D /*BAYCのコントラクトアドレス*/

結果、下記のようにBAYCに関する取引のみを抽出できます。

ここに複数の条件を設定する場合ORかANDを使います。違いは下記の通りです。

  • WHERE 条件① OR 条件②:条件①か条件②のどちらかを満たせばOK

  • WHERE 条件① AND 条件②::条件①か条件②の両方を満たせばOK

例えば、BAYCのアドレスの中でも2024年になってから取引されたもののみを抽出しようとした場合、下記のようなコードになります。

select 
    *
from opensea.trades
where nft_contract_address = 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D /*BAYCのコントラクトアドレス*/
and block_date > CAST('2024-01-01' AS DATE) 

castというのはデータ型を変更するための関数ですが、一旦気にしなくていいです。コードを実行すると下記のようなテーブルデータが得られます。

COUNT(カラム名) / SUM(カラム名) / GROUP BY カラム名

最後に集約関数です。集約関数はカラムに対して計算をする関数の総称です。集約関数には下記のようなものがあります。

  • COUNT:個数

  • SUM:合計値

  • AVG:平均値

  • MIN:最小値

  • MAX:最大値
    etc

例えば、BAYCの合計取引回数と合計取引総額を調べる場合、下記のようなコードを記述します。

SELECT
  count (tx_hash) as count_tx,
  sum(amount_usd) as trade_volume_usd
FROM opensea.trades
WHERE nft_contract_address = 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D 

すると以下のテーブルデータが取得できます。

これは過去の総取引についての結果ですが、加えて日毎に集計する場合は、GROUP BYという関数を使うことで結果を得ることができます。

下記のようなコードになります。

SELECT
  block_date,
  count (tx_hash) as count_tx,
  sum(amount_usd) as trade_volume_usd
FROM opensea.trades
WHERE nft_contract_address = 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D /* BAYCのコントラクトアドレス */
group by block_date
order by block_date asc

ORDER BYはデータを昇順あるいは降順に並べる関数で、日付を古い方から並べるために使っています。すると下記のような結果が得られました。

これで日付ごとの総取引量と総取引額がわかりましが。では最後にこの表だと直感的に分かりにくいので、New visualizationというところからグラフで表示してあげましょう。「Bar chart」で「Add visualizaion」を選択します。

すると、下記のような棒グラフが得られました。これはBAYCの取引量だけしか表示されてないので、取引額も一緒に表示してあげましょう。

棒グラフの下にオプションがあります。

下記の手順を踏むことで総取引額と総取引量を見やすく表示します。

  1. Y Column 2から取引額を選択

  2. Y-axis options→enable right y-axisをチェック

  3. 取引量か取引額いずれかのChart TypeをLine、Y-axisをLeftからRightに切り替える

最終的に下記のようなオプションの画面になります。

そして反映結果が以下のようなグラフです。

こんな感じでSQLを使って最終的にビジュアライズまでやって、自分の得たい情報を見つけていきます。

オンチェーン分析のTips

オンチェーン分析をやっていく中でいくつかのTipsを置いておきます。

  • 計算速度を上げる時は積極的にCreditを使おう

  • オンチェーン分析でお金を稼ぐ

    • DuneのDiscordでたまにbountyを開催している

  • わからないことがあったらDuneのDiscordで聞こう

    • 過去に同じことを聞いてる人のものをレコメンドしてくれる

  • 他の人のクエリを使う場合、Dune SQLが使われているかどうか確認

  • With…As( )をうまく使おう

    • 計算処理が速くなる

    • クエリが整理される

特にDuneの使い方がわからない人はDuneのDiscordで質問してくれるとちゃんと答えてくれるのでどんどん聞いてみるといいと思います。

また、計算が重いという人は、毎月Freeユーザーでも配布されるDuneのクレジットを使って計算を早くすることができるのでそれを惜しまず使っていくのと、With句のようなサブクエリを使うことで計算が早くなったりもしますのでオンチェーン分析で活発にやっている人のクエリを参考にしてみるといいと思います。

さいごに

イベントの中でお話しした内容をサクッとまとめました。

オンチェーン分析のツールを使うことは意外と難しくなくて、どちらかというと仮説を持つことの方が重要です。普段からdAppsを使う中でも日々仮説や疑問を持つことを意識しましょう。

また、オンチェーン分析をする時に何がオンチェーンにあって、何がオフチェーンなのかもしっかり理解しましょう。日頃からEtherscanを見る癖をつけましょう。

前回のイベントに続いて、Duneの使い方講座やみんなでオンチェーン分析をした結果を持ち寄って談義する会を開くのも面白いかなので、企画していこうかと思います。

といった感じで、オンチェーン分析のすゝめを締めます。

Twitter(X):@0xguss3

初心者向けオヌヌメ記事


この記事が気に入ったらサポートをしてみませんか?