📈

オンチェーン解析ツールDuneの始め方・使い方

Web3(ブロックチェーン)の魅力の1つ"透明性"

web3(ブロックチェーン)の世界は、全ての行動がトランザクションとして記録され、アカウントを起点にどのように行動したのかが誰でも自由に確認することができる"透明性"を持っている。

オンチェーンを解析するツール

Etherscan

最も簡単にオンチェーンの情報を確認することができます。誰から誰にOOETH移動したとか、誰が残高OOETH持ってるとかの情報を簡単にみることができます。

https://etherscan.io/

Opensea

主にNFTに関する基本的な情報をみることができる

  • NFTの売買の履歴
  • NFTのホルダー情報と持ってるNFTの量
  • ホルダーの移動履歴

    https://opensea.io/ja

Dune

EtherscanやOpenseaよりも自由にカスタマイズして分析することができる

  • オンチェーンの全てのイベントから分析できる
  • 棒グラフや円グラフといったグラフ化が簡単

    https://dune.com/

Duneについてもう少し詳しく

Duneはノルウェーのドゥーン・アナリティクスという企業が開発・提供しているブロックチェーン分析ツール。SQLを使うことで比較的簡単に、自分好みのオンチェーン解析を行うことができ、公開することができます。
https://dune.com/

DuneのためのSQL文法 <初級>

SQLとは何か?

SQLはデータベース言語の一つで、ISO(国際標準化機構)で規格が標準化されていることもあり、データベースを扱う上で基礎となる言語になります。

SQLの基本文法① FROM

FROMというのはデータ元がどこであるかを伝えるものになります。FROMの後ろにメインとなるデータベースの情報を追加することで、「ここからデータを取ってきます」ということを伝えます。

SELECT * FROM データ元
LIMIT 10

実際のコード

SELECT * FROM aave."LendingPool_evt_Deposit"
LIMIT 10

SQLの基本文法② LIMIT

メインのDBから何件データを取得するかを指定するのに使用するのが、LIMITになります。直近100件の情報を取得したいときや、上位10位までの情報を取得したいときなどに使用します。

SELECT * FROM データ元
LIMIT 10

実際のコード

SELECT * FROM aave."LendingPool_evt_Deposit"
LIMIT 10

SQLの基本文法③ WHERE

特定のデータのカラムに対してフィルターをかけたいときに使用します。

SELECT * FROM データ元
WHERE _user = '0x00...'
LIMIT 10

実際のコード

SELECT * FROM aave."LendingPool_evt_Deposit"
WHERE _user = '\xc2a8728496be486950ab1754b8c7fe23f99c05a5'
LIMIT 10

SQLの基本文法④ SELECT

表示するデータを特定の複数パラメータにする際に使います。

SELECT _user,_amount FROM データ元
WHERE _user = '0x00...'
LIMIT 10

実際のコード

SELECT _user,_amount FROM aave."LendingPool_evt_Deposit"
WHERE _user = '\xc2a8728496be486950ab1754b8c7fe23f99c05a5'
LIMIT 10

ちなみに表示するデータのカラム名をカスタマイズしたいときはasを使います。

SELECT _user as me,_amount FROM データ元
WHERE _user = '0x00...'
LIMIT 10

実際のコード

SELECT _user as me,_amount FROM aave."LendingPool_evt_Deposit"
WHERE _user = '\xc2a8728496be486950ab1754b8c7fe23f99c05a5'
LIMIT 10

DuneのためのSQL文法 <中級>

SQLの中級文法① SUM

フィルターしたデータの中であるパラメータの合計を求める方法です。

SELECT SUM(_amount) as total_volume FROM データ元
WHERE _user = '0x00...'

実際のコード

SELECT SUM(_amount) as total_volume FROM aave."LendingPool_evt_Deposit"
WHERE _user = '\xc2a8728496be486950ab1754b8c7fe23f99c05a5'

SQLの中級文法② COUNT

データの個数などを調べるのに利用することができます。

SELECT COUNT(_amount) as total_count FROM データ元
WHERE _user = '0x00...'

実際のコード

SELECT COUNT(_amount) as total_count FROM aave."LendingPool_evt_Deposit"
WHERE _user = '\xc2a8728496be486950ab1754b8c7fe23f99c05a5'

