みなさんこんにちは!プリズムと申します!
皆さんは暗号資産に触れる中で、オンチェーンという言葉を聞いたことはあるでしょうか?
オンチェーンとはブロックチェーン技術における一つの概念であり、ブロックチェーン上に記録される取引、もしくはその仕様のことを指す言葉です。
オンチェーンに保存されているデータに対してデータ分析を実行する分野を、一般にオンチェーン分析と呼びます。
オンチェーン分析のスキルがあれば、投資戦略の策定をはじめとした様々な場面で活用できる可能性があります。
そこで今回の記事では、Duneというプラットフォームを用いたオンチェーン分析のやり方について、完全な初心者の方にも分かりやすく解説します!
※本記事は、オンチェーン分析およびSQLの経験が全くない完全初心者を想定読者として執筆されています。
本文中で言及する内容は必ずしも厳密な内容ではなく、初学者に向けて簡便化していることをご了承いただけますと幸いです。
オンチェーンとは?
オンチェーンとはブロックチェーン技術における概念の1つです。
簡単に言うと、ブロックチェーン上で直接送金や何らかの処理を行うことです。
反対にオンチェーン上で取引が実行されない取引のことは、オフチェーンと呼びます。
画像引用元:PoL -【レッスン③】オンチェーンとオフチェーンを理解しよう
オンチェーンで取引された履歴データのことを、オンチェーンデータと呼ぶことが多いです。
Etherscanなどのブロックエクスプローラ―で閲覧可能な以下のようなデータも、オンチェーンデータの一種です。
オンチェーン分析では、このようなオンチェーンデータを対象にデータ分析を行っていきます。
Dune(旧Dune Analytics)とは?
Duneは、オンチェーンデータからユーザーが指定したデータを抽出することができるプラットフォームです。
Duneでの具体的な分析例を挙げると、以下の3つのようなデータになりますね。
- OpenSea、Looksrareといった各NFTマーケットプレイスの概況
- Uniswap V3上におけるトレード(スワップ)の状況
- メタバースプロジェクト『The Sandbox』と『Decentraland』関連のNFTホルダーの比較
上述したようなデータは、オンチェーンから分かる情報となっています。
ちなみにDuneはもともとDune Analyticsというサービス名でしたが、2022年4月19日の公式TweetにてDuneへのリブランディングが発表されました。
そのため当該日以前のDuneに関する記事は、名称がDune Analyticsという記載になっていることが多いです。
ゼロから分かるDuneの使い方
ここからは実際にオンチェーン分析を行っていきましょう!
完全初心者にもわかるように解説していくので、ぜひ最後まで読んでオンチェーン分析に入門しましょう!
では、分析の仕方を以下より解説していきます。
Duneにログインする
ややこしい説明は抜きにして、まずはとにかくDuneを触ってみましょう。
概念や細かい事項などはあとで勉強すればOKです。
まずはDuneのサイトにアクセスしましょう。
アクセス後、右上の Sign in を押してログインします。
アカウントを持っていない方は Need an account? Sign up here から新しくアカウントを作成してください。
なおDuneは、通常のログイン手法(ユーザーネームとパスワードの入力)に加えて、Ethereumウォレットを使用してのログインも可能です。
Sign in with Ethereum を押すと、ログインするウォレットのオプションを選択することができます。
ログインが完了すると、画面右上の表示が変化します。
新規でアカウント作成を行った方は、オレンジ色の丸が表示されていると思います。デフォルトで設定されているアイコンです。
ここまでの操作でログインが完了したので、次は実際にDune上でクエリを書く作業を行ってみましょう!
クエリ(SQL)を書いてみる
クエリとは、データベースに対してデータの出力を命令する文字列のことです。
そのクエリを書く際のルールが定義された文法のことをSQLと呼びます。
…と言ってもイメージしにくいと思いますので、まずは実際にクエリを書いてみましょう。
右上にある New Query をクリックしてください。
するとこのような画面に遷移します。
なんがごちゃごちゃしてて分かりにくいですね…
最初の設定として、左上のプルダウンメニューから『Dune Engine V2 (Beta)』を選択してください。
この操作の意図は、当記事の『Dune Engine V2 (Beta)とは?』で解説しています。
ただし、一旦ここは「そういうものなんだな~」程度で理解して読み進めてもらった方が話がシンプルかと思います。
上記の設定を終えたところで、この章では一旦左側のパネルは無視して解説を進めます。
左側のパネルに関する解説は、当記事内の『目当ての情報が格納されているテーブルを調べる』に後述しています。
左側のパネルを最小化すると、以下のようになります。画面がシンプルになりましたね。
上の黒い部分が入力、下のオレンジ色のパネルが出力に使われるパネルです。
上のパネルにデータベースへの命令を書き込むことで、下のパネルへ命令通りに成形されたデータが表示されます。
では、実際に命令を書いてみましょう。
まずは何も考えず、以下のクエリを黒いパネルに打ち込んでみましょう。
SELECT * FROM ethereum.transactions
LIMIT 10
打ち込んだら、出力部分にある Run と記載されたボタンをクリックしてください。
するとオレンジのパネルが以下のように変化します。なにやら色々表示されているのが分かりますね。
これが、先ほど書いたクエリ(命令)に従って出力された結果(テーブル)になっています。
block_time(ブロックが生成された時間)が記載された列を先頭に、2列目以降からも様々な情報が得られています。
ちなみに、SQLでのデータはパーツによって以下のような名称で呼ばれます。
ここで、先ほど入力したクエリ(SQL)を見てみましょう。
SELECT * FROM ethereum.transactions
LIMIT 10
上記のSQLの意味を解説すると、以下のようになります。
ethereum.transactionというテーブルから全ての列(カラム)を抽出して、
最新のものから10行分のデータを表示しなさい
抽出する列を指定する
ここで、SQLについて簡単な解説を挟みます。
SQLとは、データベースを操作する際に使用する文法(データベース言語)を指します。
Duneにおけるオンチェーン分析は、このSQLの文法に則って行わなければなりません。
ここで再度、入力したSQLを見てみましょう。
SELECT * FROM ethereum.transactions
LIMIT 10
もちろんこのクエリも、SQLの文法に則って記載されています。
「全て」をクエリで記述する場合、SQLの文法上アスタリスク(*)を入力します。
(プログラミングの経験がある方であれば、この記法はワイルドカードという名前で馴染み深いと思います)
SQLは基本的に、決まった配置に対して特定のデータを指定する形で記述する言語になっています。
特定のデータとは、おおよそ以下の3種類を指します。
- 列名
- テーブル名
- 条件式
上記のSELECT文に指定してあるデータは、以下のように並んでいるという訳です。
SELECT 列名 FROM テーブル名
では試しに、SQLの文法に則ってアスタリスクの部分を抽出したい各カラム名に置き換えてみましょう。
SQLとしては下記のようになります。
SELECT block_time, value, from, to FROM ethereum.transactions
LIMIT 10
実行結果は下図の通りです。
データ抽出の際に不要な列が除外され、指定した列名(カラム名)のみを抽出してくれています。
ここまでの操作で、『命令文(SQL)を書く ⇒ 結果が表示される』というDuneの基本的な操作をマスターすることができました!
次の章ではより実践的なSQLの例を通して、オンチェーン分析の実例を学びましょう。
オンチェーン分析を実践してみよう!
前の章にて、大まかなDuneの操作方法に関する解説は終了となります。
そんなに難しくはなかったですよね?
ここからは実践あるのみで、Duneを実際に触ってオンチェーン分析を行っていくしか上達への道はありません。
その際の基本的なフローは以下の通りです。
以下より、実例を交えて個々のステップの詳細を解説していきます。
知りたいオンチェーン情報を発見する
この第1ステップが最も重要です。
知りたいオンチェーン情報がないのであれば、そもそもオンチェーン分析をする必要がありません。
普段から利用しているDeFi(分散型金融)やNFTマーケットプレイスで、知りたいオンチェーン情報がないか探してみると見つかりやすいかもしれませんね。
本記事では知りたいオンチェーン情報の具体例として、
と仮定します。
以下よりその情報の抽出方法について解説していきますが、その前に最終的に完成するグラフをお見せします。
こんな感じのオンチェーン情報を一から作っていきましょう!
目当ての情報が格納されているテーブルを調べる
上記のように知りたい情報を定義した時にすべきことは、OpenSea上の売上を記録しているテーブルを調べることでしょう。
では、分析画面でテーブルを調べましょう。
まず、左上のプルダウンメニューから『Dune Engine V2 (Beta)』 を選択するのを忘れずに。
次に注目するのは、先ほど無視した左側の灰色部分です。
操作は簡単です。矢印で示してある検索ボックスに、知りたいオンチェーン情報に関連するキーワードを入力してみましょう。
今回はOpenSeaと入力します。
すると、以下のようにOpenSeaに関連したオンチェーン情報を格納してあるテーブルの候補一覧が出てきました。
この一覧から分析の元となるテーブルを選択します。
ただその前に、そのテーブルにどのような値が格納されているのかを確認する必要があります。
お目当ての情報がありそうなデータ(今回はopensea trades)の中身を確認してみましょう。
opensea tradesという部分をクリックします。
opensea tradesというテーブルには、下図のようなデータが格納されていることが分かりますね。
テーブルの中身を調べた結果、このテーブルで自分が行いたいオンチェーン分析が可能だと判断できました。
それでは、このテーブルを右上のSQLの入力部分にて指定しましょう。
テーブルを簡単に指定(入力)するには、下図で示している部分をクリックします。
以上でテーブルの選択から入力までの操作をマスターできました!
SQLを書いてデータを加工する
それではここから、opensea tradesのテーブルを加工するためのSQLを書いていきましょう。
具体的に言うと、opensea tradesという大きなテーブルからDecentralandとThe SandboxのLANDに関するオンチェーン情報だけを抽出するようなSQLを書きます。
SQLとしては以下のようになります。
なおDuneで実際に作成した例はコチラのページでご覧いただけます。
WITH Decentraland AS
(SELECT
date_trunc('day', block_time) AS block_date,
SUM(amount_original) AS Decentraland_trade_amount
FROM opensea.trades
WHERE
1 = 1
AND nft_contract_address = lower('0xF87E31492Faf9A91B02Ee0dEAAd50d51d56D5d4d')
AND currency_symbol in ('ETH', 'WETH')
GROUP BY block_date),
The_Sandbox AS
(SELECT
date_trunc('day', block_time) AS block_date,
SUM(amount_original) AS The_Sandbox_trade_amount
FROM opensea.trades
WHERE
1 = 1
AND nft_contract_address = lower('0x5CC5B05a8A13E3fBDB0BB9FcCd98D38e50F90c38')
AND currency_symbol in ('ETH', 'WETH')
GROUP BY block_date)
SELECT
Decentraland.block_date,
Decentraland_trade_amount AS Decentraland_LAND,
The_Sandbox_trade_amount AS The_Sandbox_LAND
FROM Decentraland
INNER JOIN The_Sandbox ON Decentraland.block_date = The_Sandbox.block_date
ORDER BY block_date DESC
本項目ではSQLの詳しい解説は省力しますが、どの部分がどのような操作を行っているかという解説は行います。
まず1行目のWITH句。これはSQL内で自由に呼び出しが可能なテーブルの作成を行っています。
WITH句の解説はこちらのサイトが非常に分かりやすいです。
続く2行目から10行目でDecentralandのデータを抽出したテーブル、12行目から21行目でThe Sandboxのデータを抽出したテーブルを作成しています。
SQL内で両方のNFTコントラクトアドレスを記載している部分があると思いますが、こういったアドレスの探し方は『NFTのコントラクトアドレスを探す方法』にて解説しております。
ここまではWITH句内での操作です。
テーブルの出力を行うためのSQLは、23行目から29行目に記載されています。
ここでは、先ほど作成したDecentralandのテーブルとThe SandboxのテーブルをINNER JOIN句を用いて結合(2つのテーブルを1つのテーブルに合体)し、日付とその日付に対応した各々の合計取引高を出力しています。
つまり、下図のような出力が実行されるということになります。
出力結果をグラフ化する
以上の操作で欲しいオンチェーン情報(データ)は入手できました。
最後に、このデータをグラフ化する操作を行って終了となります。
New visualizationをクリックしてください。
次の画面にあるプルダウンメニューから、グラフの種類を選択できます。
今回はArea chart(面グラフ)を選択しましょう。
Area Chartを選択後、Add visualizationをクリックします。
すると出力部分にグラフが描画されます。
ただし、この状態ではDecentralandのLANDに関する取引高しか描画されていません。
行いたいオンチェーン分析は、DecentralandとThe SandboxのLANDに関する取引高の比較なので、新たにThe SandboxのLANDの情報を縦軸に追加する必要があります。
上記の画面から下にスクロールすると、以下のような部分があります。
この部分でグラフに対して新たな設定を追加できます。
ではこの画面で、The SandboxのLANDの情報を縦軸に追加しましょう。
Y column 2のプルダウンメニューから、The_Sandbox_LANDを選択します。
するとグラフの描画が切り替わり、下図のようになります。
Decentralandの情報が紺色、The Sandboxの情報がオレンジ色で描画されていることが確認できます。
以上で最低限必要な操作は終了です。
グラフの色や縦軸の名称などといった他の操作も、前述した画面から設定できますのでお好みに合わせて設定してみてください。
グラフ上にカーソルを移動させると、特定の日付のオンチェーンデータが確認できます。
下の例では、2022年4月25日でのOpenSeaにおける各プロジェクトの合計取引高(ETH単位)が表示されています。
以上でオンチェーン分析の具体例の解説は終了です!
長時間の学習お疲れさまでした!
オンチェーンデータを見る際に注意すべきこと
本記事では
という分析テーマを掲げ、以下のようなグラフの作成を行いました。
ただし、このデータを見る際には注意すべき点があります。
それは、このデータはEthereum上のみのNFTにおけるETH単位のみでの集計であるという点です。
上記より、主に以下のような問題が生じます。
- 別の取引通貨単位での取引高が計上できていない(DecentralandではMANA、The SandboxではSANDによるLANDの取引も頻繁に行われています)
- 別のチェーン上にあるNFTの取引高が計上できていない(The SandboxのLANDは、Polygon上にも存在しています)
実際に投資やビジネスに役立てるための分析を行う場合は、上記のような点も考慮に入れてデータを見ていく必要があります。
より複雑なSQLを書くことができれば、上記の注意点を概ね解決したデータを出力することも可能です。
補足情報
上述した内容で、オンチェーン分析において必要な最低限のDuneの知識は身に付いたのではないでしょうか。
この項目では、上記の内容に補足しておきたい情報を記載していきます。
直接的な分析のテクニックに関係するトピックも扱っているので、より深くDuneを理解するための一助になると思います。
Dune Engine V2 (Beta)とは?
Dune Engine V2 (Beta)とは、現在稼働している最新バージョンのDuneのことです。
『クエリ(SQL)を書いてみる』という項目で、SQLを打ち込む前にチェーンの選択を行いました。
この操作の際に、Dune Engine V2 (Beta)を選択しています。
これは、Duneの最新バージョンで分析を開始する、という選択をしていることを意味しています。
逆に言えば、上記画像における1~6の選択肢は全て旧バージョンのDuneとなっているのです
2022年5月30日にDuneの公式ブログにて、Dune Engine V2のローンチが発表され、プラットフォーム上に実装されました。
旧バージョンとの違いは様々ありますが、最も大きな特徴はマルチチェーンのオンチェーン情報を分析可能となったことです。
旧バージョンの時は分析を始める前にあらかじめ分析対象のブロックチェーンを設定する必要がありましたが、最新バージョンになってからその必要がなくなり分析の自由度が向上しました。
加えて、直近になってDune上での分析に対応したAvalancheやArbitrumは、最新バージョンのDuneでのみオンチェーンデータへのアクセスが可能となっています。
上記の流れを考慮すると、今後のDuneにおけるオンチェーン分析は最新バージョンにて盛り上がっていく可能性が高いです。
積極的に最新バージョンのDuneを利用していくことをおススメします。
なお下記からの解説に際して、旧バージョンのDuneをV1、最新バージョンのDuneをV2と記載します。ご了承ください。
Duneで使用されているSQLの仕様について
SQLには多くの種類が存在しており、その種類によって少しだけ文法が異なる場合があります。
Duneで採用されているのは、PostgresQLとDatabricks SQLという2種類のSQLです。
PostgresQLはV1、Databricks SQLはV2にて採用されています。
用意されているオンチェーンデータ(テーブル)の種類について
Duneが用意しているオンチェーンデータのテーブルの種類は以下の4つに大別されています。
- Raw(特別な加工がされていない生のオンチェーンデータ)
- Decoded projects(プロジェクト毎に分類されたデータ)
- Spells(NFT、DEX、Airdropといった特定のテーマ毎に分類されたデータ)
- Community(Duneのコミュニティメンバーによって作成されたデータ)
Duneに存在している分析の多くは、主にSpellsを用いて行われていることが多いです。
本記事で指定したopensea.tradesも、Spellsの1つとなります。
自分が行いたい分析内容に沿って、テーブルの指定をしましょう。
NFTのコントラクトアドレスを探す方法
Duneで分析を行うにあたって、アドレスを指定する場面が多々あります。
その際、ウォレットアドレスではなくコントラクトアドレスを指定しなければならないケースもあります。
本項目では上記のような操作に対応するために、特定のNFTに紐づいたコントラクトアドレスを簡単に探す方法を解説いたします。
例として、The SandboxのLANDに紐づいたNFTコントラクトアドレスを探してみましょう。
まずはOpenSeaにアクセスしましょう。
画面上部の検索欄で「The Sandbox」と入力します。
検索結果中のCOLLECTIONSからThe Sandboxを選びましょう。
COLLECTIONS内に表示されている別の選択肢は、The Sandbox内で展開されている別種類のNFTですので今回はスルーします。
以下のような画面になったら、適当に出品されているLANDをクリックしてください。
出品情報の詳細画面に移動するので、ここでDetailsをクリックしましょう。
Details内の、Contract Addressという記載がある部分のアドレス部分をクリックします。
すると、ブロックエクスプローラ―にアクセスします。
下図の赤枠で囲っている部分が当該NFTのコントラクトアドレスです。
なお上記の手順ではPolygon上に存在しているThe Sandbox LANDの出品情報を参照したので、表示されているのはPolygon上でのNFTコントラクトアドレスになっています。
The SandboxのLANDは、PolygonとEthereumの2つのチェーン上でNFTが存在しているので、Ethereumの方のNFTコントラクトアドレスも取得する必要があります。
OpenSea上では、イーサリアムの色でPolygon上のLANDかEthereum上のLANDかを区別することができます。
実際にEthereum上のLANDの詳細情報を見てみると、先ほどのPolygon上のコントラクトアドレスとは異なることがわかります。
以上の操作で、The SandboxのLANDに紐づいたNFTのコントラクトアドレスが取得できました。
Ethereum上でのアドレスが、『0x5CC5B05a8A13E3fBDB0BB9FcCd98D38e50F90c38』
Polygon上でのアドレスが、『0x9d305a42A3975Ee4c1C57555BeD5919889DCE63F』
ですね。
ぜひOpenSea上での検索を自分が分析したいNFTに変えて、Dune上での分析を行ってみてください。
Dune上でSQLを書く際に注意すべき点について(エラーを避けるために)
V1からV2へ移行するに当たりSQLの仕様が変更されたことで、両バージョン間のSQLの互換性は失われています。
そのため、V1の仕様で書いたSQLをV2で実行しようとすると、エラーが発生します。
当該エラーを避けるためには、V2におけるSQLの仕様の理解が不可欠です。
次項目より、最も大きいSQL上の違いとして挙げられる以下の2つを解説します。
- アドレスの記載方法
- ダブルクオーテーションとシングルクオーテーション
まずはこの2点に注意を払えば、初歩的なエラーで時間を取られることはなくなると思います。
なお、各々のバージョンにおけるSQLの差異に関しては、こちらの公式ドキュメントにて全て言及されています。
より詳しい解説をご覧いただく場合は、上記のサイトにてご確認いただけますと幸いです。
それでは、以下より各詳細を解説いたします。
V1、V2におけるアドレスの記載方法について
特に注意すべきなのは、アドレスの記載です。
メタマスクやEtherscanなどで参照できるウォレットアドレスやコントラクトアドレスをDune上の分析に用いる場合、V1とV2でアドレスの加工方法が異なります。
アドレスの加工方法をフローにした図は以下の通りです。
要するに、V1では \xd8da…
、V2では 0xd8da…
という記載様式に従う必要があるということです。
この仕様だけ見ても、加工工程の少ないV2の方がユーザー目線で使いやすくなっていると理解できますね。
なお、V2で分析を行う場合はSQL上の関数であるlowerを使用すると便利です。この関数は大文字を小文字に変換してくれる関数ですので、
lower('0xF87E31492Faf9A91B02Ee0dEAAd50d51d56D5d4d')
のように記載すれば、わざわざ小文字への変換作業を行わなくて済みます。
V1,V2におけるダブルクオーテーションとシングルクオーテーション
テーブルの指定やエイリアス(テーブルへの別名)の設定を行う際、引用符を使用しなければならない場合があります。
この際にダブルクオーテーションを用いることで、エラーが起こってしまうケースがあるのです。
この対策は非常に明快です。
基本的に、V2でSQLを書くときはシングルクオーテーション(’)を使用しましょう。
V1では特定の操作を行う際にダブルクオーテーションを使用する仕様となっていたのですが、V2ではそれが改善され、ほとんど全ての操作がシングルクオーテーションで対応可能となっています。
どうしても解決できないエラーが発生した場合は?
Dune公式は、エラーを解決できないユーザーのために救済手段を用意しています。
Dune上でSQLを書いているときにエラーが発生する場合、その多くは以下の2つのケースに集約されるでしょう。
- SQL自体の文法が間違っている
- Duneの仕様に適さないデータの指定方法をしている
上記2つのような原因で起こるエラーは、基本的にはSQLおよびDuneのドキュメントを参照すれば解決すると思います。
ただこういった方法は、初心者の方にとって簡単ではありません。
そんな時に役立つのが、DuneのDiscordチャンネルです。
公式のトップページから下にスクロールしていくと、Discordチャンネルにアクセスできるリンクがあります。
ここからDiscordに移動して、Duneのチャンネルに入りましょう。
DuneのDiscordチャンネル内に、beginners と query-questions という2つのテキストチャンネルがあります。
ここでエラー内容や質問を投げることで、Duneの熟練者たちがあなたの質問に答えてくれる可能性が高いです。
実際に beginners 内では、以下画像のようなやり取りが行われていました。
上記の質問では分析画像を添付して「このSQLが動かないんだ!」と助けを求めているようです。
それに対して、「V2(最新バージョンのDune)ではテーブル名の指定にダブルクオーテーション(”)は使っちゃダメだよ!」という解答が返ってきていますね。
このようにDuneには、Discord上で質問できる環境が整っています。
初心者の方がエラーで詰まってしまった場合、まずここに質問をポストしてから自分で解決を図ると効率的かと思います。
まとめ
当記事を通してオンチェーン分析の基本的な概念、Duneの仕様、実践的な分析を一通り習得できたかと思います。
今回の実践例以外にも、自分でDuneを使用してみることをおススメします。
この記事が、オンチェーン分析に入門する方の一助となれば幸いです。
当記事執筆者のTwitter(@prism_cryptos)でも、オンチェーン分析に関する情報を発信しております。ぜひフォローいただけますと幸いです。
弊社について
弊社Stir(@Stir_Network_JP)では、ステーキングやノード(バリデーター)の作成・運用・保守、およびマイニング支援に関するサービスを提供しております。
ご関心をお持ちの場合は、弊社HPをご覧いただいた上でお申込み、およびお問合せいただけますと幸いです。