Dune Analytics — 從 SparkSQL 到 DuneSQL 的辛酸血淚

王昱淮
SWF Lab
Published in
9 min readMar 30, 2023

看完這篇文章,你可以知道⋯⋯

✔️ DuneSQL 將成為唯一的引擎

✔️ Dune 可以做的兩種 NFT 持有者分析

前言

如果有在追蹤鏈上數據的人們對於 Dune 應該不會太陌生!

Dune 是一個能夠使用 SQL 語言便能抓取鏈上數據的一個平台,讓使用者可以做數據分析、簡單的資料視覺化。除了使用者自己創建的查詢外,也能看見平台上其他使用者創建的查詢,還有使用者做了許多好用的 DashBoard,讓你能掌握現在現在的趨勢!

這篇文主要將會著重於介紹 Dune 可以做的很基礎的兩種 NFT 項目分析,還有讓大家知道最近即將要拔掉的搜尋引擎(想到就想哭)。若想要了解最一開始如何使用的話,可以參考這篇去年 Lab 的文章。而我在這次的 Lab 的專案中第一次使用了 Dune,也是第一次學習 SQL 語言,目前發現在台灣也比較少有 Dune 相關的文章,所以希望這篇文可以幫助要使用 Dune 的人們!

那麼,我們就開始吧!

Contents

  • 將在未來唯一僅存的 DuneSQL
  • Dune 可以做哪些 NFT 持有者分析

將在未來唯一僅存的 DuneSQL

在 Dune 上進行查詢時,使用的引擎有許多種,可以依個人習慣、查詢目的來選擇引擎,而在我剛開始使用 Dune 的時候,我是學 SparkSQL 的語法,所以便理所當然地使用 SparkSQL 來進行查詢,而當時還有 Ethereum、DuneSQL 等其它引擎選擇,其中 DuneSQL 是 Dune 自己開發的引擎,當時他還是 Beta version 測試版。

因為當時的 Project 需要,所以我們都統一使用 SparkSQL。但是,Dune 在今年三月初宣布在今年內將會只剩下 DuneSQL 引擎,其他引擎將陸續退場,這便意味著當時我們用 SparkSQL 做的查詢,在未來若沒有改成 DuneSQL 的話,將會沒有辦法再使用。當時這個訊息實在來的非常突然,在當晚團隊便火速開始看兩者的語法差異(其實沒有差很多,都是非常細節上的不同),後來陸續把原本的 SparkSQL 引擎上的查詢搬運到 DuneSQL 上了。

在換成 DuneSQL 後,Dune 其實一直有強調這個引擎將會成為最快的引擎,因為過去用別的引擎查詢時,資料量較多時很常就需要 2 分鐘以上,剛開始換成 DuneSQL 時也確實有感受到他的迅速,但用久了其實覺得也沒有差非常多,每次按下 run 之後,依然還是跑去其他頁面做其他事再回來看跑出什麼。

講了這麼多心中的 OS,其實只是想讓大家知道未來只會剩下 DuneSQL,所以還沒轉換引擎的趕緊轉換引擎吧!

Dune 的 NFT 分析 — 與持有者相關

在讓大家知道接下來 Dune 將只留下 DuneSQL 引擎後,這裡的介紹也將會以 DuneSQL 引擎來呈現,並且將以 nft.trades 這張表作為示範。這張表上面記載了 NFT 的交易數據,如交易時間、買方地址、賣方地址、合約地址等。而 NFT 相關的表還有很多,如 nft.transfers,但本篇文將僅專注於 nft.trades 的應用,並且介紹與持有者相關的數據、圖表。

持有數排名&分佈圓餅圖

由於 nft.trades 這張表有記載著每一筆交易數據的買方、賣方,以及交易數量,因此可以使用該特性來計算個別地址的 NFT 持有數,並且再進一步做持有數排名,或是將持有數進行分類。

關於持有數排名,由於每筆資料都有 buyer 和 seller,記載著錢包地址,但直接看表的話難以看出各個持有者擁有多少張 NFT。因此,在此需要分別就 seller 和 buyer 的交易數量做處理。