SQLの中級文法③ GROUP BY

データに対してグルーピングをすることができます。

SELECT _reserve FROM データ元
WHERE _user = '0x00...'
GROUP BY _reserve

実際のコード

SELECT _reserve FROM aave."LendingPool_evt_Deposit"
WHERE _user = '\xc2a8728496be486950ab1754b8c7fe23f99c05a5'
GROUP BY _reserve

分かりやすいイメージ

LearnSQL.comより引用

SQLの中級文法④ ORDER BY, ORDER BY DESC

ORDER BY ◯◯ は、データの表示順序を昇順でソートすることができます。逆にORDER BY ◯◯ DESCだと降順でのソートになります。

SELECT _user,_amount FROM データ元
WHERE _user = '0x00...'
ORDER BY _amount

実際のコード

SELECT _user,_amount FROM aave."LendingPool_evt_Deposit"
WHERE _user = '\xc2a8728496be486950ab1754b8c7fe23f99c05a5'
ORDER BY _amount

SELECT _user,_amount FROM データ元
WHERE _user = '0x00...'
ORDER BY _amount DESC

実際のコード

SELECT _user,_amount FROM aave."LendingPool_evt_Deposit"
WHERE _user = '\xc2a8728496be486950ab1754b8c7fe23f99c05a5'
ORDER BY _amount DESC

DuneのためのSQL文法 <上級>

SQLの上級文法① HAVING

HAVINGWHEREにすごく似ていて、特定の条件に合ったデータを抽出することができます。

SELECT _reserve,SUM(_amount) FROM データ元
WHERE _user = '0x00...'
GROUP BY _reserve
HAVING _amount > 10000

実際のコード

SELECT _reserve,SUM(_amount) FROM aave."LendingPool_evt_Deposit"
WHERE _user = '\xc2a8728496be486950ab1754b8c7fe23f99c05a5'
GROUP BY _reserve
HAVING _amount > 10000

ちなみにHAVINGWHEREとの違いは、WHEREは素のデータに対して、条件抽出行うことができるのに対して、HAVINGGROUP BYでグルーピングしたデータについて条件抽出することができます。

SQLの上級文法② UNION

SELECT _reserve, _user, _amount FROM データ元1
UNION
SELECT _reserve, _user, _amount FROM データ元2

LIMIT 10

実際のコード

SELECT _reserve,_user,_amount FROM aave."LendingPool_evt_Deposit"
UNION
SELECT _reserve,_user,_amount FROM aave."LendingPool_evt_Borrow"
LIMIT 10

UNIONはデータとデータを結合するJOINの中の1つで、他にもいくつか種類があります。

Dune SQL GUIDEより引用

Duneでビジュアライゼーション

Duneで書いたスクリプトをグラフ化して分析しやすくしていきます。

Duneスクリプト

date_trunc('day',evt_block_time)は日別でグルーピングしてデータを表示するのによく使う形式です。特定の単位(日、月、年)で四捨五入してくれるようなイメージです。

SELECT date_trunc('day',evt_block_time) as day,COUNT(evt_tx_hash) FROM aave."LendingPool_evt_Deposit"
GROUP BY 1
ORDER BY 1 DESC

data_truncの参考記事
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_DATE_TRUNC.html

Duneの画面からコードを選択してビジュアル化

Duneでダッシュボードを作成して公開

最後に作成したクエリ(グラフ)をダッシュボードにまとめて、公開していきます。Duneは基本プランでは作成した瞬間にpublicになってしまうので注意が必要です。

Duneを使って手軽に快適な分析ライフを!

今回はDuneの作成方法を紹介しました。オンチェーンを書くためにプログラミングが必要と聞くとちょっと尻込みしてしまうと思います。しかし、Duneはなるべくプログラミングを知らないユーザーでも手軽に書けるようにできているので、ちょっとずつ触ってオンチェーンによる"透明性"という強みを活かして頂ければ幸いです。

おすすめの参考文献

Dune SQLガイド
https://towardsdatascience.com/your-guide-to-basic-sql-while-learning-ethereum-at-the-same-time-9eac17a05929

シンシズモ株式会社

Discussion