必読の「ナニーレベルのチュートリアル」: Dune を使用してブロックチェーン データを分析する方法
AllRcode重构
2022-10-04 04:51
本文约20487字,阅读全文需要约82分钟
100 枚の写真で、Dune を使用してブロックチェーン データを分析する方法を説明します。

原作者: 0xPhillan

原作者: 0xPhillan

元のソース: web3edge

原文の翻訳: 古いヤッピーDune はおそらく現在大衆が利用できる最も強力なブロックチェーン データ分析ツールであり、何よりも優れているのは次のとおりです。無料!

Dune を使用すると、SQL を使用してクエリできるパブリック データベースを通じてブロックチェーン データにほぼリアルタイムでアクセスできます。

これは非常に強力なエネルギーです。

Dune はブロックチェーン データをデータベースに追加する前にデコードします。つまり、自分でバイトコードを理解する必要はありません。代わりに、Dune のブラウザを使用して、データセット、特定のスマート コントラクト、イベント、または呼び出しを参照できます。

Dune は最近、パフォーマンスを 10 倍向上させる V2 エンジンをリリースしました。今こそ、Dune の使用方法を学ぶ時期です。

  • このガイドでは、次のことを学習します。

  • パート 1: Dune インターフェイス

  • パート 2: SQL を使用して独自のクエリとグラフを構築する - 基本から始める

パート 3: すべてをダッシュ​​ボードに整理する

はじめましょう!

最初のレベルのタイトル

お問い合わせ

  • ダッシュボード

  • お問い合わせ

  • フォーク

  • フォーク

  • クエリエディタ

  • データセットブラウザとデータ分類

フォークされたクエリを保存します

  • パート 2: 最初のクエリを作成する

  • どのクエリを構築するかを決定する

  • 正しい情報を探しています

Dune で最初のクエリを作成する準備ができました

クエリ 1: ETH で調達された資金

クエリ 2: USD で調達された資金

クエリ 2a: 現在の ETH 価値での USD での資金調達

クエリ 2b: 購入時の ETH 価値に基づく米ドルでの資金調達

クエリ 3: サポーターの総数

クエリ 4:

クエリ 4a: erc721 を使用したリーダーボード。抽象化

クエリ 4b: poolysupporter を使用したリーダーボード。デコードテーブル

クエリ 6: 時間の経過とともに増加した ETH の時系列グラフ

パート 3: ダッシュボードのクリーンアップ

仕上げる

副題

パート 1: 砂丘と特徴の概要

Dune.com Web サイトを初めて開くと、以下のウィンドウが表示されます。このウィンドウの上部にはビュー チェンジャーがあり、ダッシュボード、クエリ、ウィザードを切り替えることができます。次に詳細ビュー領域があり、左側にダッシュボード、クエリ、ウィザード (ユーザー) のリストと一部の検索が表示されます。右側関連の設定。

ダッシュボード

Dune では、すべてのダッシュボードが公開されています。これは、あなたが構築したもの、または他の人が構築したものを誰でも表示およびコピーできることを意味します。これにより、ダッシュボードの作成時間が大幅に短縮され、他のユーザーのクエリから学習できるようになります。

お問い合わせ

ダッシュボードはクエリのコレクションであると述べたことを覚えているでしょう。ダッシュボード要素のタイトルをクリックすると、そのグラフの SQL クエリが表示されます。

画像の説明

ダッシュボード クエリ エディター画面の 2 つの例

ここでは、画面上に 2 つの主要な要素、クエリ (上、ブラック ボックス) と出力グラフ (下) が表示されます。そうです。どのタイルまたはグラフをクリックしても、ユーザーがそのグラフをどのように作成したかを確認できます。

ダッシュボード全体またはグラフ クエリだけを自分のアカウントに保存したい場合は、右上隅の [フォーク] をクリックすると、フォークされた画面上のすべてが新しいウィンドウにコピーされ、そこでビューを編集して保存できます。あなたのアカウントに。

画像の説明

イーサリアム価格のクエリ

イーサリアムの価格チャートをフォークしてみましょう!クエリで [フォーク] を押すと、前のコードがコピーされたクエリ エディターが表示されます。

クエリエディタ

  1. ここで、画面上のさまざまな要素を紹介します。

  2. 場所と名前をクエリします - 名前は [保存] をクリックした後に変更できます。

  3. データセット ブラウザ - 特定のデータセットを検索します

  4. クエリ ウィンドウ - ここに SQL クエリを入力します

  5. 視覚化セレクター - クエリ結果、分岐折れ線グラフを表示するか、新しい視覚化を作成するかを選択します。

  6. run - クエリウィンドウでクエリを実行します。

  7. save - (フォークされた) クエリを保存します。

画像の説明

Dune クエリエディタの概要

データセット ブラウザーとデータ カテゴリ

  1. データセット ブラウザーを詳しく見てみましょう。データセット ブラウザには 6 つの機能領域があります。

  2. チェーンの選択

  3. データセットの検索

  4. 生のブロックチェーン データを参照する

  5. 契約データの参照とデコード

  6. コミュニティが提供するデータを閲覧する

