必讀「保姆級教程」:如何用Dune分析區塊鏈數據
AllRcode重构
2022-10-04 04:51
本文约20487字,阅读全文需要约82分钟
100張圖手把手教你用Dune分析區塊鏈數據。

原文作者:0xPhillan

原文作者:0xPhillan

原文作者:0xPhillan

原文作者:0xPhillan原文來源:web3edge原文翻譯:老雅痞

Dune 可能是目前大眾可以使用的最強大的區塊鏈數據分析工具,而且最棒的是:

免費!

使用Dune,通過公共數據庫你可以近乎實時地訪問區塊鏈數據,可以使用SQL 進行查詢。

這是很強大的能量。

  • Dune 在將區塊鏈數據添加到數據庫之前,會對其進行解碼,這意味著你不必自己上手搞明白字節碼。相反,你可以使用Dune 的瀏覽器來瀏覽數據集、特定的智能合約、事件或調用!

  • Dune最近發布了V2 引擎,將性能提高了10 倍,現在就是你學習如何使用Dune 的時候了。

  • 在本指南中,你將學到:

第1 部分:Dune 界面

讓我們開始吧!

一級標題

一級標題

  • 儀錶盤

  • 查詢

  • 分叉

  • 分叉

  • 分叉

  • 分叉

查詢編輯器

  • 數據集瀏覽器和數據分類

  • 保存你的分叉查詢

  • 第2 部分:構建你的第一個查詢

決定建立哪些查詢

尋找正確的信息

準備在Dune中建立你的第一個查詢

查詢1:以ETH形式籌集的資金

查詢2:以美元籌集的資金

查詢2a: 以當前ETH價值計算的美元籌款

查詢2b: 以購買時的ETH價值計算的美元籌款資金

查詢3: 支持者總人數

查詢4:

查詢4b:使用poolysupporter的排行榜。解碼表

正文

結束

二級標題

二級標題

二級標題

第1 部分:Dune 和功能概述

當你第一次打開Dune.com 網站時,你會看到下面的窗口。此窗口頂部有一個視圖更改器,可讓你循環瀏覽儀表板、查詢和嚮導,然後是詳細視圖區域,你可以在其中查看左側的儀表板、查詢和嚮導(用戶)列表以及一些搜索- 右側的相關設置。

儀表板

如果你還記得,我提到儀表板是查詢的集合。如果你單擊任何一個儀表板元素的標題,你將被帶到該圖表的SQL 查詢:

圖片描述

圖片描述

圖片描述

如果想將整個儀表板或僅圖表的查詢保存到自己的帳戶,可以點擊右上角的“Fork”,分叉屏幕上的所有內容都將復製到一個新窗口,可以在其中進行編輯,將視圖保存到你的帳戶。

圖片描述

圖片描述

圖片描述

以太坊價格查詢

  1. 讓我們分叉以太坊價格圖表!在查詢上按“Fork”後,你將被帶到查詢編輯器,之前的代碼已經復制進去!

  2. 查詢編輯器

  3. 讓我在這裡向你介紹各種屏幕上的元素:

  4. 查詢位置和名稱——點擊保存後可以更改名稱!

  5. 數據集瀏覽器- 搜索特定數據集

  6. 查詢窗口- 在此處輸入你的SQL 查詢

  7. 保存- 保存你的(分叉的)查詢!

圖片描述

圖片描述

圖片描述

  1. Dune 查詢編輯器概述

  2. 數據集瀏覽器和數據類別

  3. 讓我們仔細看看數據集瀏覽器。數據集瀏覽器中有六個功能區域:

  4. 鍊式選擇

  5. 數據集搜索

  6. 瀏覽社區提供的數據

圖片描述

圖片描述

在數據集選擇中,你可以選擇想要解析的鏈。選擇“Dune Engine V2 (Beta)”可以讓你使用Dune 的最新增強功能,其中包括多鏈查詢和10 倍的性能提升。

圖片描述

