オンチェーン解析ツールDuneの始め方・使い方
Web3(ブロックチェーン)の魅力の1つ"透明性"
web3(ブロックチェーン)の世界は、全ての行動がトランザクションとして記録され、アカウントを起点にどのように行動したのかが誰でも自由に確認することができる"透明性"を持っている。
オンチェーンを解析するツール
Etherscan
最も簡単にオンチェーンの情報を確認することができます。誰から誰にOOETH移動したとか、誰が残高OOETH持ってるとかの情報を簡単にみることができます。
Opensea
主にNFTに関する基本的な情報をみることができる
- NFTの売買の履歴
- NFTのホルダー情報と持ってるNFTの量
- ホルダーの移動履歴
https://opensea.io/ja
Dune
EtherscanやOpenseaよりも自由にカスタマイズして分析することができる
- オンチェーンの全てのイベントから分析できる
- 棒グラフや円グラフといったグラフ化が簡単
https://dune.com/
Duneについてもう少し詳しく
Duneはノルウェーのドゥーン・アナリティクスという企業が開発・提供しているブロックチェーン分析ツール。SQLを使うことで比較的簡単に、自分好みのオンチェーン解析を行うことができ、公開することができます。
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
HAVING
はWHERE
にすごく似ていて、特定の条件に合ったデータを抽出することができます。
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
ちなみにHAVING
とWHERE
との違いは、WHERE
は素のデータに対して、条件抽出行うことができるのに対して、HAVING
はGROUP 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
の参考記事
Duneの画面からコードを選択してビジュアル化
Duneでダッシュボードを作成して公開
最後に作成したクエリ(グラフ)をダッシュボードにまとめて、公開していきます。Duneは基本プランでは作成した瞬間にpublicになってしまうので注意が必要です。
Duneを使って手軽に快適な分析ライフを!
今回はDuneの作成方法を紹介しました。オンチェーンを書くためにプログラミングが必要と聞くとちょっと尻込みしてしまうと思います。しかし、Duneはなるべくプログラミングを知らないユーザーでも手軽に書けるようにできているので、ちょっとずつ触ってオンチェーンによる"透明性"という強みを活かして頂ければ幸いです。
おすすめの参考文献
Dune SQLガイド
Discussion