画像の説明

Dune データセット ブラウザの概要

データセットの選択では、解析するチェーンを選択できます。 「Dune Engine V2 (ベータ)」を選択すると、マルチチェーン クエリや 10 倍のパフォーマンス向上など、Dune の最新の機能強化にアクセスできるようになります。

画像の説明

別のチェーンを選択すると、カテゴリの選択 (上の画像の項目 3 ~ 6) が消え、操作できるコントラクト呼び出しとイベントのリストが表示されます。

画像の説明

「1.イーサリアム」を選択します

検索

注: Dune Engine V2 と古い検索機能では、異なる結果が返されます。以前の検索ではすべての結果のリストが返されましたが、Dune Engine V2 ではネストされた結果のリストが返されました。 V2エンジンを使用します!

画像の説明

「1. イーサリアム」と「7. Dune Engine V2 (ベータ)」の検索結果

生のブロックチェーン データをクリックすると、最初に生のテーブルを選択し、そこからさらに調査したい特定のテーブル列を選択することで、Dune がネストされたデータ構造でサポートするさまざまなブロックチェーンのクエリを簡単に見つけることができます。各ネスト レベル内で選択することにより、探している特定の検索結果をフィルタリングすることもできます。

画像の説明

Dune Engine V2 (ベータ) の生のブロックチェーン データの概要

これは、高度なブロックチェーン データを取得するための非常に迅速かつ簡単な方法です。

アイテムをデコードする

検索結果が入れ子になっていることがわかります。最上位レベルでは検索できるプロジェクトがあり、下位レベルではそのプロジェクト内の特定のスマート コントラクトをフィルターでき、最後にそのスマート コントラクトから生成されたさまざまなテーブルが表示されます。いずれかのテーブルをクリックすると、元のブロックチェーン データと同じようにリストが表示されます。

Dune Engine V2 (ベータ) デコード プロジェクトの概要

まとめ

まとめ

サマリーは、さまざまなクエリとデータ ブロックを結合して組み合わせて一意のテーブルを形成するカスタム テーブルと考えることができます。概要を使用すると、ユーザーはさまざまなデータを手動で結合することなく、探している特定のデータをより簡単にクエリできるようになります。

  • 一般に、概要は次の 2 つのカテゴリに分類できます。

  • セクターの概要: セクター固有のデータ

[概要] サブメニューから、概要が部門固有であるかプロジェクト固有であるかを指定するタグが付いた概要のリストを表示できます。

Dune Engine V2 (ベータ版) の概要

コミュニティ

コミュニティ

コミュニティ セクションにエントリが 1 つだけ (「フラッシュボット」) あるのはなぜだろうと疑問に思われるかもしれません。それは、Dune Engine V2 がリリースされたばかりだからです。時間の経過とともに、信頼できるコミュニティ メンバーによって構築されたコミュニティ データセットがますます増えていくことが予想されます。

画像の説明

Dune Engine V2 (ベータ) コミュニティの概要

下の画像では、Dune Engine V2 のリリース以来、Dune のデータがどのように集約されてきたのかをまとめています。4 つの主なデータ カテゴリは、生のブロックチェーン データ、デコードされたアイテム、概要、およびさまざまなブロックチェーンを保持するコミュニティです。さまざまな種類のデータを保存できるデータ。

画像の説明

Dune Engine V2 (ベータ版) データ ブラウザーのタブの概要

まずこのクエリを保存しましょう。 「保存」をクリックすると、いくつかのことが起こります。まず、クエリに名前を付けます。

画像の説明

クエリの保存ポップアップ

(1) クエリの場所と名前が更新され、(2) クエリが実行されます。これは、Dune がデータベースから最新のデータを取得していることを意味し、データベースはさまざまなブロックチェーンからの最新データで定期的に更新されます。クエリの実行が完了すると、クエリ結果が表示されます (3)。

画像の説明

ここから、(1) クエリ結果、折れ線グラフ、または新しい視覚化のいずれかをクリックすると、(2) 結果/視覚化ボックスが更新され、(3) その下に表示される選択設定が表示されます。ここには、以前の @hildobby の Ethereum ダッシュボードと同じように、クエリ結果やビジュアライゼーションを新規または既存のダッシュボードにすばやく追加するための「ダッシュボードに追加」ボタンもあります。

画像の説明

(1) 右上隅の丸をクリックし、(2) 「My Queries」をクリックすると、あなたのアカウントに関するお問い合わせのリストが開きます。

画像の説明

クエリ リストには、これまでにアカウントに保存したすべてのクエリが含まれます。以下の上部のスクリーンショットでは、作成された最新のクエリが確認できます。

画像の説明

最新のクエリを含むクエリのリストが上部に表示されます。

おめでとうございます。ビジュアル フォークの使用方法を学習し、最初のクエリを保存しました。