如果你選擇另一個鏈,類別選擇(上圖中的第3-6 項)將消失,而你將看到可以與之交互的合約調用和事件的列表。

圖片描述

圖片描述

搜索

注意:Dune Engine V2 和舊的搜索功能以不同的方式返回結果。舊的搜索返回所有結果的列表,而Dune Engine V2 返回一個嵌套的結果列表。我們將使用V2 引擎!

圖片描述

圖片描述

如果點擊原始區塊鏈數據,你可以在嵌套數據結構中輕鬆找到Dune 支持的各種區塊鏈的查詢,可以首先選擇原始表,然後從那裡選擇你想要進一步調查的特定表列。在每個嵌套級別中,通過選擇,你還可以對正在尋找的特定搜索結果進行過濾。

圖片描述

圖片描述

圖片描述

Dune Engine V2(測試版)原始區塊鏈數據概述

解碼項目

Dune Engine V2(測試版)解碼項目概述

摘要

摘要

摘要

  • 摘要

  • 摘要可以被認為是連接和組合各種查詢和數據塊的,以形成唯一表格的自定義表。摘要可幫助用戶更輕鬆地查詢他們正在尋找的特定數據,而無需手動組合各種數據。

部門摘要:特定部門的數據

Dune Engine V2(測試版)摘要概述

社區

社區

你可能想知道為什麼社區部分只有一個條目(“flashbots”)——那是因為Dune Engine V2 剛剛發布!隨著時間的推移,我們可以期待看到越來越多受信任的社區成員構建的社區數據集。

圖片描述

圖片描述

在下圖中,你可以看到自Dune Engine V2 發布以來,Dune 中數據如何匯總的摘要:四個主要數據類別是原始區塊鏈數據、解碼項目、摘要和社區,它們以表格的形式保存了各種區塊鏈的數據,可以保存各種數據類型。

圖片描述

圖片描述

讓我們先保存這個查詢。點擊保存後,會發生一些事情。首先,要為你的查詢命名一個名字。

圖片描述

圖片描述

(1) 查詢位置和名稱已更新,並且(2) 你的查詢正在運行。這意味著Dune 正在從他們的數據庫中獲取最新數據,該數據庫會定期使用來自各種區塊鏈的最新數據進行更新。查詢完成運行後,你將看到查詢結果(3)。

圖片描述

從這裡,如果你單擊(1) “查詢結果”、“折線圖”或“新可視化”中的任何一個,(2) 結果/可視化框將與(3) 顯示在其下方的選擇設置一起更新。在這裡,還有一個“添加到儀表板”按鈕,可以快速將你的查詢結果或可視化,添加到新的或現有的儀表板——就像之前@hildobby 的以太坊儀表板一樣!

圖片描述

如果你點擊(1) 右上角的圓圈,然後點擊(2) “我的查詢”,將打開你帳戶的查詢列表。

圖片描述

查詢列表包括你曾經保存在帳戶中的所有查詢。在下面的頂部屏幕截圖中,我們可以看到創建的最新查詢:

圖片描述

圖片描述

圖片描述

讓我們動手並構建一個儀表板——一個查詢和可視化的集合——從頭開始,不走分叉這條路。這部分將教你在哪裡可以找到正確的區塊鏈詳細信息以查找你的特定項目,並教你SQL 的基礎知識。

一級標題

一級標題

  1. 一級標題

  2. 第2 部分:構建你的第一個查詢

但首先,我們需要決定儀表板的用途。 Pool Together DeFi 協議的Pooly NFT 是第一步。

圖片描述

如果我們在Dune 上搜索“Pooly”,果然可以找到一些由社區創建的Pooly NFT 追踪器。

圖片描述

我們可以單擊@0xbills創建的Pooly 儀表板之一,然後單擊“Fork”開始工作……

圖片描述

圖片描述

圖片描述

但是,如果我們從頭開始構建它,我們將學習如何成為區塊鏈偵探的同時,學習一些SQL!因此,需要從頭開始構建我們自己的查詢。

Pooly NFT 排行榜