在此我先建立名為 trade_detail 的子查詢,seller 部分將其數量乘以(-1),代表將 NFT 販售出去;buyer 部分將其數量保持原樣,代表購買 NFT 進來。接著再利用該子查詢地址所擁有的 NFT 數量加總,若賣出則會讓其數量 -1,買入則會 +1,再依據地址分組,便可得到各個地址所擁有的數量。

上述的步驟,以 DuneSQL 程式碼呈現如下:

with trade_detail as (
select seller as trader,
-1 * number_of_items as hold_items_count
from nft.trades
where nft_contract_address = {{nft_contract}}

union all

select buyer as trader,
number_of_items as hold_items_count
from nft.trades
where nft_contract_address = {{nft_contract}}
)

select trader,
sum(hold_items_count) as hold_items_count
from trade_detail
group by trader
order by 2 desc

以上的程式碼將會得到以下的持有者數量排名表:

GIRYPTO : FABLES 項目的持有者數量排名

根據上述的程式碼,可以再將各個持有者的數量標籤化。例如,將所有使用者分為持有 80 張以上、持有 50 張以上、持有 20 張以上等。因此,在這邊便用 case 來針對使用者的持有數量來給予數量標籤。程式碼如下:

with trade_detail as (
select seller as trader,
-1 * number_of_items as hold_items_count
from nft.trades
where nft_contract_address = {{nft_contract}}

union all

select buyer as trader,
number_of_items as hold_items_count
from nft.trades
where nft_contract_address = {{nft_contract}}
),

summ as (
select trader,
sum(hold_items_count) as hold_items_count
from trade_detail
group by trader
order by 2 desc
)

select *,
(case when hold_items_count >= 80 then 'hold 80+'
when hold_items_count >= 50 then 'hold 50+'
when hold_items_count >= 20 then 'hold 20+'
when hold_items_count >= 10 then 'hold 10'
when hold_items_count >= 5 then 'hold 5+'
when hold_items_count >= 3 then 'hold 3+'
when hold_items_count >= 2 then 'hold 2+'
else 'hold 1'
end) as hold_type
from summ

經過標籤化後,便可以計算各個組內擁有多少使用者,如以下程式碼(其中 pie 是上方程式碼將最後一個查詢命名為 pie 做的子查詢):

select distinct hold_type,
count(trader) as UsersCounts
from pie
group by 1
order by 1

以上步驟都完成後,就可以做出如下面的圓餅圖了!

GIRYPTO : FABLES 項目的持有狀況

買方與賣方數量

接下來,可以透過瞭解 NFT 項目的買方與賣方數量,來了解市場上對於該 NFT 的需求。

同樣在 nft.trades 的表中,分別取出 buyer 和 seller 的地址,並且接下來計算不重複地址的數量,最後再計算 buyer 和 seller 分別有多少人,如以下程式碼:

with buyers as (
select buyer as buyers_num,
from nft.trades
where nft_contract_address = {{nft_contract}}
),

sellers as (
select seller as sellers_num,
from nft.trades
where nft_contract_address = {{nft_contract}}
),

buyers_count as(
select count(distinct(buyers_num)) as buyers_amount
from buyers
),

seller_count as (
select count(distinct(sellers_num)) as sellers_amount
from sellers
),

summary as (
select *
from buyers_count
join seller_count on true
)

select *
from summary

接著便能使用 counter 來呈現該項目的 Buyer 與 Seller 分別有多少。

GIRYPTO : FABLES 項目的買方與賣方數量

結語

這篇文其實算是非常粗淺的讓大家知道對於持有者可以做哪些分析,但其實還有持有者還有很多值得深入分析的部分,也還有其他適合分析的目標,如交易量分析、價格分析、整體市場分析等,不過正好這次的專案事負責持有者分析的部分,就只分享相關的部分了。關於我們的 Project 可以看這裡

非常感謝你的觀看!希望有得到你預期的收穫,但如果沒有的話我會再檢討的,對於文章內容有任何疑問也歡迎留言告訴我!

最後,也非常感謝 Corn & Josephine 幫我 Review 這篇文章!

--

--