フォークせずに、実際にダッシュボード (クエリと視覚化のコレクション) を最初から構築してみましょう。このパートでは、特定のプロジェクトを検索するための正しいブロックチェーンの詳細がどこにあるのかを説明し、SQL の基本を説明します。

最初のレベルのタイトル

パート 2: 最初のクエリを作成する

  1. このセクションの目的は、次のことを教えることです。

  2. 特定のプロジェクトに必要な正しい情報を見つける方法

ただし、最初に、ダッシュボードの用途を決定する必要があります。 Pool Together DeFi プロトコルの Pooly NFT は最初のステップです。

画像の説明

Dune で「Pooly」を検索すると、確かに、コミュニティによって作成された Pooly NFT トラッカーがいくつか見つかります。

画像の説明

@0xbills によって作成された Pooly ダッシュボードの 1 つをクリックし、[フォーク] をクリックして作業を開始できます。

画像の説明

@0xbills https://dune.com/0xbills/Pooly-NFT 経由

しかし、ゼロから構築すれば、ブロックチェーン探偵になる方法を学び、同時に SQL も学ぶことができます。したがって、独自のクエリを最初から作成する必要があります。

まず、ダッシュボードで使用するグラフを決定しましょう。 Pooly がホームページに構築したビューを再構築しましょう。以下の 2 つのスクリーンショットを詳しく見ると、オンチェーン データに基づいたいくつかのメトリクスがわかります。

資金トラッカーを備えた貧弱なNFTランディングページ

貧弱なNFTリーダーボード

画像の説明

NFTミントのオプションと供給が不十分

  • 次のことがわかります。

  • 調達資金とETHでの資金調達目標

  • 調達資金と目標資金(米ドル)

  • バッカーの総数 (Pooly が購入された一意のアドレス)

  • リーダーボードには、アドレス、各アドレスで購入された NFT の数、合計 ETH が降順で含まれます

3種類のNFTそれぞれの最大供給量と残り供給量

  • 超すごいじゃないですか!しかし、これらはある時点のスナップショットにすぎません。また、別の挑戦をしてみましょう。

時間の経過とともに上昇するETHの時系列グラフを作成する

現状では、Pooly Web サイトと同じ方法でビューを構築することはできませんが、ダッシュボードを構築するために同じ量 (さらにはそれ以上!) のデータをキャプチャすることはできます。

正しい情報を探しています

  • Dune の使用を開始する前に、適切な情報を見つける必要があります。ウェブサイトから、PoolTogether が 3 セットの NFT を販売していることがわかります。

  • 後援者 – 0.1 ETH 相当のランダムな収集品 9 個のうち 1 個

  • 弁護士 – 芸術作品 1 点につき 1 ETH

審査員 - 1 つのアートワークに対して 75 ETH

Etherscan に行って、Pooly 関連のスマート コントラクトが見つかるかどうかを確認してみましょう。 Etherscan.io を開いた後、「Pooly」と入力して、これらのスマート コントラクトの所有者が Etherscan に登録しているかどうかを確認します。

画像の説明

Etherscan で Pooly を検索

3 つのコレクションをそれぞれ開き、スマート コントラクト アドレスの上にマウスを置くと表示されるコピー アイコンをクリックして、そのアドレスをコピーします。ページの下部には、最近のすべてのトランザクションも表示され、後でトラブルシューティングに役立ちます。

画像の説明

Etherscan を通じて Pooly コントラクトのアドレスを見つける

Dune から正しいデータを取得するにはこれらのコントラクト アドレスが必要であり、これらがすべてのクエリの基礎となります。

0x90B3832e2F2aDe2FE382a911805B6933C056D6ed

1.0 ETH Pooly Lawyer:

0x3545192b340F50d77403DC0A64cf2b32F03d00A9

0.1 ETH 支持者が少ない:

0x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523

75 ETH 悪い判断者:

まず、dune.com に移動し、画面の右上隅にある [新しいクエリ] をクリックします。

画像の説明

これによりクエリ エディターが開き、クエリの作業を開始できるようになります。

画像の説明

新しいクエリ ウィンドウと未変更の新しいクエリ ウィンドウ

クエリ 1: ETH で調達された資金

まず、左上の「7. Dune Engine V2 (Beta)」を「1. Ethereum」に変更します。 Pooly はイーサリアム上にあるため、このクエリにはイーサリアム データのみが必要です。また、「1.イーサリアム」はベータ段階に入ったばかりのDune Engine V2よりも成熟しています。

select SUM("value"/1e18) from ethereum.transactions
where "to" = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
or "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
or "to" = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523'

最初のクエリでは、ETH 建てで調達された資金を表示するカウンターを作成します。これを行うには、次のコードを Dune のクエリ フィールドにコピーし、Run (または CTRL+Enter) を押します。

  • 上記のコードは、要求した特定のデータについて Dune のデータベースを解析する SQL クエリです。 Dune のデータベースはさまざまなテーブルのコレクションとして考えることができ、各テーブルには抽出したい特定の情報が含まれています。 SQL を使用すると、次のことを実現できます。

  • 必要なデータ (テーブル内のどの列) を指定します。

  • データを変換しますか?

  • どのテーブルからデータを取得しますか