Pooly NFT 排行榜

圖片描述

圖片描述

  • 圖片描述

  • Pooly NFT 鑄幣廠選項和供應

  • 我們可以看到:

  • 籌集的資金與以ETH 計價的資金目標

  • 籌集的資金與以美元計價的資金目標

支持者總數(購買Pooly 的唯一地址)

  • 排行榜包括地址、每個地址購買的NFT 數量以及按降序排列的總ETH

三種NFT 類型中的每一種的最大供應量和剩餘供應量

是不是超級棒!但這些只是時間的快照。讓我們也給自己另一個挑戰:

製作隨時間上升的ETH 時間序列圖

  • 就目前而言,我們無法以與Pooly 網站相同的方式構建視圖,但我們可以捕獲相同數量的數據(甚至更多!)來構建我們的儀表板。

  • 尋找正確的信息

  • 在我們開始使用Dune 之前,我們需要找到正確的信息。從網站上,我們可以看出PoolTogether 正在銷售三套NFT:

支持者– 9 個隨機收藏品中的1 個,價值0.1 ETH

讓我們前往Etherscan,看看是否能找到與Pooly 相關的智能合約。打開Etherscan.io後,鍵入“Pooly”以查看這些智能合約的所有者是否在Etherscan 上註冊了它們。

圖片描述

圖片描述

打開三個集合中的每一個,並通過單擊鼠標懸停在該地址上時出現的複製圖標,來複製智能合約地址。在頁面底部我們還可以看到最近的所有交易,這將有助於以後的故障排除。

圖片描述

圖片描述

我們將需要這些合約地址從Dune 中提取正確的數據,它們構成了我們所有查詢的基礎:

0x90B3832e2F2aDe2FE382a911805B6933C056D6ed

1.0 ETH Pooly Lawyer:

0x3545192b340F50d77403DC0A64cf2b32F03d00A9

0.1 ETH Pooly 支持者:

0x5663e3E096f1743e77B8F71b5DE0CF9Dfd058523

75 ETH Pooly 法官:

首先,導航到dune.com,然後單擊屏幕右上角的“新查詢”。

圖片描述

這將打開查詢編輯器,我們就可以開始進行查詢工作了!

圖片描述

圖片描述

圖片描述

新的和未觸及的新查詢窗口

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

查詢1:以ETH 籌集的資金

  • 首先,在左上角從“7. Dune引擎V2(測試版)”改為“1. 以太坊”。 Pooly 在以太坊上,因此我們只需要以太坊數據來進行此查詢。另外,“1. 以太坊”比剛剛進入測試階段的Dune Engine V2 更成熟。

  • 對於我們的第一個查詢,我們將構建一個計數器,顯示以ETH 計價的募集資金。為此,請將以下代碼複製到Dune 的查詢字段中,然後按“運行”(或CTRL+Enter):

  • 上面的代碼是一個SQL 查詢,它解析Dune 的數據庫以獲取我們請求的特定數據。你可以將Dune 的數據庫想像為各種表的集合,每個表都包含你可能想要提取的特定信息。使用SQL,你可以實現:

  • 指定你想要的數據(表中的哪一列)

是否要轉換該數據

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

你會得到一個包含很多信息的大表:

圖片描述

現在讓我們看一下SQL 代碼:

圖片描述

圖片描述
圖片描述

你無需運行查詢即可查看表中的列。數據瀏覽器讓你通過其漂亮的搜索功能探索各種表頭:

圖片描述

圖片描述

圖片描述

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

現在我們只有一個“值”列,而不是我們之前看到的很多:

圖片描述

圖片描述

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

圖片描述

返回“值”列中的所有條目

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

太棒了,我們現在可以看到在Pooly2 上花費的ETH 總數!由於我們想要獲得所有三個Pooly NFT 智能合約的總花費,我們需要再添加兩行以包含有關其他智能合約的詳細信息:

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

圖片描述

圖片描述

圖片描述

最終輸出

