ゼロから学ぶ ブロックチェーンの仕組みとオンチェーンデータ分析

本連載では、ブロックチェーンの基本的な仕組みを解説しながら、オンチェーンデータを分析するための基本的な手法について、全8回で紹介します。

第5回となる今回から、オンチェーンデータのオンライン分析サービスのDuneを用いて、Ethereumを対象としたデータ分析の演習を始めていきます。

Hello Dune

Duneは、ブロックチェーン上のデータ分析に特化したオンラインサービスで、類似サービスの中でも開始までのハードルが低く、コミュニティ機能やチュートリアルなども豊富なため、データ分析初学者の人にとってもおすすめなサービスです。

Duneのユーザは誰でも自分の分析クエリや可視化のためのダッシュボードを公開できるため、公開されているダッシュボードを見る用途だけでも有益なサービスです。今回は、実際に自分で新しいクエリを作成して実行してみることから試してみましょう。

なお、今回ご紹介するDuneの機能は2023年8月現在の仕様であり、今後のアップデートで変更が発生する場合もあるため、最新の情報は公式ページのドキュメントをご確認ください。ただし、ひとつのオンラインサービスであるDuneの仕様が変わったとしても、そこで使われているSQLの構文や知識は、他のサービスやデータベースでも通用する普遍的なものですので、Duneを入り口としつつも、ぜひ汎用的なSQLの知識を身につけていってください。

セットアップ