データをフィルタリングするかどうか

select * from ethereum.transactions
where "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'

多くの情報を含む大きなテーブルが表示されます。

画像の説明

次に、SQL コードを見てみましょう。

画像の説明

SQLコードの分解
このコードは、「ether カテゴリのトランザクション テーブルからすべての列を選択します。ここで、to 列の値は

クエリを実行せずにテーブル内の列を表示できます。データ ブラウザーでは、優れた検索機能を通じてさまざまなヘッダーを探索できます。

画像の説明

データブラウザを使用して「イーサリアム」内のテーブルを検索する

行 3 を完全に削除してフィルターを削除することもできますが、これでは巨大なテーブルが返され、クエリが完了するまでに長い時間がかかります。クエリが正確であればあるほど、実行速度が速くなります。

select "value" from ethereum.transactions
where "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'

これで、前に見たように多くの「値」列が存在するのではなく、「値」列が 1 つだけになりました。

画像の説明

「値」列のすべてのエントリを返します。

select "value"/1e18 from ethereum.transactions
where "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'

ただし、これらの値が非常に大きく見えることに気づくかもしれません。それは、ETH ではなく Wei 建てだからです。これを修正するには、「値」列に算術演算子を適用するだけです。

すごく良く見えませんか! SQL の 1e18 は 10^18 と同じです。Wei ではなく ETH で値が表示されるように、この数値を 1,000,000,000,000,000,000 で割るよう Dune に指示するだけです。

select SUM("value"/1e18) from ethereum.transactions
where "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'

すごいですね、Pooly2 に費やされた ETH の合計額が確認できるようになりました。 3 つの Pooly NFT スマート コントラクトすべての合計支出を取得したいため、他のスマート コントラクトに関する詳細を含めるためにさらに 2 行を追加する必要があります。

select SUM("value"/1e18) from ethereum.transactions
where "to" = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
or "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
or "to" = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523'

画像の説明

最終出力

「or」コマンドは「where」コマンドと連携して機能し、「to」列の値をフィルタリングするときに、最初、2 番目、または 3 番目の値が見つかった場合にその行を考慮するように指定します。

3 つの Pooly 契約すべてに合計 773.7 ETH が費やされたことがわかります。驚くべきことだ! Pooly の Web サイトにアクセスして、それが正しいかどうかを確認してみましょう。

私たちの出力をPooly NFTページの公式データと比較してください。資金調達目標を達成しました - おめでとうございます!

クエリが完了したので、後でダッシュボードに表示するためにカウンターを設定する必要があります。クエリ結果ボックスの下で、新しいビジュアライゼーションをクリックし、表示されるドロップダウン メニューで [カウンター] をクリックします。

画像の説明

最後に、「ビジュアライゼーションの追加」をクリックします。

画像の説明

カウンターが表示され、下にスクロールすると各種設定が表示されます。お好みに合わせて設定を調整してください。

画像の説明

完了したら、(1) ダッシュボードに追加をクリックし、(2) 新しいダッシュボードを選択します。次に、(3) ダッシュボードに名前を付け、(4) [ダッシュボードを保存] をクリックします。新しいダッシュボードがダッシュボードのリストに表示されます。ここから、ビジュアライゼーションを追加したいダッシュボードで (5) [追加] をクリックします。追加されると、ラベルが「追加済み」から「追加済み」に変わります。

画像の説明

このサブメニューでダッシュボードの名前 (「Pooly NFT by 0xPhillan」) をクリックすると、トラッカーを表示するダッシュボードが表示されます。

画像の説明

ビジュアルダッシュボードを追加しました

よくやった!

すべてのクエリを設定したら、ダッシュボードの編集に戻ります。

クエリ 2: USD で調達された資金

  1. この問題を解決するには 2 つの方法があります。

  2. NFTの購入に使用されるUSD資金の現在価値を使用します

Etherscan のスマート コントラクトを見ると、776.5 ETH の大部分がスマート コントラクトから移動されており、この記事の執筆時点で 299.2 ETH が Poly NFT スマート コントラクトに残っていることがわかります。

画像の説明

Etherscan.io の Pooly1/2/3 スマート コントラクト ETH 残高

以前の Pooly Web サイトのスクリーンショットを見ると、776.5 ETH は 1,411,249 ドル (1,817 ドル/ETH) の価値があり、Pooly スマート コントラクトの所有者が USD ではなく ETH に資金を保管している可能性があることを示唆しています。

  1. 最終的に、Pooly がどちらのアプローチを取るかを言うのは難しいですが、ドル価値を計算する両方の方法は興味深いものです。

  2. 現在の価値は、資金の現在の価値を示します

購入時の価格から、購入者の予想金額がわかります。

だから…一緒に作りましょう!

クエリ 2a: 現在の ETH 価値で USD で調達された資金

まず、作成したばかりのクエリをフォークします。

画像の説明

前のクエリをフォークする