“ or ”命令與“ where ”命令協同工作,並指定在過濾“to”列中的值時,如果找到第一個值或第二個值或第三個值,則應考慮該行。

現在我們的查詢已經完成,我們需要設置一個計數器以便稍後在我們的儀表板上顯示它。在查詢結果框下方,單擊新的可視化,然後在出現的下拉菜單中單擊“計數器”。

圖片描述

最後,單擊“添加可視化”:

圖片描述

將出現一個計數器,如果向下滾動,你會看到各種設置。只需根據自己的喜好調整設置。

圖片描述

完成後,單擊(1) “添加到儀表板”並選擇(2) “新儀表板”。然後(3) 為你的儀表板命名並(4) 單擊“保存儀表板”。新儀表板將出現在你的儀表板列表中。從這裡單擊(5) 你希望將可視化添加到的儀表板上的“添加”。添加後,標籤將從“添加add”變為“已添加added”。

圖片描述

如果你在此子菜單中單擊儀表板的名稱(“Pooly NFT by 0xPhillan”),你將被帶到顯示我們跟踪器的儀表板。

圖片描述

圖片描述

圖片描述

添加了可視化的儀表板

幹得漂亮!

  1. 一旦我們完成了所有查詢的設置,我們將回到編輯我們的儀表板。

  2. 查詢2:以美元籌集的資金

如果我們查看Etherscan 上的智能合約,我們可以看到大部分776.5 ETH 已經從智能合約中移出,截至撰寫本文時,Poly NFT 智能合約中還剩下299.2 ETH。

圖片描述

圖片描述

圖片描述

  1. Etherscan.io 上的Pooly1/2/3 智能合約ETH 餘額

  2. 如果我們查看之前的Pooly 網站截圖,776.5 ETH 的價值為1,411,249 美元(1,817 美元/ETH),這暗示著Pooly 智能合約所有者可能將資金保留為ETH,而不是美元。

最終,很難說Pooly 採用哪種方法,但兩種計算美元價值的方法都很有趣:

當前值告訴我們資金現在的價值

購買時的價值告訴我們購買者的預期美元金額

首先,fork 我們剛剛創建的查詢:

圖片描述

圖片描述

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)命令之後添加了一個乘法運算符*和一個大代碼塊。

讓我們分解這個代碼塊:

圖片描述

  1. 圖片描述

  2. 圖片描述

  3. 先前代碼的細分

  4. 過濾“WETH”的符號列

  5. 按降序排列(最新的在前)

為了更好地理解這段代碼,讓我們對查詢進行一些小的調整。 (1) 將“price”替換為*(返回所有列)和(2) 僅選擇第2 到5 行的代碼,然後(3) 運行選擇:

圖片描述

在查詢結果中,你將看到由五列組成的完整表。首先,讓我們檢查一下Etherscan.io 中的合約地址:

0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

圖片描述

圖片描述

讓我們將注意力轉移回上一張表:

圖片描述

圖片描述

圖片描述

讓我們將我們的代碼恢復到我們在本節開頭更改的內容並運行查詢:

圖片描述

圖片描述

為此,我們將再次使用計數器,因此向下滾動並(1)單擊從我們之前的查詢分叉的計數器,(2)調整數據源和(3)更改標籤。

圖片描述

完成後,記得保存並添加到我們的儀表板:

圖片描述

添加後,它將如下圖所示。別擔心,在本指南的最後,我們會清理它。現在,不要擔心外觀!

圖片描述

圖片描述

圖片描述

同樣,讓我們先fork 之前的查詢,為我們的下一個查詢做準備:

圖片描述

從分叉的代碼中,我們要進行以下操作:

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

圖片描述

圖片描述

讓我們把這段代碼分成三個部分:

圖片描述

圖片描述

圖片描述

將查詢分為三個部分

  • 第1 節

  • 在這裡,我們構建了我們將引用的第一個表。我們在這裡所做的是創建一個我們稱之為“poolyTransactions”的輔助表,它將保存來自ethereum.transactions 表的block_time 和value_eth(以wei 為單位的值除以10^18 以轉換為ETH,我們給它一個自定義名稱)。對於這個表,我們過濾了我們知道的三個Pooly 地址。

  • 這裡逐行解釋:

第1 行:使用poolyTransaction 作為- 定義名為“poolyTransaction”的輔助表具有以下屬性

第3-11 行:選擇要包含在ethereum.transcations 表中的列和過濾器

第5 行:value/1e18 as value_eth——這裡我們將列重命名為“value_eth”,以便我們可以在第2 節中直接引用它,而不是進行其他計算

第2 節

  • 這是我們創建輸出表的地方。你會注意到我們正在從poolyTransactions 構建一個表,這是我們在第1 節中創建的輔助表,但我們還引用了一個我們尚未定義的名為“price”的列。價格實際上只在第19 行後面定義!這是可能的,因為我們在第3 節中將poolyTransactions 與price.usd 表中的某些輸出連接起來。所以本質上,我們正在使用我們的輔助表poolyTransactions 以及我們從price.usd 中構建的表,創建一個表的下一節。

  • 第3 節

  • 這是我們定義一個要與另一個表連接的表的地方。 “left join”關鍵字允許我們這樣做:

  • 第22 行:on data_trunc('minute', block_time) = minute – 這是將我們的輔助表(第1 節)與價格表(第3 節第19-20 行)結合起來的行。這裡所說的是從我們的輔助表中取出列“block_time”,並將其截斷為僅按照分鐘,即刪除所有其他不是分鐘的數據(例如秒、毫秒等)。 price.usd 表已經被截斷為分鐘,所以這裡不需要進一步的轉換。然後將prices.usd中的分鐘列與我們輔助表中的分鐘列進行匹配,從而將正確的價格從prices.usd分配到poolyTransactions中對應的分鐘時間戳。

圖片描述

為了更好地可視化第三部分,我重新組織了各個部分以使其更易於理解:

圖片描述

圖片描述

圖片描述

(1) 我們創建poolyTransactions 表,然後(2) 我們告訴SQL 將它與另一個表連接起來,(3) 我們將它定義為來自prices.usd 表的分鐘和價格列。然後(4)將我們創建的這個price.usd 表連接到左表poolyTransactions 上,使用以分鐘為單位的時間作為映射變量。要連接表,兩個表必須具有完全相同的條目,如果我們將block_time 變量截斷為分鐘,我們會在兩個表之間創建匹配的分鐘。通過這樣做,(5) poolyTransactions 表被更新以包括價格列,價格值與相應的日期相匹配。

圖片描述

計數器可視化設置並添加到儀表板

圖片描述

圖片描述

圖片描述

為此,讓我們首先打開我們的第一個查詢,將其分叉,記住,這一步也要保存。

圖片描述

這裡我們簡單地改變第一行:

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

圖片描述

COUNT 變量計算所有事務,而DISTINCT 關鍵字確保每個唯一條目只計算一次。我們得到的結果是4660 個獨特的支持者。如果我們將其與Pooly 網站上的獨特支持者進行比較,我們會發現他們非常接近:

圖片描述

圖片描述

Pooly 實時支持者數據

調整計數器的可視化設置並添加到儀表板

圖片描述

圖片描述

圖片描述

計數器添加到儀表板

圖片描述

圖片描述

Pooly 排行榜列

圖片描述

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

圖片描述

Pooly 排行榜表

圖片描述

Pooly 排行榜表

你還會注意到過濾器的定義方式有些特殊。前三個過濾器現在包含在括號中,而最後一個過濾器位於括號之外。

圖片描述

括號決定了計算和/或過濾器命令的順序,就像在SQL 中執行算術命令時一樣。如果我們沒有將前三個語句括起來,則and條件將僅適用於最後一個過濾器設置。

圖片描述

圖片描述

圖片描述