図1. Duneのダッシュボード一覧とアカウント登録画面(https://dune.com/

Duneの公式ページにアクセスし、右上のSign upまたはSign inボタンから、アカウント登録またはログインをおこないます。アカウント登録には、ユーザネームとメールアドレス、パスワードの設定が必要です。ユーザネームは、クエリやダッシュボードを作成した際の作成者として表示されます。

アカウント登録後、アカウント設定ページでアイコンや各種SNSアカウントの連携、自己紹介文の追加が可能です。

また、MetaMaskなどのウォレットアプリをインストールしている方は、ウォレットアドレスとDuneアカウントを連携させることで、パスワードを使わずウォレット認証でDuneにログインできるようになります。

基本機能

Duneの基本機能として、他ユーザの作成したダッシュボードやクエリを検索できるDiscover機能があります。ダッシュボードやクエリにはタグ付けやお気に入り登録ができるため、ジャンル別のダッシュボードや人気のクエリなどを探すことができます。また、他ユーザの作成したクエリを自身のワークスペースにフォークしてきて、独自のクエリとして実行したり書き換えたりすることも簡単にできます。

クエリエディタ

クエリエディタは、オンライン上でSQLクエリを記述し、実行するための機能です。公開されているクエリをForkしてくるか、画面上部のCreateボタンをクリックすることで、自身のクエリエディタを開くことができます。

図2. クエリエディタの表示例

エディタウィンドウでは、SQLの予約語やテーブル名などを補完してくれるオートコンプリート機能や、クエリの一部のみを選択して実行する選択実行機能などがあります。

また、クエリの一部をパラメタ化して実行時に決定できるようにしたり、特定の時刻やイベントに応じてクエリを再実行したりする機能もあります。

さらに、ChatGPTなどのLLM(大規模言語モデル)を応用した機能として、SQLクエリの内容を英語で説明してくれる機能や、英語の文章からSQLクエリを生成してくれる機能なども提供されています。

クエリの結果画面では、データを表形式で表示するだけでなく、棒グラフや円グラフなどで可視化する機能も備えています。

これらのクエリの結果を複数組み合わせて、ひとつのテーマで分かりやすくデータを表示させる機能がダッシュボードです。

図3. ダッシュボードの表示例

これらの機能は、アカウント登録さえすれば無料で使うことができますが、一部の機能はリソース制限があり、有料プランや有償のクレジットを購入することで追加のリソースを利用することができます。例えば、無料プランでは自分だけしかアクセスできないプライベートなクエリやダッシュボードの作成数に制限があったり、分析結果をCSV等でダウンロードできる数に制限があったりします。複雑なクエリを高速に実行するために実行エンジンのサイズをアップさせるためにもクレジットの消費が必要で、無料で手に入れられるクレジットを使い切った場合は、追加の購入が必要です。

また、独自のデータをアップロードして分析に活用したり、あるクエリの計算結果を永続化して再利用したりするには、有料プランの利用が必要です。

有料機能の詳しい内容については、公式のPlansページをご確認ください。

データテーブル

クエリエディタの左側に、「Query Explorer」「Data Explorer」「Version History」といったアイコンが並んでいます。デフォルトではData Explorerが選択されており、Duneで提供されているデータセットとして、「Essentials」「Raw」「Decoded projects」「Spells」「Community」といったカテゴリが存在します。

図4.データテーブルのカテゴリ関係図

まず、「Raw」データは、本連載の第2回 ビットコインの仕組みや、第3回 イーサリアムの仕組みでご紹介したような、ブロックチェーンのデータ構造そのものに近いブロックやトランザクションのデータを示します。

しかし、Ethereumのような汎用的なスマートコントラクトの実行基盤では、トランザクションの中身はコンピュータが解釈しやすいバイナリ形式になっていることがあり、人間にとっては扱いにくいデータです。そのようなデータをプロジェクトごとにデコードして人間にも理解しやすい形にしたものが「Decoded projects」データです。例えば、OpenSeaやUniswapといったブロックチェーンサービスの仕様ごとに、オンチェーンデータがデコードされ格納されています。

さらに、それらのデータセットを組み合わせて、汎用的に使いやすいデータセットとして提供されているものが「Spells」です。例えば、NFTプロジェクト全般の取引情報を集約した「nft.trades」といったテーブルがあります。余談ですが、Duneではクエリを記述する分析者のことを「ウィザード(魔術師)」と呼び、記述されたクエリを「スペル(呪文)」、クエリのコレクションを「スペルブック(呪文書)」と呼んでいます。これらの「Spells」を生成するクエリは、Dune公式やコミュニティメンバーによって作成・管理されています。

また、公式のオンチェーンデータだけでなく、ブロックチェーン以外のオフチェーンデータを組み合わせてデータ分析をおこないたい場合もあります。例えば、ブロックチェーン上のアドレスに対するサービス名やユーザ名などのラベル付をおこなった「addresses」テーブルなどがあります。Duneやコミュニティによって提供されたオフチェーンデータを「Community」から利用できます。

上記のさまざまなデータセットから、特に頻繁に使用されるデータセットを集めたものが「Essentials」になります。

Hello Query

それでは、クエリエディタから最初のクエリを作成し、実行してみましょう。サンプルとして、データテーブルのカテゴリから「Essentials」を選び、nft.tradesのテーブルを探します。テーブルの右横に並ぶプレビューのアイコンにフォーカスすると、このテーブルの中身のサンプルを表示してくれます。

図5. nft.tradesテーブルのサンプルデータ

今回は、サンプルとなるクエリをAIによって自動生成する体験をしてみましょう。テーブルのアイコンの中から「Wand(魔法の杖)」というボタンをクリックすると、クエリエディタの上部に「Using nft.trades, 」というフォームが追加されるでしょう。Duneの生成AIの場合、クエリ対象となるテーブル名は文章中で明示してあげる必要があり、このようなテンプレートが用意されています。

試しに、「Using nft.trades, what was the daily trade volume of opensea」という文章に変更し、OpenSeaの一日あたりの取引総額を計算するクエリを生成してみましょう。OpenSea※1とは、Ethereumブロックチェーンなどで発行されたNFTと呼ばれるデジタルデータをオンチェーン上で売買できるマーケットプレイスサービスです。「Generate SQL」ボタンを押してしばらく待つと、クエリエディタに自動生成されたSQLが入力されます。生成されるSQLは確定的ではありませんが、筆者の例では下記のようなクエリが生成されました。

コード1. OpenSeaの一日あたりの取引総額を計算するクエリ(自動生成)

SELECT
  DATE(block_time) AS trade_date,
  SUM(amount_usd) AS daily_trade_volume
FROM nft.trades
WHERE
  project = 'opensea'
GROUP BY
  DATE(block_time)
ORDER BY
  trade_date DESC

クエリエディタの「Run」ボタンを押してこのクエリを実行すると、図6のような実行結果が得られました。

図6. コード1.の実行結果

※1 OpenSea

ビジュアライズ

この実行結果を、グラフでビジュアルに確認してみましょう。「New visualization」のタブを選択し、「Line chart」を選んで「Add visualization」ボタンをクリックすると、自動的に図7のような折れ線グラフが生成されると思います。

図7. 実行結果の折れ線グラフによる可視化例

図7のグラフを見ると、所々で急激な取引額の増加が見られます。これが、取引件数の増加によるものなのか、一取引あたりの取引額の増加によるものなのかを確認するため、取引件数を計算するカラムを追加してみましょう。

さきほどのWandの文章フォームを「add column of daily trade count」と書き換えて、「Generate SQL」から「Edit SQL」に切り替えて実行してみます。

コード2. 取引件数のカラムを追加したクエリ(自動生成)

SELECT
  DATE(block_time) AS trade_date,
  SUM(amount_usd) AS daily_trade_volume,
  COUNT(*) AS daily_trade_count
FROM nft.trades
WHERE
  project = 'opensea'
GROUP BY
  DATE(block_time)
ORDER BY
  trade_date DESC

SELECTとFROMの間に、「COUNT(*) AS daily_trade_count」という記述が追加されました。この記述が、日別の取引件数を計算するコードのようです。

このクエリを実行し、さきほどの折れ線グラフのY軸に追加してみましょう。クエリを実行すると、「daily_trade_count」というカラムが結果に追加されます。これを、Line chartの「Y column 2」に指定します。これだけだと、Y軸のスケールが違いすぎて取引件数のグラフがほぼ見えないため、「Y-axis options」で「Enable right y-axis」を有効化し、2つのスケールを利用できるようにします。さらに、画面最下部の「Series」パネルで、「daily_trade_count」の「Y-axis」を「Right」としてあげると、図8のような折れ線グラフが表示されます。

図8.取引件数・取引額による折れ線グラフの表示例

このように、Duneの機能をフルに活用すれば、ブロックチェーン上のデータを好きな形で加工してビジュアライズする工程が簡単に実装できます。

ただし、AIの機能に依存しすぎては、生成されたSQLの正しさに確信が持てず、想定しない挙動となった場合の修正も困難です。また、どのようなデータテーブルを組み合わせる必要があるかは、いまのところ人間が明示的に指定してあげる必要があります。

Duneを使いこなしてオンチェーンデータ分析をおこなうためにも、本連載の後半で、SQLの基本構文に関する知識と、オンチェーンデータのデータ構造についての知識を身につけていきましょう。

基本的なSQL構文

コード1.~2.で示したSQLクエリをサンプルとして、基本的なSQL構文について解説します。

SQLの構成要素は、基本的に「文(statement)」「句(clause)」「式(expression)」の3要素があります。句は「節」とも表現されますが、ここでは句に統一します。式はさらに細かな構成要素に分けることができますが、SQLクエリの大まかな構造を理解する上では、まず「文・句・式」のレベルで理解することをおすすめします。

図9. サンプルクエリにおける文・句・式への分解

文 (Statement)

SQLにおける文は、クエリを実行可能な最小単位です。複数の文が存在する場合は「;(セミコロン)」で文を区切りますが、Duneのクエリエディタのように基本的に1つの文しかないようなケースではしばしば省略されます。

文の例として、UPDATE文やDELETE文なども存在しますが、Dune上でデータ分析をおこなう上で登場するほとんどの文がSELECT文なので、まずはSELECT文を覚えておけば問題ありません。

句(Clause)

SQLにおける句は、文を構成する要素であり、文における意味の最小単位として考えることができます。例として、SELECT句やFROM句、WHERE句などがありますが、SELECT句は「どんな情報を表示したいか」、FROM句は「どこからデータを取得したいか」、WHERE句は「どんな条件でデータを絞り込みたいか」といった意味を定義する役割を持ちます。

多くの句単独では文にはなれないので、例えばFROM句のみのクエリやWHERE句のみのクエリは、クエリエンジンで実行できません。SELECT句のみのクエリは、単独でSELECT文としても解釈できるので実行可能ですが、多くの場合は「SELECT ~ FROM ~ WHERE ~」の3つの句がセットで用いられます。

コード1.~2.で利用されているその他の句として、AS句は「カラムに別名を付与する」、GROUP BY句は「レコードをグルーピングして新しいテーブルを作る」、ORDER BY句は「レコードを並び替える」といった意味があります。

どのような順番で句を使用できるかは、文の構文として決められており、例えば「FROM ~ SELECT ~」といった順で書かれたクエリはエラーとなります。

式(Expression)

SQLにおける式は、句を構成する要素であり、ある単一の値(スカラ値)やテーブル(リレーション)を返す表現です。

例えば、「1+1」という表現は2を返す式ですし、コード1.~2.の中の例では「DATE(block_time)」は日付を返す式、「SUM(amount_usd)」は引数の合計値を返す式、「nft.trades」はテーブルを返す式、「project」はprojectカラムの中身を返す式、「‘opensea’」は文字列のopenseaを返す式、「project = ‘opensea’」はTRUEやFALSEといった真偽値を返す式です。

特に、TRUEやFALSEを返す式を、特別に述語(predicate)と呼びます。クエリの構成要素を考える上では「文・句・式」の3要素でも十分なのですが、第4回 ビッグデータ分析のためのSQL基礎でも解説したとおり、SQLは関係代数と呼ばれる演算を実装した言語であり、この関係代数は集合論と述語論理をベースに設計されています。そのため、SQLを学ぶ上でも、この述語の概念を理解することが重要となります。

次回予告

今回の記事では、Duneのサービスの特徴や機能を紹介し、はじめてのクエリを実行する手順を示しました。また、文・句・式といったSQLの基本的な構成要素について解説しました。

次回の記事では、データ分析で役立つSQLの構文を紹介しつつ、引き続きオンチェーンデータ分析の演習をおこなう予定です。

連載一覧

【第1回】ブロックチェーンとは
【第2回】ビットコインの仕組み
【第3回】イーサリアムの仕組み
【第4回】ビッグデータ分析のためのSQL基礎
【第5回】Ethereumデータ分析演習1
【第6回】Ethereumデータ分析演習2
【第7回】Ethereumデータ分析演習3
【第8回】Ethereumデータ分析演習4

#Ethereum #オンチェーン分析

SHARE

  • facebook
  • twitter

SQRIPTER

加嵜 長門(かさき ながと)

記事一覧

合同会社DMM.com Web3事業部テックグループリーダー・DMM.comグループ株式会社DM2C Studio取締役(CTO)。ビッグデータ活用基盤の構築に携わり、SparkやSQL on Hadoopを用いた分散処理技術やブロックチェーン技術の研究開発、事業提案などを担当。共著に『試して学ぶスマートコントラクト開発』『ブロックチェーンアプリケーション開発の教科書』『ビッグデータ分析・活用のためのSQLレシピ』(マイナビ出版)、『詳解Apache Spark』(技術評論社)。

RANKINGアクセスランキング
#TAGS人気のタグ
  • 新規登録/ログイン
  • 株式会社AGEST
NEWS最新のニュース

Sqriptsはシステム開発における品質(Quality)を中心に、エンジニアが”理解しやすい”Scriptに変換して情報発信するメディアです

  • 新規登録/ログイン
  • 株式会社AGEST