select SUM("value"/1e18) * (
       SELECT "price" FROM prices.usd
       WHERE "symbol" = 'WETH'
       AND "minute" < now() - interval '1 hours'
       ORDER BY "minute" DESC
       LIMIT 1
   )
from ethereum.transactions
where "to" = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
or "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
or "to" = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523'

次に、コードを次のように調整します。

SUM("value"/1e18) コマンドの後に乗算演算子 * と大きなコード ブロックを追加したことがわかります。

Dune では、[選択を実行] をクリックすると、クエリの特定の部分を強調表示し、その部分のみを実行できます。 (1) 括弧内の行のみを強調表示し、(2) 選択を実行してみましょう。

クエリの一部を選択すると、選択した部分のみを実行できます。

このコード ブロックを分解してみましょう。

画像の説明

  1. 前のコードの内訳

  2. Price.usd テーブルから「価格」列を選択します。

  3. 「WETH」のシンボル列をフィルターします。

  4. 過去 1 時間の時間エントリのみを確認します (これにより、クエリが大幅に高速化されます)

  5. 降順で並べ替えます (新しいものから順)

このコードをよりよく理解するために、クエリにいくつかの小さな調整を加えてみましょう。 (1) 「price」を * (すべての列を返す) に置き換え、(2) コードの行 2 ~ 5 のみを選択し、(3) 選択を実行します。

画像の説明

クエリ結果には、5 つの列を含む完全なテーブルが表示されます。まず、Etherscan.io のコントラクト アドレスを確認してみましょう。

0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

画像の説明

Etherscan.io の WETH スマート コントラクト

前の表に戻ってみましょう。

画像の説明

クエリ結果テーブル 以前のクエリ

ここには、USD に対する ETH の価値を毎分追跡する「分分」という列があります。クエリを「1 時間間隔」に制限しているため、利用可能な最新の 1 時間のデータのみが取得されます。私たちの目的では、実際に必要なのは最新のデータ入力のみであるため、このクエリを過去 1 時間に制限すると大幅に速度が向上します。たとえば、より多くの履歴データを取得するために、「1 日」、「3 日」、または「1 週間」に変更することもできます。

コードをこのセクションの冒頭で変更した内容に戻し、クエリを実行してみましょう。

画像の説明

クエリを保存

このために、再びカウンターを使用するので、下にスクロールして、(1) 前のクエリからフォークされたカウンターをクリックし、(2) データ ソースを調整し、(3) ラベルを変更します。

画像の説明

完了したら、忘れずに保存してダッシュボードに追加してください。

画像の説明

追加すると下の画像のようになります。心配しないでください。このガイドの最後で整理します。さて、見た目は気にしないでください!

画像の説明

2 番目のクエリが追加されたダッシュボード

クエリ 2b: USD で調達された資金、購入時の ETH 価値

もう一度、前のクエリをフォークして、次のクエリの準備をしましょう。

画像の説明

フォークされたコードから、次のことを実行します。

with poolyTransactions as
(
select
   block_time,
   value/1e18 as value_eth
from ethereum.transactions
where "to" = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
or "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
or "to" = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523'
)
select
sum(value_eth * price)
from poolyTransactions tx
left join
   (select minute, price from prices.usd
             where symbol = 'WETH' and minute > '2022-05-01')
             as prices on date_trunc('minute', block_time) = minute

画像の説明

NFT の購入時に ETH-USD 為替レート クエリを使用する

このコードを 3 つの部分に分割しましょう。

画像の説明

クエリを 3 つの部分に分割します

セクション 1

ここで、参照する最初のテーブルを作成します。ここで行ったことは、ethereum.transactions テーブルからの block_time と value_eth を保持する「poolyTransactions」と呼ぶ補助テーブルを作成することです (wei の値は 10^18 で除算されて ETH に変換されます。それにカスタムのテーブルを与えます)名前)。このテーブルでは、既知の 3 つの Pooly アドレスをフィルター処理します。

  • ここではそれを一行ずつ説明します。

  • 行 1: poolyTransaction を次のように使用します - 次の属性を持つ「poolyTransaction」という名前のセカンダリ テーブルを定義します

  • 行 3 ~ 11: ethereum.transcations テーブルに含める列とフィルターを選択します

5 行目: value/1e18 as value_eth - ここでは、他の計算を行う代わりにセクション 2 で直接参照できるように、列の名前を「value_eth」に変更します。

第2章

ここで出力テーブルを作成します。セクション 1 で作成した補助テーブル poolyTransactions からテーブルを構築していますが、まだ定義していない「price」という列も参照していることがわかります。価格は実際には 19 行目以降でのみ定義されます。これが可能になるのは、セクション 3 で、price.usd テーブルからの出力を使用して poolyTransactions を結合したためです。したがって、基本的には、補助テーブル poolyTransactions と、price.usd から構築したテーブルを使用して、テーブルの次のセクションを作成します。