不使用括號時的評估"ERC721_evt_Transfer "由於我們希望將from null 地址過濾器應用於先前過濾器的所有結果,因此我們需要添加括號。"nfts"最後,由於我們使用“COUNT”命令,我們需要指定在哪一列進行計數(即,將計數匯總到哪個變量)。為此,我們使用“group by”命令表示我們要將“tokenId”的計數分組到表中的第一列,即“evt_tx_hash”。

之前提到,我們需要一個通用映射值來將第二個表映射到表。在這裡,我們使用交易哈希將每筆交易購買的NFT 數量映射到我們的poolyTransactions 表,這次我們也要求了交易哈希值。因此,最終,我們將erc721.

最後,我們告訴Dune 為“ORDER BY 3 desc”,這意味著我們輸出表的第三列應該按降序排列:

圖片描述

超棒!我們的排行榜已經完成。讓我們將其與Pooly NFT 網站上的排行榜進行比較:

圖片描述

圖片描述

圖片描述

將Dune 查詢排行榜與Pooly 網站排行榜進行比較

並非所有數字都相同,但從這個列表中我們可以看到,一些地址、購買的NFT 和總ETH 花費的數字確實相同。這又是Dune和實時區塊鏈數據之間的同步時間問題,無需擔心。

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

圖片描述

圖片描述

使用poolysupporters。而不是erc721

圖片描述

使用poolysupporters。而不是erc721

poolysupporter 數據集允許我們進行更具體和詳細的查詢,因為我們可以參考特定的合約調用。

讓我們比較兩個表的結果以確保沒有任何問題:

在查詢4 的替代版本中,我們使用了poolysupporter 函數。你可能已經看到,當你在數據集資源管理器中搜索pooly 時,你還會看到一個名為“PoolyNFT_call_maxNFT”的函數。

圖片描述

你可以得出結論,你可以使用這個函數調用來直接檢索最大鑄幣量的NFT。

圖片描述

不幸的是,這是不可能的:這個函數是一個“讀取”函數,因此在調用這個函數時沒有鏈上記錄。請參閱下面的Etherscan:

圖片描述

圖片描述

相反,我們必須手動輸入每個智能合約的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

圖片描述

圖片描述

圖片描述

第二個表的原因是在單個查詢中SQL 不允許你兩次調用列。實際上,我們需要多次調用一列,並分別轉換每一列調用。然而,連接表允許我們多次調用第二個表中的列,從而使我們能夠為我們需要的列中的特定行創建所需的輸出。

圖片描述

圖片描述

圖片描述

上述查詢的細分

圖片描述

圖片描述

poolyContracts 表

在這個代碼塊中,我們強制查詢只顯示三個合約地址中的每一個。我們通過使用“按1 分組”命令來做到這一點,即按第一列的唯一條目對結果進行分組。

圖片描述

如果沒有group by 命令,查詢將返回與這些合約地址相關的所有傳輸事件,但我們只需要每個出現一次。你將在下一節中看到原因。

圖片描述

圖片描述

圖片描述

第二個表返回一長串沒有“group by 1”命令的合約地址

此外,我們將contract_address列重命名為maxNFT_Supply,以便我們可以定義將該表與哪個列連接到poolyContracts 表中。

  • 第3 節

  • nfts_purchased

  • maxNFT_Supply

  • maxNFT_Supply

這就是魔法發生的地方。

接下來,你還會注意到第1、3 和4 列都嵌入了CASE WHEN子句。因為我們創建的前兩個表中的每一個只有一個用於每個智能合約的唯一行,所以我們不能使用CASE WHEN語句來指定是否出現特定的智能合約地址(三個選項之一),在其位置返回其他內容。

圖片描述

圖片描述

圖片描述

未按nft_supply 排序結果的完整表

你將在此處看到第一列,我們告訴查詢編輯器將每個智能合約地址替換為相應NFT 的名稱!

最後,我們指出我們希望輸出按第三列的降序(從大到小)排序。

圖片描述

這張表也做好了。保存你的查詢,對錶格進行所需的任何更改並將其添加到儀表板。

圖片描述

圖片描述

將表添加到儀表板

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重构
作者文库