セクション 3

  • ここで、別のテーブルと結合するテーブルを定義します。 「left join」キーワードを使用すると、次のことが可能になります。

  • 行 18: left join - 最初のテーブル (左側のテーブル) を別のテーブル (右側のテーブル) と結合することを示すために使用されるキーワード。これは、セクション 1 で定義した最初のテーブルがベース テーブルとして機能することを意味します。

  • 行 19 ~ 20: ここでは、price.usd から作成するテーブルを定義します。 20 行目では、期間を「2022-05-01」に制限しています。これは、Pooly スマート コントラクトが 5 月にのみデプロイされるためです。そのため、より短い期間に制限すると、データのクエリのプロセスが大幅に高速化される可能性があります。

  • 行 22: on data_trunc(' minutes', block_time) = minutes – これは、補助テーブル (セクション 1) と価格テーブル (セクション 3 の 19 ~ 20 行目) を結合する行です。ここで話しているのは、セカンダリテーブルから列「block_time」を取得し、それを分のみに切り捨てること、つまり、分ではない他のデータ(秒、ミリ秒など)をすべて削除することです。 Price.usd テーブルはすでに分単位で切り捨てられているため、ここでさらに変換する必要はありません。次に、prices.usd の分の列が補助テーブルの分の列と照合され、price.usd の正しい価格が poolyTransactions の対応する分のタイムスタンプに割り当てられます。

画像の説明

3 番目のセクションをよりわかりやすく視覚化するために、セクションを再編成して理解しやすくしました。

画像の説明

接続コマンドの各ステップの視覚化

(1) poolyTransactions テーブルを作成し、(2) SQL にそれを別のテーブルと結合するよう指示し、(3) それをprices.usd テーブルの minutes 列とprice 列として定義します。次に、(4) マッピング変数として時間を分単位で使用して、作成したこの Price.usd テーブルを左側のテーブル poolyTransactions に結合します。テーブルを結合するには、両方のテーブルにまったく同じエントリが必要です。block_time 変数を分に切り捨てると、2 つのテーブル間に一致する分が作成されます。これにより、(5) poolyTransactions テーブルが更新され、対応する日付と一致する価格値を持つ価格列が追加されます。

次にカウンターを追加し、保存してダッシュボードに追加します。

カウンタの視覚化をクエリに追加する

カウンター視覚化のセットアップとダッシュボードへの追加

画像の説明

カウンターの視覚化がダッシュボードに追加されました

クエリ 3: サポーターの総数

これを行うには、まず最初のクエリを開いてフォークし、このステップも保存してください。

画像の説明

ここでは、最初の行を変更するだけです。

select COUNT(DISTINCT "from") from ethereum.transactions
where "to" = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
or "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
or "to" = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523'

画像の説明

COUNT 変数はすべてのトランザクションをカウントしますが、DISTINCT キーワードは、一意の各エントリが 1 回だけカウントされるようにします。結果として得られたのは 4,660 人のユニークな支援者でした。これを Pooly Web サイトのユニークなサポーターと比較すると、かなり近いことがわかります。

画像の説明

不十分なライブサポーターデータ

最後に、視覚化カウンターを変更し、ダッシュボードに再度追加します。

カウンターの視覚化設定を調整し、ダッシュボードに追加します

画像の説明

ダッシュボードにカウンターが追加されました

クエリ 4a: erc721 を使用したリーダーボード、概要

次に、アドレス、各アドレスで購入された NFT の数、および合計 ETH を降順で構成するリーダーボードを構築しましょう。

リーダーボードを表示するには、3 つの情報が必要です。最初は購入者の住所、次に購入したNFTの量、最後にすべてのNFTを購入するために費やされたETHの量です。

画像の説明

貧弱なリーダーボード列

これは次のクエリで行います。

with poolyTransactions as
(
select
   "from",
   hash,
   value/1e18 as value_eth
from ethereum.transactions
where "to" = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
or "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
or "to" = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523'
)
select
"from", nfts_purchased, value_eth
from poolyTransactions
left join
   (Select evt_tx_hash, COUNT("tokenId") as nfts_purchased
       From erc721."ERC721_evt_Transfer"
       Where (contract_address = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
       or contract_address = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
       or contract_address = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523')
       and "from" = '\x0000000000000000000000000000000000000000'
       group by 1)
       as nfts
       on evt_tx_hash = hash
ORDER BY 3 desc

画像の説明

貧弱なリーダーボード表

これは、「購入時の ETH 価値を含む USD での資金調達」のクエリと非常に似ていることがわかります。これは、同じアプローチを使用しているためです。まず、poolyTransactions テーブルでトランザクション データを収集し、次に最初の 2 つのテーブルを残します。 - 共通のマッピング値があります。

ここで、2 番目のテーブルには erc721 を使用します。「ERC721_evt_Transfer」テーブルは、イーサリアム上のすべての NFT 転送を追跡する、Dune によって維持されるダイジェストです。データセット ブラウザを使用する場合は、「erc721」と入力します。 「ERC721_evt_Transfer」までスクロールすると、その特定のテーブルに含まれるすべてのものが表示されます。 2 番目のテーブルのコマンドを強調表示して、出力を確認することもできます。

フィルターの定義方法が少し特殊であることにも気づくでしょう。最初の 3 つのフィルターは括弧で囲まれ、最後のフィルターは括弧の外側にあります。

画像の説明

SQL で算術コマンドを実行する場合と同様に、括弧は計算やフィルター コマンドの順序を決定します。最初の 3 つのステートメントを囲まなかった場合、and 条件は最後のフィルター設定にのみ適用されます。

画像の説明

括弧なしの評価

null アドレスからのフィルターを前のフィルターのすべての結果に適用したいため、括弧を追加する必要があります。

最後に、「COUNT」コマンドを使用しているため、どの列でカウントするか (つまり、カウントをどの変数に集計するか) を指定する必要があります。これを行うには、「group by」コマンドを使用して、「tokenId」のカウントをテーブルの最初の列である「evt_tx_hash」にグループ化することを示します。"ERC721_evt_Transfer "前述したように、2 番目のテーブルをテーブルにマッピングするには共通のマッピング値が必要です。ここでは、トランザクション ハッシュを使用して、トランザクションごとに購入された NFT の量を poolyTransactions テーブルにマッピングします。今回はトランザクション ハッシュも要求します。したがって、最終的には erc721 になります。"nfts"テーブル (名前を付けました)

) は、poolyTransactions テーブルにマップされます。このテーブルには、pooly を購入するためのトランザクションのみが含まれます。

最後に、Dune に「ORDER BY 3 desc」を指示します。これは、出力テーブルの 3 番目の列が降順である必要があることを意味します。

画像の説明

素晴らしい!リーダーボードが完成しました。これを Pooly NFT Web サイトのリーダーボードと比較してみましょう。

画像の説明

Dune クエリ リーダーボードと Pooly ウェブサイト リーダーボードを比較する

すべての数値が同じというわけではありませんが、このリストから、一部のアドレス、購入した NFT、および使用された合計 ETH が同じ数値であることがわかります。これもまた、Dune とリアルタイムのブロックチェーン データの間の同期タイミングの問題であり、心配する必要はありません。

忘れずにクエリを保存し、ダッシュボードに追加してください。

クエリ 4b: poolysupporter を使用したリーダーボード デコード テーブル

with poolyTransactions as
(
select
   "from",
   hash,
   value/1e18 as value_eth
from ethereum.transactions
where "to" = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
or "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
or "to" = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523'
)
select
"from", nfts_purchased, value_eth
from poolyTransactions
left join
   (Select call_tx_hash, "_numberOfTokens" as nfts_purchased
       From poolysupporters."PoolyNFT_call_mintNFT"
       where contract_address = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
       or contract_address = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
       or contract_address = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523'
       )
       as nfts
       on call_tx_hash = hash
ORDER BY 3 desc

この方法は上記と同じですが、このテーブルを使用すると、erc721 からのトランザクションを決定するために空のアドレスを使用する代わりに、mintNFT 関数を呼び出すすべてのトランザクション ハッシュを直接返すことができる点が異なります。 「ERC721_evt_Transfer」テーブルはミント トランザクションです。

画像の説明

プールサポーターを使用してください。 erc721の代わりに

poolysupporter データセットを使用すると、特定のコントラクト呼び出しを参照できるため、より具体的で詳細なクエリを実行できます。

2 つのテーブルの結果を比較して、何も問題がないことを確認してみましょう。

ご覧のとおり、出力は同じです。

忘れずにクエリを保存し、ダッシュボードに追加してください。

クエリ 4 の別のバージョンでは、poolysupporter 関数を使用します。データセット エクスプローラーで pooly を検索すると、「PoolyNFT_call_maxNFT」という関数も表示されるのを見たことがあるかもしれません。

画像の説明

この関数呼び出しを使用して、最大ミントされた NFT を直接取得できると結論付けることができます。

画像の説明

残念ながら、これは不可能です。この関数は「読み取り」関数であるため、この関数がいつ呼び出されたかを示すオンチェーン記録はありません。以下のイーサスキャンを参照してください。

画像の説明

maxNFT は読み取り関数であり、ブロックチェーンに記録を残しません。

代わりに、スマート コントラクトごとに maxNFT データを手動で入力する必要があります。

with poolyContracts as
(
Select  contract_address,
       COUNT("tokenId") as nfts_purchased
           From erc721."ERC721_evt_Transfer"
           Where (contract_address = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
           or contract_address = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
           or contract_address = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523')
           and "from" = '\x0000000000000000000000000000000000000000'
           group by 1
)
select
   CASE contract_address
       WHEN '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed' then 'Pooly_Supporter'
       WHEN '\x3545192b340F50d77403DC0A64cf2b32F03d00A9' then 'Pooly_Lawyer'
       WHEN '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523' then 'Pooly_Judge'
       END as NFT_name,
   nfts_purchased,
   CASE maxNFT_Supply
       WHEN '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed' then 10000
       WHEN '\x3545192b340F50d77403DC0A64cf2b32F03d00A9' then 100
       WHEN '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523' then 10
       END as NFT_Supply,
   CASE maxNFT_Supply
       WHEN '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed' then 100-(nfts_purchased/10000.0*100)
       WHEN '\x3545192b340F50d77403DC0A64cf2b32F03d00A9' then 100-(nfts_purchased/1000.0*100)
       WHEN '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523' then 100-(nfts_purchased/10.0*100)
       END as percent_supply_remaining
from poolyContracts
left join
   (
   Select  contract_address as maxNFT_Supply
           From erc721."ERC721_evt_Transfer"
           Where (contract_address = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
           or contract_address = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
           or contract_address = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523')
           and "from" = '\x0000000000000000000000000000000000000000'
           group by 1
   )
   as maxNFT
   on maxNFT_Supply = contract_address
   
ORDER BY 3 desc

画像の説明

NFT供給不足に関するお問い合わせ

ここで少し創造性を発揮する必要があります。 SQL で特定のテーブル エントリに手動で数値を追加するのは大変な作業です。読みやすいテーブルを残すために、いくつかのトリックを適用する必要がありました。

2 番目のテーブルを使用する理由は、SQL では 1 つのクエリで列を 2 回呼び出すことができないためです。実際には、列を複数回呼び出し、各列の呼び出しを個別に変換する必要があります。ただし、結合テーブルを使用すると、2 番目のテーブルの列を複数回呼び出すことができるため、必要な列の特定の行に対して目的の出力を作成できます。

画像の説明

上記のクエリの内訳

わかりやすくするために、このクエリを 4 つの部分に分割しましょう。

順番に注意してください! 1、3、2、4!

このセクションでは、「poolyContracts」というテーブルを定義します。このテーブルでは、3 つの Pooly コントラクト アドレスの空のアドレスからすべての個別の tokenId をカウントします。したがって、erc721.「ERC721_evt_Transfer」テーブルを使用して作成された NFT のみが含まれます。次に、それらを最初の列でグループ化し、各プールのスマート コントラクトのミントされた NFT を返します。

画像の説明

poolyContracts テーブル

このコード ブロックでは、クエリで 3 つのコントラクト アドレスのそれぞれのみを表示するように強制します。これを行うには、最初の列の一意のエントリによって結果をグループ化する「group by 1」コマンドを使用します。

画像の説明

group by コマンドを使用しない場合、クエリはこれらのコントラクト アドレスに関連するすべての転送イベントを返しますが、必要なのはそれぞれ 1 回だけ発生することです。その理由は次のセクションで説明します。

画像の説明

2 番目のテーブルは、「group by 1」コマンドを使用せずに、契約アドレスの長いリストを返します。

また、このテーブルを poolyContracts テーブル内のどの列と結合するかを定義できるように、contract_address 列の名前を maxNFT_Supply に変更しました。

セクション 3

ここで魔法が起こります。

  • このセクションでは、結合テーブルから列を呼び出すことができるようになりました。私たちはそれを次のように呼んでいます:

  • nfts_purchased

  • maxNFT_Supply

  • maxNFT_Supply

契約住所

次に、列 1、3、および 4 に CASE WHEN 句が埋め込まれていることがわかります。作成した最初の 2 つのテーブルには、スマート コントラクトごとに一意の行が 1 つしかないため、CASE WHEN ステートメントを使用して、特定のスマート コントラクト アドレスが発生するかどうか (3 つのオプションのいずれか)、Location が別の値を返すかどうかを指定することはできません。

画像の説明

nft_supply によってソートされていない結果の完全な表

ここに最初の列が表示されます。クエリ エディターに、各スマート コントラクト アドレスを対応する NFT の名前に置き換えるよう指示しています。

3 番目の列では、Pooly Web サイトにリストされている既知の最大数の NFT に置き換えます。

4 番目の列では、式を使用して残りの NFT 供給の割合を計算します。これらのステートメントでは、算術演算に使用される少なくとも 1 つの数値に小数点以下の桁が含まれている必要があります。これが含まれていない場合、SQL クエリは整数を返すものとして解釈され、これらの計算では小数点を取得できないことになります。 「.0」を含めることで、この計算で 10 進数を返すようにサーバーに指示します。

最後に、出力を 3 列目で降順 (最大から最小へ) に並べ替えることを示します。

画像の説明

このテーブルも完成しました。クエリを保存し、テーブルに必要な変更を加えて、ダッシュボードに追加します。

画像の説明

ダッシュボードにテーブルを追加する

最後のクエリでは、NFT 販売を通じて調達された ETH の量を長期にわたって示す時系列グラフを作成します。

select
   block_time as time,
   sum(value/1e18) over (order by date_trunc('minute', block_time) asc) as cumu_value_eth
from ethereum.transactions
where ("to" = '\x90B3832e2F2aDe2FE382a911805B6933C056D6ed'
or "to" = '\x3545192b340F50d77403DC0A64cf2b32F03d00A9'
or "to" = '\x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523')
and date_trunc('day', block_time) < '2022-06-25’

AllRcode重构
作者文库